【问题标题】:Platformer Collision Detection and Resolution in OO Manner面向对象的平台游戏碰撞检测和解决
【发布时间】:2013-12-04 15:42:02
【问题描述】:

首先,这里有一点背景:

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

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

我想要一些关于如何为不同类型的碰撞与不同瓷砖类型构建我的一些代码的建议。

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

我应该创建一个带有抽象方法的基本 Tile 类,以便每种瓷砖类型在发生碰撞时可以表现不同,还是应该为每种类型使用不同的层?

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

如您所见,我缺乏经验,不知道在某些情况下什么最有效。

谁能在这些领域给我一些一般性的指导?

【问题讨论】:

    标签: android oop collision-detection game-engine


    【解决方案1】:

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

    对于物理,您可以找到一个外部物理引擎,例如 bullet 或 box2d。如果你想自己做物理,你可能需要把它与世界的碰撞分开。如果您想要某种飞行实体,您可能希望它能够被实心瓷砖阻止,但不受重力影响,因此在组件实体系统中有一个物理组件和一个碰撞组件。遍历实体时,使用碰撞组件查看玩家/敌人/其他东西是否在地面上,如果没有,则使用物理组件应用重力加速度(或者如果它以恒定速度向下移动它已达到最终速度)。您将拥有一个很大的实体列表,而不是它们的复杂层次结构。这种结构如今已被专业人士很好地使用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多