>最近我一直在用Arduino在处理中使用Java开发游戏,对于这个问题,我删除了所有不必要的Arduino代码,只显示我遇到的问题代码,这些代码在处理中与Java直接相关。
目标:所以我现在的目标是在一些随机落下的椭圆和屏幕底部来回弹跳的矩形之间进行碰撞检测。这个想法是,当物体碰撞时,做一些真正简单的事情,比如把背景颜色变成红色。
问题:所以我目前面临的两个问题。一个是我知道如何使移动对象与静态对象碰撞,但是我在处理两个移动对象时遇到困难,并且任何示例通常是矩形或椭圆椭圆上的矩形,这没有帮助,因为椭圆碰到矩形与两个相同形式的相互撞击有很大不同。
第二个问题我知道我必须使用布尔值,但是因为省略号是随机坐标的,因此我使用的是浮点数而不是整数,布尔值不能与浮点数一起使用。
最后一个快速问题是,如果我需要布尔值的 x 和 y,它们不仅是浮点数,而且它们被放置在一个使它们无法访问的类中(请参阅下面的代码(。我可以复制相同的浮点数并将它们放置在定义初始整数的位置,但我不知道做这样的事情有多糟糕。
int direction1 = 100;
int speedX = 12;
int heightWidth=40;
int bounceSize= 40;
int ellipseSizeone=40;
int ellipseSizetwo=50;
float x = random(800);
float y = random(-500);
Meteor meteors;
int total = 10;
Meteor[] fall = new Meteor[total];
void setup() {
size (800, 500);
background(0);
smooth();
noStroke();
for (int i = 0; i < fall.length; i++) {
fall[i] = new Meteor();
meteors = new Meteor();
}
}
void draw() {
background(0);
direction1+=speedX;
if (direction1 > width-bounceSize) {
direction1 = width-bounceSize;
speedX = -12;
}
if (direction1 < 0) {
direction1 = 0;
speedX = 12;
}
rect(direction1, 450, heightWidth, heightWidth);
fill(0,20);
rect(0,0,800,500);
for (int i = 0; i < fall.length; i+=3) {
fall[i].fall();
}
fill(0,255,0);
}
class Meteor {
float x = random(800);
float y = random(-500);
void fall() {
y = y + 3;
fill(random(200),0,0);
ellipse(x, y, ellipseSizeone, ellipseSizetwo);
if(y>height){
x = random(800);
y = 0;
}
}
}
我建议将问题简化为简单的轴对齐有界框相交测试。我足以用一个盒子近似椭圆,进行交集测试。请注意,稍后可以应用椭圆和矩形的精确交集检验。
将交集测试方法添加到类Meteor
:
class Meteor {
// .....
boolean intersect(float rx, float ry, float rw, float rh) {
return
(x + ellipseSizeone/2.0f) > rx &&
(rx + rw) > (x - ellipseSizeone/2.0f) &&
(y + ellipseSizetwo/2.0f) > ry &&
(ry + rh) > (y - ellipseSizetwo/2.0f);
}
}
使用类型boolean
的变量来通知交集和。 检查每个对象是否与矩形相交,在循环和中。交集测试的结果必须由逻辑或运算(||
(连接。如果一个对象与矩形相交,则可以中止测试:
void draw() {
boolean hit = false;
for (int i = 0; hit == false && i < fall.length; i+=3) {
hit = hit || fall[i].intersect(direction1, 450, heightWidth, heightWidth);
}
if ( hit )
background(255, 0, 0);
else
background(0);
// .....
}
请注意,为了获得准确的结果,在绘制物体后,应递增下落物体的 y 位置,因为交叉测试测试的是当前位置而不是下一个位置。
当然,在下一帧更新矩形的位置之前,绘制矩形。
全draw
功能:
void draw() {
boolean hit = false;
for (int i = 0; hit == false && i < fall.length; i+=3) {
hit = hit || fall[i].intersect(direction1, 450, heightWidth, heightWidth);
}
if ( hit )
background(255, 0, 0);
else
background(0);
rect(direction1, 450, heightWidth, heightWidth);
fill(0,20);
rect(0,0,800,500);
direction1+=speedX;
if (direction1 > width-bounceSize) {
direction1 = width-bounceSize;
speedX = -12;
}
if (direction1 < 0) {
direction1 = 0;
speedX = 12;
}
for (int i = 0; i < fall.length; i+=3) {
fall[i].fall();
}
fill(0,255,0);
}
全class Meteor
:
class Meteor {
float x = random(800);
float y = random(-500);
void fall() {
fill(random(200),0,0);
ellipse(x, y, ellipseSizeone, ellipseSizetwo);
y = y + 3;
if(y>height){
x = random(800);
y = 0;
}
}
boolean intersect(float rx, float ry, float rw, float rh) {
return
(x + ellipseSizeone/2.0f) > rx &&
(rx + rw) > (x - ellipseSizeone/2.0f) &&
(y + ellipseSizetwo/2.0f) > ry &&
(ry + rh) > (y - ellipseSizetwo/2.0f);
}
}