我正在编写一个2D,基于网格的Pacman游戏。所有瓷砖的尺寸均为8x8。在游戏中,地图图块被视为16x16,字符(吃豆人和鬼魂)被视为32x32。实际上,它们都是从8x8瓷砖的spritesheet中拉出来的。我将位置存储为每个角色的中心点。由于角色图块比地图图块大,因此地图的构建方式要求角色能够重叠"在封闭的瓷砖上。
为了解决这一系列问题,我创建了一个不可见的矩形并将其附加到角色的位置。如果位置是(x,y)
点,则矩形是围绕该点的框。这个矩形在游戏中基本上是16x16,位于角色的中心,允许重叠。
如果您使用8px作为全球移动速度,这可以正常工作,但我想将8px视为" 100%速度"并且使用范围为[0,1)的双精度完全控制字符速度。这些位置存储为双点,所以在这个级别上,这很好。不过,我把这些位置读回整数,因为我正在使用像素。
所以我问的问题基本上是"如果现在将X像素数量移动到Y方向,我的碰撞盒是否会触及被阻挡的瓷砖?但如果你一次移动5个像素,最终会导致一个非常明显的问题。说你在x = 0,向右移动。如前所述,游戏中的牌是16x16,并且在第三局之前你打开了两个牌,这些牌被封锁了。所以你移动,x = 5,x = 10,x = 15,x = 20,我们刚到第二个图块,x = 25,x = 30,x = 35,现在我们在第三个图块中。 .. 可是等等。我们不能去那里,因为X = 35碰撞。不幸的是,我们需要转向并开始向下移动,但我们不能,因为现在我们的Y轴未与网格正确对齐。我们的X位置需要为32,但不能。
我在这里向大家提出的问题是,我的选择是什么?你有什么想法或见解?我有一种感觉,我觉得它比我需要的更难。
答案 0 :(得分:1)
听起来像你......
为什么不给你的“pac-man”精灵一个速度向量?该向量不仅将描述“pac-man”正在行进的速度,还将描述在哪个方向,这意味着您可以向前看。
“pac-man”应该根据下面的对话计算并最终作出决定......“嘿,以这个速度向这个方向移动......在这么多秒钟里我会撞到一堵墙,什么时候发生?“秒甚至不需要秒......它们可能是“正方形”。你需要一个接收初始运动矢量(方向和速度)的函数,它返回一个X,Y点的坐标,其中“pac-man”必须停止,在那里他不能走得更远,必须改变方向(靠近墙壁的瓷砖中心)。每次“pac-man”改变方向时,再次运行此计算...您不需要继续检查下一个方格是否可以通过。如果他的方向没有改变,他的速度是恒定的......你只需要计算一次,让坐标系完成其余的工作。
采用这种方法,方形大小和速度是无关紧要的...直到“pac-man”命中或在他的下一次移动中超过停止点,继续沿着向量移动。