OO方式中的平面碰撞检测与分辨率

时间:2013-12-04 15:42:03

标签: android oop collision-detection game-engine

首先,这里有一些背景知识:

我正在开发一款2D游戏作为个人项目,可能会在移动设备上发布。我计划用很多视觉元素创建一个基于图块的拼图/平台游戏。

我之前从未制作过任何这种规模的东西,我想知道如何在一个相对较大的项目中坚持良好的OO原则。

我想就如何使用不同的磁贴类型为不同类型的碰撞构建我的一些代码提供一些建议。

  • 我的玩家对象可以使用实心瓷砖
  • 仍然可以检测到碰撞但允许玩家游泳的水砖
  • 没有任何碰撞检测的背景元素

我是否应该使用抽象方法创建基本Tile类,以便每个tile类型在碰撞时的行为可以不同,或者为每种类型使用不同的层?

我也想知道如何将我的玩家对象的物理逻辑保持在一起而不是在tile类中的部分和玩家对象类中的部分?

正如你所看到的那样,在了解在某些情况下哪种方法最有效的方面,我缺乏经验。

有人能在这些方面给我一些一般指导吗?

1 个答案:

答案 0 :(得分:0)

您应该考虑为实体创建component entity system。因为您已将此标记为Android,我假设您使用的是Java。您也可以类似地为您的切片实现此功能,为您需要的切片的每个部分创建接口。例如,您可以制作适用于水和液体的ISwimmable接口。你会有一个ISolid用于你无法通过的固体块。背景元素不会实现任何组件。您将在从单个Tile类派生的类中实现这些接口,并使用一些简约的抽象方法。尝试保留方法您甚至可以尝试创建一个“已注册”磁贴类型的类,以便在执行冲突时查找它们。

对于物理学,你可以找到像bullet或box2d这样的外部物理引擎。如果你想自己做物理学,你可能需要将它与世界的碰撞分开。如果你想要某种飞行实体,你可能希望它能够被实体瓦片阻止,但不受重力的影响,因此在组件实体系统中有物理组件和碰撞组件。迭代你的实体时,使用碰撞组件来查看玩家/敌人/ somethingElse是否在地面上,如果没有,使用物理组件来应用由于重力引起的加速度(或者只是以恒定的速度向下移动它)达到终极速度)。你将拥有一个很大的实体列表,而不是它们的复杂层次结构。今天,专业人士非常熟悉这种结构。