Cant遇到碰撞才能上马里奥式游戏

时间:2019-01-12 23:13:45

标签: processing collision-detection

所以,我在类似于Mario的游戏上花费了相当多的时间,但是最近我在更改为似乎应该可以使用的基于对象的碰撞系统后陷入了碰撞,但是某处存在错误我找不到。

当前代表玩家的盒子只是直接跌落平台而不是坐在平台上

您将无法运行此代码段,因为我是堆栈溢出的新手,而且找不到更接近处理的内容。

这是具有我所有碰撞检测功能的box类

//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);
  }
}

0 个答案:

没有答案