碰撞检测又称为冲突检测,是确定精灵之间是否相互冲突的一种方法。碰撞检测用来确定精灵之间何时会发生物理的相互作用。例如,在游戏中,如果玩家精灵与小飞机精灵发生碰撞,玩家生命值将会降低。碰撞检测就是用来检测玩家与敌方(或子弹)是否发生碰撞的一种机制。在游戏设计中,有很多种方法可以处理碰撞检测。最简单的方法就是比较每个精灵的矩形边界和其他精灵的矩形边界是否交叉。这种方法效率很高,但是也有一种问题,比如并不是所有的精灵都是矩形的,当他们相互较近的错过的时候,可能会引起一定程度的错误。可能因为边角的重叠引起冲突,而实际上只是透明区域的重叠。精灵的形状越不接近矩形,就会有越多的错误类型。可以想象矩形碰撞检测是多么的简单而不够精确,除非本来使用的精灵恰恰是矩形的。对这项技术的一个改进方法就是将冲突矩形缩小,从而减少错误。这种方法使情况略有改善,但是又有可能引发其他可能的潜在错误,就是允许精灵在某些情况下出现重合而不发出冲突信号。缩小后的矩形碰撞和简单矩形碰撞一样有效,因为所做的只是比较矩形是否相交。目前最有效的碰撞检测就是根据精灵图像数据来检测碰撞(即像素检测方法),这种方法实际上不是察看精灵的透明区域是否重合而是精灵图像本身是否重合。在这种情况下,只有当精灵图像重合时,才会获得一个碰撞冲突。这种是理想的碰撞检测技术,因为其十分的精确,并且对于
任何形状的对象的相互移动都不会发生错误。
![鐭╁舰纰版挒妫¬娴嬬ず鎰忓浘](https://i-blog.csdnimg.cn/blog_migrate/5e24dc0956d11d7c3379b6e41b8c6324.png)
模拟矩形碰撞检测示意图
如果没有碰撞检测算法,在本游戏运行过程中,就会出现一种可怕的局面,虽然可以实现背景的移动,以及玩家飞机行驶的效果,而且玩家也可以控制机体的前进方向,但却会存在一个致使的缺陷——当敌方飞机被我方飞机击中时,没有任何响应,敌方飞机依旧行驶,分值没有任何增加,好像什么都没有发生一样。这都是因为没有为游戏添加碰撞检测的代码所致。碰撞检测是游戏中经常使用的一种重要算法。由于检测游戏中的两物体是否发生表面接触。例如子弹是否命中敌机,敌机与玩家飞机是否相撞等。只有进行了碰撞检测才有可能在出现上述情况后将敌机击中,并且分值有所增加等效果。
使用
MIDP API
来碰撞冲突,可以使用
Sprite
类中的一系列方法,所有这些方法都叫做
collidesWith()
。
collidesWith()
方法包括三种,第一个
collidesWith()
方法检测的是两个精灵之间的碰撞:
collidesWith(Sprite s,Boolean pixelLevel)
;
要检测一个冲突,只要在精灵上调用这个方法,并传入另一个精灵。第2个参数决定了冲突检测是否按照“像素连着像素”的方法,这就相当于图像数据检测方法。如果只是希望使用简单的矩形检测法在两个精灵之间进行检测,则可以把
false
值传递给
collidesWith
()
方法。
其余两种方法分别使用一个图像和一个平铺的图层来检测一个精灵的冲突。在使用图像的情况下,指定了图像的
XY
位置,并且,碰撞检测在图像和精灵上执行。平铺的图层和精灵相似,但是它使用多个平铺图像来创建一个大的合成图像,如使用一个平铺图层来创建一个围墙式的迷宫,然后检测它一个精灵的冲突,以确保精灵位于范围之内。
实现碰撞检测代码如下:
/*判断enemyShip是否被玩家子弹击中*/
for( int i=0;i<MAX_SHOT;i++)
{
for( int j=0;j<MAX_enemyShip;j++)
{
if((playerShot[i].isVisible()) &&
(playerShot[i].collidesWith(enemyShip[j], true)))
{
…… //碰撞处理
}
}
}
…………
//查看玩家是否与小飞机相撞
for( int i=0;i< this.MAX_SP;i++)
if(smallPlane[i].isVisible() &&
smallPlane[i].collidesWith(playerSprite, true))
{
…………
}
for( int i=0;i<MAX_SHOT;i++)
{
for( int j=0;j<MAX_enemyShip;j++)
{
if((playerShot[i].isVisible()) &&
(playerShot[i].collidesWith(enemyShip[j], true)))
{
…… //碰撞处理
}
}
}
…………
//查看玩家是否与小飞机相撞
for( int i=0;i< this.MAX_SP;i++)
if(smallPlane[i].isVisible() &&
smallPlane[i].collidesWith(playerSprite, true))
{
…………
}
本文转自 gaochaojs 51CTO博客,原文链接:http://blog.51cto.com/jncumter/187185,如需转载请自行联系原作者