Yesky首页| 产品报价| 行情| 手机 | 数码 | 笔记本 | 台式机 | DIY硬件 | 外设 | 网络 | 数字家庭 | 评测 | 软件 | e时代 | 游戏 | 图片 | 壁纸 | 群乐 | 社区 | 博客 | 下载
您现在的位置: 天极网 > 开发频道 > 在Pocket PC上编写游戏之八
全文

在Pocket PC上编写游戏之八

2004-04-10 13:03 作者: 雷神编译 出处: vchelp 责任编辑:方舟
天极IT资讯短信服务 电脑小技巧
资费:包月5元
手机:
介绍:细处着手,巧处用功。高手和菜鸟之间的差别就是:高手什么都知道,菜鸟知道一些。电脑小技巧收集最新奇招高招,让你轻松踏上高手之路。

  导读

  或许,所有的动作类游戏都需要实现对碰撞检查。换句话说,一个游戏不能没有相撞检查或碰撞测试相对应的策略。

  检查相撞有若干种方法,发生碰撞或两个或者多个的精灵对象发生了重叠,则每个游戏会依据自己的规则给出相匹配的方法。例如,一个射击的游戏(就一个小的精灵) 需要检查是否有子弹或者武器撞到了另外的对象。 如果我们的对象很小并且正在高速的移动。我们可以使用简单的形状覆盖方法,来进行判断是否碰撞。我们只需要简单的判断是否在一个矩形区域发生了重叠。这样做不会造成视觉上的不舒服,因为人的眼睛是很容易被欺骗的。但是如果游戏是象空手道(我喜欢武将争霸;-))那种类型,那么我们需要更进行详细的检查了。因为 它的精灵很复杂而且形状较大。我们需要把角色的身体划分解成很多小的单元,手,头,腿,脚,身体,or a punch(雷神更喜欢双截棍,哈哈)。还有通常它们的移动速度不是太快。因此我们需要另外的更好一些的方法来使游戏更加有趣。

  基本的方法

  推箱子游戏: 推箱子游戏使用的技术曾经是很流行的经典的技巧,尤其是对于所有的初学者它比较容易理解。 它长时间的被用于小游戏,象Pac人(吃豆,我喜欢),经典的炸弹人,Sokoban(雷神不知)等等。主要的思路就是把游戏中的每一个事件都放到一个数组矩阵中。



<图1-游戏推箱子>

  这种方法的主要的策略是使用一个二维数组表示游戏中的所有事物。每个数组元素永远占用一个字节(0-255)。数组元素保存地图的状况。里面都是什么呢?我们用Pac-man游戏为例说明一下,我们预先规定1代表通道,2代表墙,3代表幽灵,4代表Pac-man。我们的数组在游戏中的数据看起来就象下面这样

<图2-地图表示>

00 00 00 00 01 01 01 01 01 00 00 00 00 00 00 00 00 00 00
00 00 00 00 01 00 00 02 01 00 00 00 00 00 00 00 00 00 00
00 00 00 00 01 02 00 00 01 00 00 00 00 00 00 00 00 00 00
00 00 01 01 01 03 00 00 01 01 00 00 00 00 00 00 00 00 00
00 00 01 00 00 02 02 00 00 01 00 00 00 00 00 00 00 00 00
01 01 01 00 01 00 00 00 00 01 00 00 00 01 01 01 01 01 01
01 00 00 00 01 00 00 00 00 01 01 01 01 01 00 00 03 03 01
01 00 02 00 00 02 00 00 00 00 00 00 00 00 00 00 03 03 01
01 01 01 01 01 00 01 01 01 00 00 01 00 01 01 00 03 03 01
00 00 00 00 01 00 00 00 00 00 00 01 01 01 01 01 01 01 01
00 00 00 00 01 01 01 01 01 01 01 01 00 01 00 00 00 00 00

  这种方法只适合一些经典的小游戏,因为它实际上并不对真实对象形状相撞进行检查。它只是检查每个块的状态而已。此外,游戏对象和块的尺寸应该是一样的,精灵的身体也应该尽可能的接近方形的形状。检查的算法是容易实现的,只需要检查当前的块将移动的下一块的值。给个例子Pac-man: 如果下一块的值1,说明那是一个通道,我们将原来的值是4(代表Pac-man)的块改成1,把刚才得到的值1改成4就行了。如果下一块是2意味着那是墙,我们不能移动到那里,如果是3意味着我们的pac-man英雄被幽灵抓住了。

  这种方法非常的快并且它只需要很少的处理时间。如果你想为速度不快的机器开发游戏,那这是一个不错的选择。

  遮罩图形: 它是从贴图方法发展而来的。关键技术是增加贴图的分辨率并且减小每块贴图的尺寸。这样做的代价是需要更多的内存。在屏幕上显示的效果实际上是遮罩图形和原来图片经过处理后的结果,见下图;


<图4-图形与遮罩图形>

  让我们理解起来更容易些: 我们可以使用一张图片作为遮罩图形,并且使用不同的颜色区别出我们的游戏中的不同对象。 例如,在一个射击的游戏中,背景被黑颜色代表,红颜色代表弹药,蓝颜色代表游戏者,绿颜色代表电脑的边界, 黄颜色代表地图上的障碍物。当我们改变对象在显示屏幕上的位置时,我们需要同时更新它在遮罩图形中相对应的位置。




<少许5地图和遮罩图形>

  好现在我们来看看如何检查碰撞? 我们需要按顺序和层次画出对象;首先是电脑部分,然后是游戏玩家的部分,最后是子弹。在进行碰撞检查之前,我们可以使用遮罩图形先获得对象的象素和颜色值。 例如,我们更新子弹,需要从遮罩图形得到子弹的形状包含的所有象素并且可以获得原来的颜色值。如果它与背景颜色一样,那意味着没有事情发生。如果它是红或蓝色的,那意味着子弹碰撞到了游戏或电脑对象。根据这些,我们就可以进行碰撞检测,判断出哪个对象被子弹击中。

...........................

  我们已经讲述了两种碰撞检测的方法,他们都使用的是光栅技术。让我们想象一下,如果一个游戏有一张巨大无比的地图场景,如果我们还使用上面的策略,那我们就需要一张同样巨大无比的遮罩图形。结果是需要非常多的内存。显然这不是我们希望的,怎么办?让我们在进一步学习利用向量技术来进行碰撞检测。

PtInRect(...)

  PtInRect(...) API。 这是Win32 SDK下面的一个标准的API。它可以计算出一个点(x,y)是否存在于一个矩形区域(x1,y1,x2,y2)中,它的返回值是真或假。


<图 6 点在矩形中?>

Point P(x,y) will be in Rect(x1,y1,x2,y2) area when
x >= x1 && x < = x2 && y>= y1 && y < = y2

  这种方法始终检查一个点是否在对象的范围内。在我的纸牌游戏中,使用到这个方法。可以通过它知道,我的笔尖点中的是所有长方形扑克牌中的那一张。

共2页。 1 2 :
网友关注
最新上市
编辑推荐
文章阅读排行
周排行
月排行
欢迎订阅天极网RSS聚合资讯:http://www.yesky.com/index.xml