【问题标题】:Collision detection in Pacman using ACM graphics (java)使用 ACM 图形在 Pacman 中进行碰撞检测 (java)
【发布时间】:2018-05-15 03:42:12
【问题描述】:

我有一个游戏循环:

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;

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

【问题讨论】:

  • 没有任何东西可以阻止pac 穿墙。在if (pacmanState... 部分中,pac 无论如何都会移动,在下面的if 子句中检查pac 是否在任何墙上(b2?),但在这种情况下,什么也没有发生(@ 987654330@)。另外:知道b2 是什么会很好。

标签: java


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多