在2D游戏中碰撞检测背后的逻辑是什么?

时间:2014-03-21 20:41:11

标签: java java-2d

我想用基于图块的地图创建2D游戏。我的主要问题是碰撞。如果我的路上有一棵树,我怎么能让我的精灵不穿过树?

2 个答案:

答案 0 :(得分:4)

的伪代码:

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

当然语义会被触发,事件处理程序是否更有意义(例如:{/ 1}} 当x和y坐标相遇时,而不是{ {1}}他们在collision_occurs()被解雇时遇到)取决于游戏。

如果你要进行更多的分析,你会注意到子弹和怪物各不是1个像素,所以看起来更像:

if

这些细节随之而来。基本上你有移动对象,这些对象共享坐标。 当这些坐标作为其代表对象的属性足够接近时,会发生“碰撞”,并且会遵循一些方法。

答案 1 :(得分:0)

这样的事情背后的一般想法(我使用松散的一般术语)是每个对象'在你的游戏中(无论是树,汽车,w / e)是一组多边形。现在,这些相应多边形中的每一个都具有一组边界,它们具有(可能)设置或已知大小。实际上,您可以将游戏中的每个对象看作一组空心多边形。例如,把这个'空心''汽车和墙壁我刚刚掀起(我是一个可怕的艺术家,所以忍受我):

enter image description here

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

在程序中,您将在游戏中的每个对象上附加一个处理程序,用于侦听程序中的更改。 (例如汽车移动),它可以检测到类似的事情,发生了碰撞吗?比赛结束了吗?汽车经过我,我不应再展示了。等等,因为你关心碰撞,你会特别注意以下任何一个: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);
  }
}