《《Android游戏编程之从零开始》第四章样章》.pdf
文本预览下载声明
4.14 碰撞检测
手机游戏开发中最常用到三种检测碰撞的方式,分别是:矩形碰撞、圆形碰撞和像素碰
撞。实际上,与其说是三种碰撞检测方式倒不如说是两种,其原因会在最后介绍像素碰撞时
详细阐述。
1
4.14.1 矩形碰撞
所谓矩形碰撞就是利用两个矩形之间的位置关系来进行判断,如果一个矩形的像素在另
外一个矩形之中,或者之上都可以认为这两个矩形发生了碰撞。
如果单纯去考虑哪些情况会判定两个矩形发生碰撞,倒不如反思维考虑两个矩形之间不
发生碰撞的几种情况,这样更容易想到。其实两个矩形不发生碰撞的情况就四种,如图 4-47
所示。
图4-47 矩形不发生碰撞的四种情况
图 4-47 示意了两个矩形之间永不会发生碰撞的四种情况。下面通过一个实例项目来完
成对应的四种判定。
新建项目“RectCollision ”,游戏框架为 SurfaceView 游戏框架,项目对应的源代码为
4-14-1 MySurfaceView
“ (矩形碰撞)”。首先修改 类如下:
//定义所需的变量:
//定义两个矩形的宽高坐标
private int x1 = 10, y1 = 110, w1 = 40, h1 = 40;
private int x2 = 100, y2 = 110, w2 = 40, h2 = 40;
//便于观察是否发生了碰撞设置一个标识位
private boolean isCollsion;
//然后修改绘图函数:
public void myDraw () {
...
//判断是否发生了碰撞
if (isCollsion) {//发生碰撞
paint.setColor(Color.RED );
paint.setTextSize(20);
canvas.drawText(Collision , 0, 30, paint);
!
} else {//没发生碰撞
paint.setColor(Color.WHITE);
}
//绘制两个矩形
canvas.drawRect(x1, y1, x1 + w1, y1 + h1, paint);
canvas.drawRect(x2, y2, x2 + w2, y2 + h2, paint);
2
...
}
上面代码中,isCollsion 这个变量的存在主要是区分未碰撞和已碰撞。当发生碰撞时
(isCollsion 为真),不仅改变了画笔的颜色,还绘制了一句文本信息。绘制文本的原因是
因为在书中只显示黑白两色,效果不明显,为了让大家从项目截图中明显的看出其区别而添
加的。
两个矩形默认坐标和宽高值是无法发生碰撞的,所以这里需要对其中一个矩形跟随触屏
点进行移动操作,这个操作在触屏事件监听函数中实现:
public boolean onTouchEvent(MotionEvent event) {
//让矩形 1 随着触屏位置移动(触屏点设为此矩形的中心点)
x1 = (int) event.getX() - w1 / 2;
y1 = (int) event.getY() - h1 / 2;
//当矩形之间发生碰撞
if (isCollsionWithRect(x1, y1, w1, h1, x2, y2, w2, h2)) {
isCollsion = true;//设置标识位为真
//当矩形之间没有发生碰撞
} else {
isCollsion
显示全部