我正在用 Java 编写一个基于 2D 方 block 的游戏,例如炸弹人(我的第一款游戏)。
我使用一个 2D 数组来表示我跟踪墙壁、可步行空间等的 map 。到现在为止,我能够让玩家根据他按下的方向键平滑地移动交换 Sprite (但不与背景/ map ,它可以随机行走并离开屏幕)。
当我想跟踪玩家在数组中的位置时,我的问题就来了。从逻辑上讲,该角色始终只属于一个图 block ,但在图形上它可以位于两个图 block 之间。我该如何解决这个问题?
I already tried this:
currentTileArrayX = x / tileWidth;
currentTileArrayY = y / tileHeight;
Where x and y are the top-left coordinates of the sprite. But everything became very buggy because the player's sprites aren't the same size as the tiles.
我想到了另一个可以解决上一个问题的选项:当玩家按下方向键时,将角色像动画一样移动到下一个方 block 。这不会让玩家停在两个方 block 的中间……但是如果他再按一次按键会打断它怎么办?如何在动画执行时停止用户的操作?我认为这是最简单的解决方案,但我不知道如何实现。
我已经尝试在其他问题中找到解决方案,但我没有运气。我希望你能帮助我。
非常感谢。
最佳答案
啊啊啊啊啊啊啊!遇到'离散空间问题' :) 你的逻辑图是离散的,但你的用户界面移动是在连续的空间中。我不知道用户实际上可以“同时”在两个图 block 中 - 视觉上是的,但永远不会“内部”。现在你得到了玩家的位置,可以说它可以是方 block 内的“任何地方”或 2 个方 block 的“边界上”...
对于这个问题,你有两个解决方案,IMO:
- 使用简单的舍入:如果玩家位置 < tile-boundary 就让他在前一个棋子上。如果Greater就下。现在是边界问题——你可以使用启发式方法,因为你不应该相信 float 比较的准确性(即,与 0 比较不是一件好事)。所以你可以尝试这样的事情
if(currentPosition - boundary <= 0.000000001)
然后假定它是下一个磁贴,否则保持在同一个磁贴上。 - 嗯,@Jay 打败了我。所以第二个是实际上有一个 移动速度定义并移动每个角色的步数 'click'/'button press' - 但你说你有按键问题 压在“中间”。我猜你的代码是不是这样设计的 那么这应该不是问题:
update() { calculate(); //update all datastructures/calculations draw(); //update the visual representation based on calculations }
update()
又名 gameLoop。我认为这应该可以解决您的问题...
关于java - 如何使用数组协调基于二维图 block 的游戏中的图形和逻辑位置?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7007156/