java - 如何使用数组协调基于二维图 block 的游戏中的图形和逻辑位置?

标签 java multidimensional-array 2d sprite

我正在用 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:

  1. 使用简单的舍入:如果玩家位置 < tile-boundary 就让他在前一个棋子上。如果Greater就下。现在是边界问题——你可以使用启发式方法,因为你不应该相信 float 比较的准确性(即,与 0 比较不是一件好事)。所以你可以尝试这样的事情 if(currentPosition - boundary <= 0.000000001)然后假定它是下一个磁贴,否则保持在同一个磁贴上。
  2. 嗯,@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/

相关文章:

java - ChangeListener 和 ItemListener 的区别

c - 在 C 中使用另一个数组初始化数组大小

java - 无法更改 GridLayout 中 JLabel 的大小

java - 我有一个自定义对象的二维数组。我必须用 Java 实例化每个实例吗?

php - 如何展平多维数组?

javascript - AngularJS - 级联动态选择列表

java - libgdx box2d body - 如何通过给定的力或速度、距离和时间移动 body

Java 2D PNG : Calculate Dimension

java - Java中抽象类的使用

java - 在java中将逗号分隔的字符串转换为json