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

2d游戏中碰撞检测背后的逻辑是什么?[副本]

解明辉
2023-03-14

我想创建一个二维游戏与瓷砖为基础的地图。我的主要问题是碰撞。如果有一棵树挡住了我的路,我怎么才能让我的精灵不穿过这棵树呢?

共有2个答案

吉玉石
2023-03-14

这样的事情背后的一般想法(我使用术语一般)是游戏中的每个“对象”(无论是树、车还是w/e)都是一组多边形。现在,每个多边形都有一组边框,它们有一个(可能的)集合或已知的大小。所以说,你可以把游戏中的每个物体都看作一组空心的多边形。例如,拿我刚刚制造的“空心”汽车和墙壁来说(我是一个糟糕的艺术家,所以请耐心等待):

现在,即使在现实中你的汽车和墙壁会有很好的细节和颜色填充,作为一个处理碰撞的程序员,你唯一关心的是边界。

在程序中,游戏中的每个对象都会连接一个处理程序,用来监听程序中的更改。(例如,一辆正在行驶的汽车),它可以检测到诸如碰撞发生了吗?比赛结束了吗?汽车从我身边经过,我不应该再被展示了。由于你关心碰撞,你会特别注意以下两种情况:A)汽车听众说它撞到了什么东西,或B)墙壁听众说有什么东西撞到了它。从那里你可以改变程序的逻辑来处理你想要发生的任何事情(停止汽车动画运动,增加伤害,在屏幕上显示游戏等等)。

从那以后,最好的方法就是尝试。Java有大量的图形框架,每个框架都有自己的细微差别。都试试!或者在一些研究后选择一个,世界是你的游乐场。

编辑

Javafx中有一个形状冲突的例子,它是这样处理的:(这段代码归功于jewlesea)

private void checkBounds(Shape block) {
  boolean collisionDetected = false;
  for (Shape static_bloc : nodes) {
    if (static_bloc != block) {
      static_bloc.setFill(Color.GREEN);

      if (block.getBoundsInParent().intersects(static_bloc.getBoundsInParent())) {
        collisionDetected = true;
      }
    }
  }

  if (collisionDetected) {
    block.setFill(Color.BLUE);
  } else {
    block.setFill(Color.GREEN);
  }
}
商燕七
2023-03-14

伪代码:

some_event() {
    if (bullet.x == monster.x && bullet.y == monster.y) {
        collision_occurs();
    }
}

当然,语义学,例如哪个事件将被触发,以及是否有事件处理程序更有意义(即:collision_occurs()当x和y坐标相遇时,而不是如果它们在some_event()时相遇被解雇)取决于游戏。

如果你进一步分析这个,你会注意到子弹和怪物不是一个像素,所以它看起来更像:

// While approaching from the left
if ((bullet.x + (bullet.radius)) >= (monster.x + (monster.radius)))

这些细节随后出现。本质上,你有移动的对象,这些对象共享坐标。当这些坐标作为其表示对象的属性足够接近时,就会发生“碰撞”,并遵循一些方法。

 类似资料:
  • 我正在尝试制作我的第一个Pacman游戏,但我遇到了一堵我自己似乎无法打破的墙:( 这是关于如何在我的游戏中检测碰撞,所以步行者不能穿过障碍物/墙壁。我已经使它不能去屏幕外与此代码: ,但如果我在屏幕中间的电路板上有一个矩形,我不知道如何编程,这样它就会在墙前停止。 我需要阻止我的pacman移动到竞技场内的墙上,如你所见(左上方的矩形) 我的Board类代码: 希望有人能告诉我该怎么做...似乎

  • 我已经和LWJGL一起开发这个游戏几个星期了。自从我增加了跳跃的能力后,向上的碰撞给我带来了很多问题。 这个游戏是一个基于2D瓷砖的侧翻游戏。总的来说,除了玩家跳跃时,碰撞几乎是完美的。起初我想“哦,也许我只需要改变跳跃机制”,但后来我意识到只有当玩家通过某个x坐标时才会发生这种情况。 现在,对于实际问题本身:如果玩家在传递某个x坐标时跳转,他们将通过平铺,并测试顶部碰撞返回false。 这是整个

  • 我正在做一个2d平板游戏。到目前为止,我已经做了一些事情。我正在使用libgdx的矩形进行基本的碰撞检测,所以考虑到我现在只有草块,我用Java制作了一个单块世界(文件读取器还没有准备好),问题是我的检测只在第一次工作,换句话说,如果我产生碰撞到一个块,它会检测到碰撞并这样做。虽然如果我在没有碰撞的情况下,让我的球员在方块顶部出现,球员将永远摔倒。 这是代码=

  • 大家好,我正在用Java制作一个体素游戏,在研究我需要学习的所有不同内容时,我注意到很多游戏都使用AABB进行碰撞检测。然后我记得在Minecraft中也看到了AABB。但当我在谷歌上搜索什么是AABB时,它只会给出其他人的代码,或者历史书上的某个组织。Stackoverflow,什么是AABB?

  • 问题内容: 我正在尝试制作一个Python游戏,其中红龟追逐蓝龟。当红色乌龟抓到蓝色乌龟时,我希望它在屏幕上说“碰撞”,但它不起作用。当它碰撞时,什么也没有发生,并且给我一个错误“ Turtle”对象不可调用”。 问题答案: 与实际编程相比,这段代码似乎更让人想不到: 乌龟没有方法。您不能使用此语句简单地将方法添加到现有类。没有和功能。每次运动后,如果需要,该碰撞测试将只执行一次。让我们尝试挽救我

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