簡體   English   中英

2D平台游戲中的碰撞錯誤

[英]Collision bug in a 2D platform game

我是Java和游戲編程的新手,並且正在啟動我的第一個大項目,這是一個2D平台益智游戲。 這是我的玩家移動代碼

  if (speedX > 0 && centerX <= 400){
     centerX += speedX;
  }

  if (speedX < 0 && centerX >= 400){
     centerX += speedX;
  }

  if (speedX > 0 && centerX >= 400){
     bg1.setSpeedX(-MOVESPEED);
     bg2.setSpeedX(-MOVESPEED);
  }

  if (speedX < 0 && centerX <= 400){
     bg1.setSpeedX(MOVESPEED);
     bg2.setSpeedX(MOVESPEED);
  }

  if (speedX == 0){
     bg1.setSpeedX(0);
     bg2.setSpeedX(0);
  }

  if(movingRight == true && movingLeft == true ){
     bg1.setSpeedX(0);
     bg2.setSpeedX(0);
  }

  // Handles Jumping
  if (jumped == true) {
     speedY += 1;


  }

  // Prevents going beyond X coordinate of 0
  if (centerX + speedX <= 60) {
     centerX = 61;
  }
  rect.setRect(centerX - 47, centerY - 65, 32, 87);

  centerY += speedY;
 }

 public void moveRight() {
        speedX = MOVESPEED;      

 }

 public void moveLeft() {
       speedX = -MOVESPEED;
 }

 public void stopRight() {
    movingRight = false;
    stop();
   }

 public void stopLeft() {
   movingLeft = false;
    stop();
 }

 private void stop() {
  if (movingRight == false && movingLeft == false) {
     speedX = 0;
  }
  if (movingRight == false && movingLeft == true) {
     moveLeft();
  }

  if (movingRight == true && movingLeft == false) {
     moveRight();
  }
}



 public void jump() {
  if (jumped == false) {
     speedY = JUMPSPEED;
     jumped = true;
  }

}

這是碰撞代碼

public void checkCollision(Rectangle rect){
   if (rect.intersects(r)){
      if(Player.movingRight){
      Player.centerX = tileX + 11;
      Player.speedX =0;
      }

      if(Player.movingLeft){
      Player.centerX = tileX + 89;
      Player.speedX = 0;
      }

      if(Player.speedY > 0){
         Player.centerY = tileY - 25;
         Player.speedY = 0;
         Player.jumped = false;
      }
   }

}

有兩個問題。第一個問題是,如果在將字符“電傳”着陸到右側或左側時按下移動鍵之一。 我知道發生這種情況是因為我編寫了這樣的程序:如果在moveRight或movingLeft為真的情況下角色與地面相交,則他會向右或向左移動(我這樣做是為了使水平碰撞有效),我想不出其他任何方法做到這一點或如何解決。

第二個問題是,如果角色從平台上移開,他不會跌倒。 我試圖通過添加碰撞方法來修復它

else{
speedY += 1;
}

但是由於某種原因,它使角色消失了。

非常感謝!

該代碼最初是用C ++編寫的,用於3D平台。 我重寫了它,但是可能存在一些錯誤。 如果很難理解,我以后可以畫一幅畫。

public void checkCollision(Rectangle rect){
    if(player.intersects(rect)) {
        //the rectangles intersect, time to move the player out of the block
        if(rect.y+rect.height >= player.y && rect.y+rect.height-0.7f < player.y) { //if the player is at most 0.7 units (you should change this!) below top side
            player.y = rect.y+rect.height; //set player to stand on top
            speed.y = 0f; //stop the movement
            onGround = true;
        } else if(rect.y+rect.height > player.y && rect.y < player.y+player.height) { //if the playeer is on the side, but not below
            float xEscMinus = (float)Math.abs((rect.x+rect.width)-player.x); //find the distance to the side
            float xEscPlus  = (float)Math.abs(rect.x-(player.x+player.width));

            if(xEscMinus<xEscPlus) {
                player.x = rect.x+rect.width;
            } else {
                player.x = rect.x-player.width;
            }
        }
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM