首先确定要在哪些对象之间进行碰撞检测。对于许多小型游戏来说,测试每个对象与其他所有对象的碰撞并不是一个坏主意。虽然你的问题对这种蛮力方法有所顾虑,但计算机非常擅长处理这种例行数学运算。
然而,对于更大的场景,您需要筛选掉那些距离玩家太远而无关紧要的对象。基本上,您将场景分成几个区域,然后首先测试角色所在的区域,然后测试该区域中的每个对象是否发生碰撞。
一种执行此操作的技术称为“四叉树”。您还可以使用二进制空间分割等其他技术。在这两种情况下,场景被分成许多较小的部分,您可以使用它们来组织场景。
这是一个很难回答的问题,但这里有一个非常基本的二维伪代码示例作为一个非常基础的例子。
for-each sprite in scene:
for-each othersprite in scene:
if sprite is not othersprite & sprite.XY = othersprite.XY
collision = true;
else
collision = false;
希望这足以激发你的思维!
补充说明:其他改进之一是假设XY周围的区域而不是精确位置,这样可以为具有大面积精灵的支持提供一种支持。
关于3D理论,我会给你一篇我之前读过的文章:
http://www.euclideanspace.com/threed/animation/collisiondetect/index.htm
num1的回答涵盖了我想说的大部分内容,因此我投了赞成票。但是还有一些修改/额外要点:
1)包围框实际上是测试碰撞的第二种最容易的方法。最简单的方法是距离检查;只需计算两个对象之间的距离,如果它们足够接近,则它们会发生碰撞。
2)为了优化碰撞测试(即BSP的替代方法),另一种常见的组织场景的方式是四叉树。在任何情况下,基本上您将场景分成区域,然后首先测试角色所在的区域,然后测试该区域中的每个对象是否发生碰撞。这样,如果关卡非常大,您不必针对关卡中的每个对象进行测试;您可以剔除太远离玩家而无关紧要的所有对象。
3)我更强调Angry Birds使用物理引擎来处理其碰撞。虽然距离检查和包围框对于大多数2D游戏来说都可以,但Angry Birds显然没有使用这两种简单的方法,而是依靠其物理引擎进行碰撞检测。我不知道该游戏使用的是哪个物理引擎,但Box2D被广泛使用并且是开源的。