Java 不同字符速度下的Pacman碰撞检测?

Java 不同字符速度下的Pacman碰撞检测?,java,collision-detection,game-engine,collision,Java,Collision Detection,Game Engine,Collision,我正在编写一个2D的基于网格的Pacman游戏。所有瓷砖的尺寸均为8x8。在游戏中,地图分幅被视为16x16,角色(吃豆人和鬼魂)被视为32x32。实际上,它们都是从8x8瓷砖的精灵片中提取的。我将位置存储为每个字符的中心点。由于角色分幅比地图分幅大,因此地图的构建方式要求角色能够“重叠”到分幅上 为了解决这组问题,我创建了一个不可见的矩形,并将其附加到角色的位置。如果位置是一个(x,y)点,则矩形是围绕该点的框。这个矩形在游戏中基本上是16x16,位于角色的中心,允许必要的重叠 如果您使用8p

我正在编写一个2D的基于网格的Pacman游戏。所有瓷砖的尺寸均为8x8。在游戏中,地图分幅被视为16x16,角色(吃豆人和鬼魂)被视为32x32。实际上,它们都是从8x8瓷砖的精灵片中提取的。我将位置存储为每个字符的中心点。由于角色分幅比地图分幅大,因此地图的构建方式要求角色能够“重叠”到分幅上

为了解决这组问题,我创建了一个不可见的矩形,并将其附加到角色的位置。如果位置是一个
(x,y)
点,则矩形是围绕该点的框。这个矩形在游戏中基本上是16x16,位于角色的中心,允许必要的重叠

如果您使用8px作为全局移动速度,这很好,但是我希望将8px视为“100%速度”,并使用范围内的双精度完全控制角色速度[0,1)。位置存储为两点,因此在该级别上,这很好。不过,我将位置读回为整数,因为我使用的是像素

所以我问的问题本质上是"如果现在将X数量的像素移动到Y方向,我的碰撞框是否会碰到被阻止的磁贴?但是如果一次移动5px,这最终会导致一个非常明显的问题。假设你在X=0,向右移动。游戏中的磁贴是16x16,如前所述,在第三个磁贴被阻止之前,你有两个磁贴打开。所以你移动,X=5,x=10,x=15,x=20,我们刚刚到达第二个地砖,x=25,x=30,x=35,现在我们在第三个地砖中…但是等等。我们不能去那里,因为x=35碰撞。不幸的是,我们需要转动并开始向下移动,但我们不能,因为现在我们的Y轴没有正确地与网格对齐。我们的x位置需要是32,但不能


我的问题是,我的选择是什么?你有什么想法或见解?我觉得这比我需要的要困难得多。

听起来你有

为什么不给你的“吃豆人”精灵一个速度矢量呢?这个矢量将不仅描述“吃豆人”行进的速度,而且描述行进的方向,这意味着你可以看到前方

“吃豆人”应该根据下面的对话进行计算并最终做出决定……“嘿,以这个速度朝这个方向移动……在这么多秒内我会撞到墙,什么时候会发生?”。秒甚至不必是秒……它们可以是“正方形”

你需要一个函数,它接受初始运动矢量(方向和速度),返回X,Y点的坐标,“吃豆人”必须停下来,不能再往前走,必须改变方向(靠近墙的瓷砖的中心)。每次“吃豆人”改变方向,再次运行此计算…你不需要一直检查下一个正方形是否可以通过。如果他的方向没有改变,速度不变…你只需要计算一次,然后让坐标系来做其余的


在这种方法中,方块大小和速度是不相关的……直到“吃豆人”击中或在他的下一个动作超过停止点时,继续沿着向量移动。

为什么不让你的移动大小乘以你的总大小?这也是两个的倍数,例如使用2、4和8的速度(可能是16?)@ElliottFrisch感谢您的回复,不幸的是,这不起作用,因为速度会快得离谱。我可以降低游戏循环本身的速度,但那样的话它会变得太颠簸。然后您必须调整它。记住
distance=rate*time
,您似乎知道您想要的
时间
。您似乎知道
距离e> 。显然,
rate
必须从这里开始。@ElliottFrisch我不知道为什么这对我来说不是很明显。谢谢你。非常感谢。正如你在阅读我的问题时可能会看到的那样,我感到很沮丧,因为我觉得我正处在解决问题的边缘。我最终找到了答案,并为我的课堂演示了一个非常流畅的演示很高兴听你这么说。提出改进建议总是有助于表明你真正理解这个问题。也许到时候你可以谈谈向量。