我正在编程一个游戏,需要解释很长的时间,但简而言之,玩家是 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);
}
答案 0 :(得分:0)
通过将播放器视为矩形而不是圆形,使生活更轻松。您仍然可以将它们绘制为圆形,但是要进行碰撞检测,请使用矩形。这称为边界框,在碰撞检测中非常流行。
然后您可以使用矩形-矩形碰撞检测,这要简单得多。
一些基本的Google搜索返回以下结果:
如果出于某种原因您在计算碰撞时绝对需要玩家成为一个圆圈,那么我将首先搜索类似“圆形矩形碰撞检测”之类的东西。
如果您仍然无法弄清楚,请在一个新问题中张贴一个MCVE,我们将继续处理。祝你好运。