【发布时间】:2018-11-12 01:21:21
【问题描述】:
我有一个名为board 的二维数组,即 32x32。每个元素都是0 用于畅通路径或-1 用于墙壁。
窗口分辨率为 800x800,这意味着board 的每个元素的宽度和高度均为 25。
我的 pacman 位置在屏幕坐标中。我正在尝试实现接下来的两个函数,以基本上知道我是否可以将 Pacman 移动到某个位置(在屏幕坐标中)。
public static boolean canMove(Pair<Integer> pacmanPos, int[][] board) {
Pair<Integer> boardPos = pacmanPosToBoardPos(pacmanPos);
int j = boardPos.getX();
int i = boardPos.getY();
return board[i][j] != -1;
}
public static Pair<Integer> pacmanPosToBoardPos(Pair<Integer> pacmanPos) {
int x = pacmanPos.getX();
int y = pacmanPos.getY();
int newX = (int)Math.round((double)(x+12.5) / 25.0) % 32;
int newY = (int)Math.round((double)(y+12.5) / 25.0) % 32;
return new Pair<Integer>(newX, newY);
}
这是我最好的镜头。我将 12.5 添加到 x 和 y 以引用 board 的某些元素的“中心”,如果这有意义的话。
显然这不起作用,吃豆人会撞墙:(。有什么想法吗?
【问题讨论】:
-
不要在屏幕坐标中工作。将棋盘上的虚拟位置 (32x32) 与屏幕上的表示分开。在虚拟板位置执行所有计算并仅在最后可能的时刻转换为屏幕坐标,以呈现实际显示。这样会简单得多。
-
不,不知道,但您的方法似乎还可以。你只需要调试你做错了什么。
-
@JimGarrison 但是我想顺利移动吃豆人,所以我必须使用屏幕坐标
-
@Pilpel,不,您不必在屏幕坐标中工作。您决定是否要移动到棋盘上网格坐标中的新位置。一旦你做出了决定,剩下的就是渲染了。如果你想反转方向,你可以在渲染过程中这样做,但你已经有了决定:旧位置和新位置都有效。如果您在其他精灵移动到旧位置时处理部分位置碰撞,那么您并没有真正使用离散的板元素。但是,我说墙壁是不可能的;精灵相遇。
-
将 model(板坐标)与 view(屏幕坐标)分离是任何与视觉显示相关的编程中的基本概念.正如@Prune 所说,在每个时间步骤中,您都有一个起始位置和一个结束位置,而这两者之间的屏幕上发生的只是绘画和动画。如果您需要在中间中断该过程并更改它,那将成为一个新的结束位置。您更新模型,渲染代码使其在屏幕上发生。你越早采用这个想法,编码就越容易。