一个使用PtInRect函数的
游戏例子。
游戏开始后不停的随机产生一个任意大小的长方形,并显示在屏幕上,玩家需要使用笔去点击这些长方形,如果经碰撞检测证明点中,则长方形消失。如果不能及时的消灭最上面的长方形,它将会被新产生的遮盖住,当屏幕上的长方形数量达到32个时,你便GAME OVER了。
请到原文网站下载这个游戏的EVC工程文件...
IntersectRect(...)
这个API可以使用在标准Windows下。作用是判断两个长方形之间是否有重叠的区域。它也返回真或假显示重叠的状况。长方形数据类型是的一个Win32 SDK声明了的标准的数据类型,使用四个整数来描述一个长方形区域。 它们是left, top, right, bottom。类型声明如下:
type _tagRECT
{
int left, top, right, bottom;
} RECT;

<图7 两个矩形是否有重叠?>
我一直使用这种很典型的方法来快速的进行常规的碰撞检查。
检测距离的方法。前面的方法都是用来检查一个点是否在一个规定的矩形范围中。如果你的游戏中有两个圆形对象。并且你想知道对象A到对象B有多远,你该怎样做才能得到他们之间的距离呢?如果这个距离小于两对象的半径之和,说明这两个对象是重叠的。下面的图形象我们说明了判断两个对象之间的距离是很容易的,我们的算法是: c2 = a2 + b2.

<图8-距离检测>
A = p1.x - p2-x;
B = p1.y - p2.y
C = sqrt(A*A+B*B);
假定R1是蓝圆的半径,
R2是红圆的半径,如果C小于R1和R2的和,说明两个圆是重叠在一起的。
让我们想一下
星际航行的游戏,用一个圆表示行星,用一个圆表示太空船,然后碰撞检查,在两个对象之间进行简单地计算距离。

<图9 Asteroid游戏>
高级方法 - 精灵的重叠判断。
现在的2D游戏的特色是有许多形状差别很大的精灵。为了节约计算时间,我们需要一个超越第一种方法的解决方案,应用到每对象类型。在我的射击游戏中,我用一个特殊方法来检查子弹和其他的对象是否发生碰撞。因为,子弹是很小的并且快速移动的。我同样也用特殊的方法来检查两个精灵对象之间是否发生碰撞。因为,他们又太大了。
基本思路:首先我用了一个对象把精灵对象的边界进行封装。然后使用快速的边界重叠的方法来进行碰撞检查。如果对象边界是不重叠的,则说明对象没有被击中。如果边界发生重叠,说明对象被击中了。见下图。我们需要使用一种高明的检查方法,计算所有重叠象素。
1、如果对象边界正在重叠
2、是,计算重叠的区域, 转到步骤4
3、没有,没重叠,退出判断
4、在重叠的长方形中计算真实的重叠形状
5、计算重叠的象素
6、返回重叠的象素的数字

<图10 精灵击中测试>