对于矩形以外的任何物体,碰撞检测通常都很棘手。
我过去这样做的方法是为每个对象提供图像和蒙版。例如,像木星 2 号宇宙飞船这样的物体迷失在太空将具有以下图像和蒙版:
X 00000100000
XXXXXXX 00111111100
X X 01111111110
X X 11111111111
X X 01111111110
XXXXXXX 00111111100
XXX 00001110000
The image是被发送到屏幕上的内容,但是mask是用于碰撞检测的。您会注意到掩码中的 1 基本上是图像的轮廓和内容。
检测碰撞的方式:
- 检查矩形是否重叠。如果没有,就不会有碰撞的机会。
- 否则创建一个由其蒙版组成的对象编号 1 的矩形。
- 构造另一个由对象 2 的蒙版组成的矩形。
- 矩形 2 与矩形 1 的重叠部分按位与。
- 如果矩形 1 中还剩下 1 位,则发生冲突。
这考虑到了“未遂事件”,其中每个对象的边界矩形重叠,但对象本身不一定有轮廓。位运算符是检测这一点的有效方法。
这是一个箭头没有完全击中气球的例子 - 在我的图形设计技巧面前颤抖:
....xx....
..xx..xx..
.x......x.
.x......x.
x........x
x........x
.x......x.
.x......x.
..xx..xx..
....xx.**y.....
.y......
yyyyyyyy
.y......
..y.....
您可以看到,即使矩形重叠(参见**y
),箭头实际上并没有接触到气球。通过对掩码应用按位 AND 运算,这些位最终将为零,从而产生非冲突。
@kyoryu 在他的评论中提出了一个有趣的观点。有些游戏非常适合由较小的矩形组成的对象,您可以根据矩形组件简化碰撞检测(无需担心像素完美性)。例如,我们的老朋友太空侵略者(实际上是defender游戏中对抗太空入侵者的导弹)可能由两个矩形 X 和 Y 组成,而导弹则由 Z 制成:
YYYY .Z.
YYYY .Z.
XXXXXXXXXXXX .Z.
XXXXXXXXXXXX ZZZ
XXXXXXXXXXXX .Z.
XXXXXXXXXXXX
这将归结为对导弹与两个太空入侵者矩形进行简单的矩形检查 - 考虑到导弹的大小,即使您接触其中一个,您也可以将其称为碰撞.
角色(将它们视为近程导弹而不是撞击导弹)。