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

Java 2d游戏中碰撞检测背后的逻辑是什么?,java,java-2d,Java,Java 2d,我想创建一个二维游戏与瓷砖为基础的地图。我的主要问题是碰撞。如果有一棵树挡住了我的去路,我将如何使我的精灵不在树中移动?伪代码: some_event() { if (bullet.x == monster.x && bullet.y == monster.y) { collision_occurs(); } } 当然,语义,例如哪个事件将被触发,以及事件处理程序是否更有意义(即:当x和y坐标相遇时发生碰撞(),而不是当某些事件()被触发时它们相

我想创建一个二维游戏与瓷砖为基础的地图。我的主要问题是碰撞。如果有一棵树挡住了我的去路,我将如何使我的精灵不在树中移动?

伪代码:

some_event() {
    if (bullet.x == monster.x && bullet.y == monster.y) {
        collision_occurs();
    }
}
当然,语义,例如哪个事件将被触发,以及事件处理程序是否更有意义(即:当x和y坐标相遇时发生碰撞(),而不是当
某些事件()被触发时它们相遇时发生碰撞()
),取决于游戏

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

// While approaching from the left
if ((bullet.x + (bullet.radius)) >= (monster.x + (monster.radius)))
这些细枝末节都在后面。基本上,您有移动的对象,这些对象共享坐标当这些坐标作为其代表性对象的属性足够接近时,会发生“碰撞”并遵循一些方法。

伪代码:

some_event() {
    if (bullet.x == monster.x && bullet.y == monster.y) {
        collision_occurs();
    }
}
当然,语义,例如哪个事件将被触发,以及事件处理程序是否更有意义(即:当x和y坐标相遇时发生碰撞(),而不是当
某些事件()被触发时它们相遇时发生碰撞()
),取决于游戏

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

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

这些细枝末节都在后面。基本上,您有移动的对象,这些对象共享坐标当这些坐标(作为其代表性对象的属性)足够接近时,就会发生“碰撞”,并遵循一些方法。

这样的事情背后的一般思想(我松散地使用术语general)是,游戏中的每个“对象”(无论是树、汽车、w/e)都是一组多边形。现在,每个多边形都有一组边界,这些边界(可能)有一组或已知大小。因此,实际上,你可以把游戏中的每个对象看作一组空心多边形。例如,以我刚刚设计的这辆“空心”汽车和墙壁为例(我是一个糟糕的艺术家,请容忍我):

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

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

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

编辑

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


这类事情背后的一般想法(我松散地使用术语general)是,游戏中的每个“对象”(无论是树、汽车、w/e)都是一组多边形。现在,每个多边形都有一组边界,这些边界(可能)有一组或已知大小。因此,实际上,你可以把游戏中的每个对象看作一组空心多边形。例如,以我刚刚设计的这辆“空心”汽车和墙壁为例(我是一个糟糕的艺术家,请容忍我):

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

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

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

编辑

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


可能会得到更好的结果。David Brackeen的《用Java开发游戏》是一本很好的基于Java的书,涵盖了您正在寻找的内容。这本书很古老,但创建一个基于2D瓷砖的2D碰撞游戏的核心细节就在这里,这本书有一个网站,展示了游戏的深度。虽然实现可能需要一些现代化,但您可以在执行时替换旧的不推荐的方法和模式。GameDev可能也会为你指出一些好的教程的方向。如果你继续提问,可能会得到更好的结果。David Brackeen的《用Java开发游戏》是一本很好的基于Java的书,涵盖了您正在寻找的内容。这本书很古老,但创建一个基于2D瓷砖的2D碰撞游戏的核心细节就在这里,这本书有一个网站,展示了游戏的深度。实现可以使用