碰撞检测
该文章为本站原创,如有引用,请注明出处和作者
对于游戏来说出了美丽的界面和动听的音乐外,还有一点更为重要的就是游戏中个元素的碰撞检测问题。无论是射击游戏还是RPG游戏都要使用的一种技术。关于这个技术在我们前面的讲解中也要介绍。
如 实现是男人就撑30秒的游戏中,我们为了检测子弹和主角的碰撞就使用了一种很基础的碰撞检测技术。因为在该游戏中,各元素都是方块表示的,所以我们只要检 测方块的碰撞即可。因为子弹比主角个体要小,我们这里仅以主角完全包括子弹为例,来判断两者是否碰撞,我们要判断A的X+WIDTH一定会超过B的X坐 标,并且A的y+height一定会超过B的y坐标,并且A的X一定不会超过B的X+width坐标,并且A的y一定不会超过B的y+height坐标. 相应的判断语句写作:
If((ax+awidth>bx)&&(ay+aheight>by)&&(ax<bx+bwidth)&&(ay<by+bheight))
当然这样很不精确。我们也只是将它作为一个特殊的简单的例子罢了。
现在好了,我们使用MIDP2.0的话就不在那么麻烦了。我们完全可以使用Sprite类中的collidesWith方法完成上面的工作了。下面我们详细的看一看该方法:
collidesWith主要提供三种精灵之间碰撞监测的方法,主要的函数形式有两种:
(1)collidesWith(Sprite sprite, Boolean pixedLevel)
通 过上面函数,我们可以使用两种碰撞检测方法:第一种是最不精确的,他会使用包围图像的一个方形范围进行碰撞检测。这种方法之所以,被称为最不精确的,我们 可以想象一下,一个圆形的子弹与包围他的方块在四个角上肯定有空白,但是使用这种方法进行检查碰撞,当处于下图所示位置的时候,就已经确认为碰撞了,可是 事实上区并没有碰撞。
但是这种简单的矩形检测,运行速度很快。他的使用方法就是将false作为第二个参数传递给collidesWith()方法。示例如下:
a.collidesWith( b , false );
第 二种检测方法是最精确的,原理就是通过比较两图像的像素是否相碰撞。还以上面的例子为例,它比较的仅仅是红色的两个圆形区域,不管你白色的部分是否相碰, 只要红色区域(也就是精灵的实体部分)没有相碰,碰撞就不成立。精确的方法中要付出代价的,该方法的运行速度要比前一种方法慢许多。他的使用方法就是将 true作为第二个参数传递给collidesWith()方法。示例如下:
a.collidesWith( b , true );
(2)这种的一个方法就是使用小一点的矩形,如下图所示:
这是因为要检测的有效碰撞范围还是矩形包围的区域,所以两个球可以离得近些了,当然因为有部分红色露在了框外,所以即使这部分相碰撞也不会得到碰撞的结果。但是从效果和运行速度方面综合考虑的话,还是不错的方法。关于他的使用也就是:
collidesWith( Image image , int x, int y , boolean PixelLevel)
该方法比前面的方法多了参数x,y。用来表示图像检测矿的左上点到图像(0,0)点的距离。
当然精灵也要和地图进行碰撞检测,比如人不能穿墙,台球撞倒台边要反弹等。这就需要使用另一种碰撞,就是精灵和图层的碰撞检测:
collidesWith( TiledLayer t , boolean pixelLevel )
关于这部分我们将在图层类TiledLayers部分讲述。
至于例子我就不提供了,有前面的代码修改过来应给很简单了。