处理-椭圆/矩形碰撞的方法

时间:2018-10-04 21:51:58

标签: java methods processing collision-detection collision

我正在编程一个游戏,需要解释很长的时间,但简而言之,玩家是 ellipse() ,并跟随鼠标移动,而 rect()是在屏幕上向下移动的障碍物,需要玩家躲避,否则游戏结束。正如我使用 ArrayList 来存储每个障碍物对象一样,有多个矩形。

当前,玩家可以直接穿过矩形,而不会发生任何变化。我曾尝试多次解决它,但是它变得非常凌乱,由于对Java非常陌生(只有1周的经验),所以我不太了解,所以我将空代码放在下面。

tldr ;我需要弄清楚如何使 椭圆/矩形碰撞 (以其自身的方法)起作用。我只有1个星期的Processing / Java经验。我已经剪掉了大多数不需要查看的代码,主要是保留了用于定义形状的变量以及用于形状的代码,以防万一。另外,如果可能的话,可以将碰撞方法放置在 敌人类 内。

敌人类 (用于定义矩形的所有变量)

class Enemy {

  int enemyNumber; // used to determine enemy type

  //VARIABLES FOR ENEMY
  boolean redEnemy = false; // determine enemy colour
  color enemyColour = color(#B9B9E8); // sets default colour to blue
  PVector position, velocity;
  float xDist, yDist; // x and y distance for Bar
  float smallCircleRad, bigCircleRad; // radius for circles

   // **************************************************************************

  Enemy() { //CONSTRUCTOR
    position = new PVector(width/2, random(-300000, -250));
    //println(position.y);
    velocity = new PVector(0, 10);
    smallCircleRad = 200;
    bigCircleRad = 400;
    xDist = width;
    yDist = 200;
    enemyNumber = int(random(1, 6));
  }

   // **************************************************************************

  void redBar(float xPos, float yPos, float xDist, float yDist) {
    redEnemy = true;
    noStroke();
    enemyColour = color(#E38585);
    fill(enemyColour);
    rect(xPos, yPos, xDist, yDist);
  }

  void blueBar(float xPos, float yPos, float xDist, float yDist) {
    redEnemy = false;
    noStroke();
    enemyColour = color(#B9B9E8);
    fill(enemyColour);
    rect(xPos, yPos, xDist, yDist);
  }

播放器类 (用于定义椭圆的所有变量)

class Player {

  int r = 50; //player radius
  float playerX = width/2; //starting x coordinate
  float playerY = height/2+500; //starting y coordinate
  float speed = 20; //player speed
  float angle; //angle used to calculate trajectory for player

  void playerChar() { //method for player model and general rules
    stroke(10);
    rectMode(CENTER);
    fill(playerColour);
    ellipse(playerX, playerY, r*2, r*2);
  }

1 个答案:

答案 0 :(得分:0)

通过将播放器视为矩形而不是圆形,使生活更轻松。您仍然可以将它们绘制为圆形,但是要进行碰撞检测,请使用矩形。这称为边界框,在碰撞检测中非常流行。

然后您可以使用矩形-矩形碰撞检测,这要简单得多。

一些基本的Google搜索返回以下结果:

如果出于某种原因您在计算碰撞时绝对需要玩家成为一个圆圈,那么我将首先搜索类似“圆形矩形碰撞检测”之类的东西。

如果您仍然无法弄清楚,请在一个新问题中张贴一个MCVE,我们将继续处理。祝你好运。