我让我跳入平台游戏的代码也破坏了我的碰撞代码

时间:2019-03-28 02:58:33

标签: java swing

所以我只是在业余时间制作2D游戏,我很难理解为什么角色跳跃后我的碰撞代码会中断,而角色跳跃时却会起作用。

主要类别中的相关代码

public void collision() {
    Rectangle body = jan.getBody();
    int bodyX = (int) body.getX();
    int bodyY = (int) body.getY();
    if (bodyX < 0) {
            body.setLocation(0, bodyY);
            jan.setBody(body);
    }
    if (bodyX > 780) {
            body.setLocation(780, bodyY);
            jan.setBody(body);
    }
    if (bodyY > 360) {
            body.setLocation(bodyX, 360);
            jan.setBody(body);
    }
}
public void actionPerformed(ActionEvent e) {
    jan.update();
    collision();
    repaint();
}
public void keyPressed(KeyEvent e) {
    int keyCode = e.getKeyCode();
    if (keyCode == KeyEvent.VK_LEFT) {
        jan.setDirection(-1);
    } else if (keyCode == KeyEvent.VK_RIGHT) {
        jan.setDirection(1);
    } else if (keyCode == KeyEvent.VK_SPACE) {
        jan.jump();
    }
}

播放器类中的相关代码

public void jump() {
    int y = (int) body.getY();
    if (y == 360) {
        body.translate(0, -15);
        yVelocity = 15;
    }
}
public void update() {
    int x = getDirection();
    if (x == 1) {
        if (xVelocity < terminalVelocity) {
            xVelocity++;
        }
    }
    if (x == -1) {
        if (xVelocity > -terminalVelocity) {
            xVelocity--;
        }
    }
    if (x == 0) {
        if (xVelocity < 0) {
            xVelocity++;
        } else if (xVelocity > 0) {
            xVelocity--;
        }
    }
    if (body.y < 360) {
        yVelocity--;
    }
    body.translate(xVelocity, -yVelocity);
    }

为什么我的角色跳动后我的代码崩溃了?

1 个答案:

答案 0 :(得分:0)

如果Y也超出范围,则collision的逻辑将取消X中的钳位。尝试同时夹紧x和y,然后在发生变化的情况下更新主体:

  public void collision() {
    Rectangle body = jan.getBody();
    int bodyX = (int) body.getX();
    int bodyY = (int) body.getY();
    int clampedBodyX = Math.min(Math.max(0, bodyX), 780);
    int clampedBodyY = Math.min(Math.max(0, bodyY), 360);
    if (bodyX != clampedBodyX || bodyY != clampedBodyY) {
      body.setLocation(clampedBodyX, clampedBodyY);
      jan.setBody(body);
    }
  }