使用矩阵进行Pacman碰撞检测

时间:2018-06-01 21:31:32

标签: java algorithm

我有一个名为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以引用&#34;中心&#34; board的某些元素,如果有意义的话。

显然这不起作用而且Pacman碰壁:(。有什么想法吗?

1 个答案:

答案 0 :(得分:2)

如果您想要以下映射:

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。