首页 > 解决方案 > 使用 ACM 图形在 Pacman 中进行碰撞检测 (java)

问题描述

我有一个游戏循环:

private void gameLoop() {
    boolean done = false;
    while (!done) {

        if(pacmanState == "right") {
            pac.move(20, 0);
            pause(100);
    }
        if(pacmanState == "left") {
            pac.move(-20, 0);
            pause(100);
    }
        if(pacmanState == "down") {
            pac.move(0, 20);
            pause(100);
    }
        if(pacmanState == "up") {
            pac.move(0, -20);
            pause(100);
    }

         if(pac.getBounds().intersects(b2.getBounds())) {

         if(pac.getY() <= b2.getY() - (b2.getHeight()/2)) {  //Hit was from below the brick
         pac.move(0, 0);
         }


         if(pac.getY() >= b2.getY()+ (b2.getHeight()/2)) { //Hit was from above the brick
         pac.move(0, 0);
         }


         if(pac.getX() < b2.getX()) {  //Hit was on left
         pac.move(0, 0);
         }


         if(pac.getX() > b2.getX()){  //Hit was on right
         pac.move(0, 0);
         }

         }

但是吃豆子直接穿过砖块。我看不出这个逻辑有什么问题。

在我之前的尝试中,我使用了 switch 语句,将 pacman 的移动和碰撞检测合并,如下所示:

        switch (pacmanState) {
        case "left":

            pac.move(-20, 0);
            pause(100);
            if (pac.getBounds().intersects(b2.getBounds())) {
                if (pac.getX() > b2.getX()) {
                    pac.move(0, 0);

                } else {
                    pac.move(-20, 0);
                    pause(100);
                }
            }
            break;

但是那个方法表现得很奇怪,只在砖块中途停止,或者在停止失败尝试后无法离开砖块

标签: java

解决方案


在您的顶级代码片段中,看起来您在移动pacman 之后正在测试碰撞。然后,如果发生碰撞,则将 pacman 移动零距离,但在下一个循环中,碰撞检查上方的部分将再次移动 pacman。

为了进行正确的碰撞检查,您需要测试 pacman移动时占据的位置,然后仅在没有发生碰撞时才执行移动一般来说,如果你在移动进行测试,已经为时已晚。


推荐阅读