当前位置: 首页 > 知识库问答 >
问题:

面向对象的平台碰撞检测与解决

周楷
2023-03-14

首先,这里有一些背景:

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

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

我想要一些建议,如何结构我的一些代码,以不同类型的冲突与不同的瓦片类型。

  • 我的播放机对象可以放置在其上的实体瓷砖
  • 仍可检测碰撞但允许玩家游泳的水瓦
  • 没有任何冲突检测的背景元素

我是否应该创建一个带有抽象方法的基Tile类,以便每个Tile类型在冲突时可以有不同的行为,或者为每个类型使用不同的层?

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

正如你所看到的,我很缺乏经验,不知道在某些情况下什么最有效。

谁能在这些方面给我一些一般性的指导吗?

共有1个答案

华良平
2023-03-14

您应该研究为实体创建一个组件实体系统。因为您将其标记为Android,所以我假设您使用的是Java。您还可以为您的瓷砖实现类似的功能,为您需要的瓷砖的每个部分创建接口。例如,您可以制作一个适用于水和液体的ISwimmable接口。你就会有一个无法穿过的固体块。背景元素将不执行任何组件。您可以在从单个Tile类派生的类中实现这些接口,并使用一些极简的抽象方法。尽量保留这些方法,您甚至可以尝试创建一个“注册”tile类型的类,以便在执行冲突时查找它们。

对于物理,你可以找到一个外部物理引擎,比如bullet或Box2D。如果你想自己做物理,你可能需要把它与世界的碰撞分开。如果你想要某种飞行实体,你可能希望它能够被固体瓦片阻止,但不受重力影响,所以在组件实体系统中有一个物理组件和一个碰撞组件。在迭代你的实体时,使用碰撞组件来查看玩家/敌人/其他什么东西是否在地面上,如果不在,使用物理组件来施加重力加速度(或者,如果它已经达到了终端速度,就以恒定速度向下移动)。您将有一个实体的大列表,而不是它们的复杂层次结构。这种结构在今天的专业人士中使用得非常好。

 类似资料:
  • 我正在开发一款平台游戏,我想做一些基本的平台碰撞,遗憾的是我还是做不到。玩家的移动是这样计算的: 所有变量都是具有< code>x和< code>y值的向量。这和预期的一样,问题是有冲突。我的规则是: 当降落在平台上时停止坠落。 从平台运行时开始下降。 在跳跃过程中击中平台时停止向上移动。 撞墙时停止向一侧移动,但能够向相反方向移动。 检查底部是否与平台碰撞非常简单,但棘手的部分是检测哪一侧与平台

  • 如果我想每秒移动一个物体40像素,并且我有以下场景,我如何有效地检测到发生了碰撞? 假设两个对象都是 10 x 10 个正方形 2秒时移动物体的起点: 40, 100 移动物体在3秒时的终点: 80, 100 停滞物体在60,100 如果我只移动移动物体一次(从40到80之间没有任何移动),我怎么知道它们之间有一个物体? 这显然是我正在做的事情的简化版本,但我希望它易于理解。 我唯一能想到的是检查

  • 我正在尝试做一个平台游戏,其中没有斜坡。我正在尝试将碰撞检测降下来,但是我在pygame中找不到一种方法来获得哪一边与另一个Sprite发生了碰撞。有没有人能给我一个好的方法来做到这一点,那不是太庞大,但也能很好地工作在我的情况? 下面是我的玩家类: 我已经将它添加到我的player类中,每次播放器更新时我都运行它,并且它工作...差一点。 在平台顶部的碰撞起作用,在侧面的碰撞几乎总是起作用,除非

  • 我在一个2D平台上工作在Java为一个任务。赋值指定我必须使用抽象形状类来绘制形状。我遇到的问题是让我的碰撞检测与多个矩形对象一起工作,我使用这些对象作为平台--我将它们存储在一个列表中。目前,我的碰撞检测将移动我的玩家,不管我撞到了哪个平台,所以如果我从右边撞到了一个平台,它会把我移到那个平台的顶部,因为它仍然在检查我下面的另一个平台,并假设我撞到了那个平台,因此把我移到平台的顶部。我想知道如何

  • 碰撞检测 现在你知道了如何制造种类繁多的图形对象,但是你能用他们做什么?一个有趣的事情是利用它制作一个简单的 碰撞检测系统 。你可以用一个叫做:hitTestRectangle 的自定义的函数来检测两个矩形精灵是否接触。 hitTestRectangle(spriteOne, spriteTwo) 如果它们重叠, hitTestRectangle 会返回 true。你可以用 hitTestRect

  • 本节暂未进行完全的重写,错误可能会很多。如果可能的话,请对照原文进行阅读。如果有报告本节的错误,将会延迟至重写之后进行处理。 当试图判断两个物体之间是否有碰撞发生时,我们通常不使用物体本身的数据,因为这些物体常常会很复杂,这将导致碰撞检测变得很复杂。正因这一点,使用重叠在物体上的更简单的外形(通常有较简单明确的数学定义)来进行碰撞检测成为常用的方法。我们基于这些简单的外形来检测碰撞,这样代码会变得