Ошибка столкновения в 2D-платформе

1

Я новичок в 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;
      }
   }

}

Есть две проблемы. Первый заключается в том, что если я нажимаю одну из клавиш перемещения при посадке персонажа "телепортирует" вправо или влево. Я знаю, что это происходит, потому что я запрограммировал его, что если символ пересекается с землей, а movingRight или movingLeft верны, он движется вправо или влево (я сделал это так, чтобы горизонтальное столкновение работало), и я не могу думать о другом способе сделайте это или как исправить это.

Вторая проблема заключается в том, что если персонаж движется по плато, он не падает. Я попытался исправить это, добавив метод столкновений

else{
speedY += 1;
}

Но из-за этого персонаж исчез почему-то.

Большое спасибо!

  • 0
    Почему вы проверяете вертикальное столкновение, только если персонаж движется вверх (в методе checkCollision)? Я не думаю, что скорость важна, проверка всегда должна происходить.
  • 0
    Я проверяю столкновение, если персонаж движется вправо, влево или вниз. И это не имеет никакого отношения к скорости, я просто не знаю, как правильно справиться со столкновением ..
Показать ещё 1 комментарий
Теги:
collision
2d
game-engine

1 ответ

0

Этот код был первоначально написан в 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;
            }
        }
    }
}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню