如何使用数组协调基于2D平铺的游戏中的图形和逻辑位置?

Ram*_*ama 5 java 2d sprite multidimensional-array

我正在用像Bomberman(我的第一个游戏)编写一个基于Java平铺的Java游戏.

我使用2D数组来表示我跟踪墙壁,步行空间等的地图.到现在为止,我能够让玩家根据他按下的方向键(但不与背景/地图交互)平滑地交换精灵,它可以随机走动并走出屏幕).

当我想跟踪玩家在阵列中的位置时,我的问题出现了.从逻辑上讲,角色总是只属于一个瓷砖,但在图形上它可以在两个瓷砖之间.我该如何解决这个问题?

我已经尝试过了:

currentTileArrayX = x/tileWidth;

currentTileArrayY = y/tileHeight;

其中x和y是精灵的左上角坐标.但是一切都变得非常多,因为玩家的精灵与瓷砖的尺寸不同.

我有另一个选项可以解决上一个问题:当玩家按下一个方向键时,将该角色移动到下一个方块,就像动画一样.这不会让玩家停在两块瓷砖的中间......但是如果他用另一台按键打断它呢?如何在动画执行时停止用户的操作?我认为这是最简单的解决方案,但我不知道如何实现它.

我已经尝试在其他问题中找到解决方案,但我没有运气.我希望你能帮助我.

非常感谢.

PhD*_*PhD 2

啊啊啊啊啊啊啊!遇到“离散空间问题”:) 你的逻辑图是离散的,但你的 UI 运动是在连续空间中的。我不认为用户实际上可以“同时”处于两个图块中 - 视觉上是的,但永远不会“内部”。现在您正在获取玩家的位置,可以说它可以是图块内的“任何位置”或 2 个图块的“边界上”......

IMO,这个问题有两种解决方案:

  1. 使用简单的舍入:如果玩家位置<图块边界,则将他保留在前一个图块上。如果更大就下。现在是边界问题 - 您可以使用启发式方法,因为您不应该相信浮点比较的准确性(即,与 0 进行比较不是一件好事)。因此,您可以尝试类似的操作if(currentPosition - boundary <= 0.000000001),然后假设它是下一个图块,否则留在同一个图块上。
  2. 嗯@Jay 比我先一步。因此,第二个是实际上定义了一个移动速度,并在每次“单击”/“按下按钮”时移动角色许多步 - 但你说你有在“之间”按下按键的问题。我猜如果你的代码是这样设计的,那么它应该不是问题:
    更新()
        {
           计算(); //更新所有数据结构/计算
           画(); //根据计算更新视觉表示
        }

update()又名游戏循环。我想这应该可以解决你的问题......