【问题标题】:Pacman collision detection using a matrix使用矩阵的 Pacman 碰撞检测
【发布时间】: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 所说,在每个时间步骤中,您都有一个起始位置和一个结束位置,而这两者之间的屏幕上发生的只是绘画和动画。如果您需要在中间中断该过程并更改它,那将成为一个新的结束位置。您更新模型,渲染代码使其在屏幕上发生。你越早采用这个想法,编码就越容易。

标签: java algorithm pacman


【解决方案1】:

如果您想要以下映射:

co-ordinates     board pos

0-24             0
25-49            1
50-74            2
etc

然后只使用整数除法

int newX = (x / 25) % 32;
int newY = (y / 25) % 32;

如果你想实际执行碰撞,并且你的 Pacman 有一个宽度和高度,你需要在测试时从 Pacman 的中心偏移坐标。例如,如果您向右移动并且您的 Pacman 是 25 像素宽,则将 12.5 添加到您要测试的 x 坐标(如果您向左移动则减去等)。为避免使用非整数,您可以将“中心点”放在 Pacman 的左上方,向右或向下移动时添加 25,向左或向上移动时添加 0。

如果您想将渲染与模型分开,请以“游戏单位”或任何您存储 Pacman 位置而不是像素的单位进行上述计算,然后在渲染时对屏幕坐标应用转换。但是,您确实需要在网格索引和这些游戏单元之间进行一些映射(即使这只是意味着将位置存储为带有小数部分的网格索引并在需要索引时将其丢弃),因为碰撞(例如与幽灵)确实不一定发生在网格单元边界。当然,如果你想要“像素完美”的碰撞,那么你进行碰撞的单元和渲染单元之间的映射可以是 1:1。

【讨论】:

  • 我试过了,还是不行。我想我希望 26-50 映射到 251-753 等等。虽然无法弄清楚所需的计算
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-16
  • 1970-01-01
  • 1970-01-01
  • 2013-10-12
  • 2016-08-31
  • 1970-01-01
相关资源
最近更新 更多