Не могу получить столкновения, чтобы работать для Марио-подобной игры - PullRequest
0 голосов
/ 13 января 2019

Итак, я потратил немало часов на свою игру, похожую на Марио, но недавно я застрял на столкновениях после того, как перешел на систему столкновений на основе объектов, которая, похоже, должна работать, но где-то есть ошибка что я не могу найти.

В настоящее время поле, представляющее игрока, просто падает прямо через платформу, а не сидит на платформе

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

Вот класс коробки, в котором обнаружены все мои столкновения

//Box class -- THIS IS WHERE I NEED HELP -- everything else is just for context

//Box class

class Box {
  private float xpos, ypos, sizeX, sizeY;
  private float bottom = ypos + sizeY;
  private float top = ypos;
  private float left = xpos;
  private float right = xpos + sizeX;
  Box(float startX, float startY, float xSize, float ySize) {
    boxes++;
    xpos = startX;
    ypos = startY;
    sizeX = xSize;
    sizeY = ySize;
  }
  void update() {
    rect(xpos, ypos, sizeX, sizeY);
  }
  void collision() {
    //If on box level
    if (player.playerY + player.playerHeight >= top && player.playerY <= bottom) {

      //Left Side
      if ((player.playerX + player.playerWidth) <= left && (player.playerX + player.playerWidth) + speed >= left) {
        player.playerX = left - player.playerWidth;
        player.canMoveRight = false;
      }
      //Right Side
      if (player.playerX >= right && player.playerX + speed <= right) {
        player.playerX = right;
        player.canMoveLeft = false;
      }
    }

    //If in box Y coord
    if (player.playerX + player.playerWidth >= left && player.playerX <= right) {
      //top
      if (player.playerY + player.playerHeight <= top && player.playerY + player.yVelocity + gravity >= top) {
        player.Gravity = false;
        player.playerY = top - player.playerHeight;
        player.yVelocity = 0;
        player.canMoveDown = false;
      }
      //bottom
      if (player.playerY + player.yVelocity >= bottom && player.playerY + player.yVelocity + gravity <= bottom) {
        player.canMoveUp = false;
        player.yVelocity = 0;
        player.playerY = bottom;
      }
    }
    //onGround
    if (player.playerY == ypos - player.playerHeight) {
      player.onGround = true;
    }
  }
}

Структура управления несколькими нажатиями клавиш

//Control structure to enable multiple keypresses

//Control

float speed = 4;
float gravity = 1;
float jump = 10;

boolean isUp, isLeft, isDown, isRight;


void control() {
  //Controls
  if (isUp) {
    if (player.canMoveUp) {
      if (player.onGround) {
        player.Gravity = true;
        player.yVelocity = 0 + jump;
        player.onGround = false;
      }
    }
  }
  if (isDown) {
    if (player.canMoveDown) {

    }
  }
  if (isRight) {
    if (player.canMoveRight) {
      player.playerX += speed;
    }
  }
  if (isLeft) {
    if (player.canMoveLeft) {
      player.playerX -= speed;
    }
  }
  if (player.onGround) {
    player.Gravity = false;
    player.yVelocity = 0;
  }
}

void keyPressed() {
  setMove(keyCode, true);
}

void keyReleased() {
  setMove(keyCode, false);
}

boolean setMove(int k, boolean b) {
  switch (k) {
    case UP:
      return isUp = b;

    case DOWN:
      return isDown = b;

    case LEFT:
      return isLeft = b;

    case RIGHT:
      return isRight = b;

    default:
      return b;
  }
}

Основная вкладка, обновления бокса / сущности и класс игрока

//Main tab
float boxes = 0;
//Calls classes

Box b = new Box(0, 700, 800, 100);
Box b1 = new Box(300, 675, 25, 25);

Player player = new Player(50, 400, 20, 20);

void setup() {
  size(800, 800);
  frameRate(60);
}

void draw() {
  background(255, 255, 255);
  boxesUpdate();
  boxesCollision();
  entityUpdate();
  control();
  println(player.playerX + ", " + player.playerY);
  println(player.yVelocity + ", " + player.Gravity + ", " + player.onGround + ", " + player.canMoveDown);
}


//Box collision update method for when i add more boxes

void boxesCollision() {
  player.Gravity = true;
  player.canMoveUp = true;
  player.canMoveDown = true;
  player.canMoveLeft = true;
  player.canMoveRight = true;
  player.onGround = false;


  b.collision();
  b1.collision();

  if (player.Gravity) {
    player.playerY += player.yVelocity;
    player.yVelocity += gravity;
  }
}

//Along with another update method for the other parts of the boxes

void boxesUpdate() {
  b.update();
  b1.update();
}


//Entity update method to update players and for when i add NPCs and enemies

void entityUpdate() {
  player.update();
}

//Player class

class Player {
  private float playerX, playerY, playerWidth, playerHeight;
  private float yVelocity = 0;
  private float xVelocity = 0;
  private boolean canMoveRight, canMoveLeft, canMoveUp, canMoveDown;
  private boolean onGround, Gravity;
  Player(float X, float Y, float xSize, float ySize) {
    playerWidth = xSize;
    playerHeight = ySize;
    playerX = X;
    playerY = Y;
  }
  void update() {
    rect(playerX, playerY, playerWidth, playerHeight);
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...