Arrays 处理中数组中的矩形碰撞检测
所以我是一个非常新的程序员,我正试图找出如何在数组中获得矩形来检测碰撞。我试着去想,并找到了一些我认为可行的例子,但到目前为止还没有 这是我的代码,不太多 有时当盒子朝向屏幕顶部时,我会收到信息,但不知道为什么Arrays 处理中数组中的矩形碰撞检测,arrays,processing,collision,Arrays,Processing,Collision,所以我是一个非常新的程序员,我正试图找出如何在数组中获得矩形来检测碰撞。我试着去想,并找到了一些我认为可行的例子,但到目前为止还没有 这是我的代码,不太多 有时当盒子朝向屏幕顶部时,我会收到信息,但不知道为什么 Box [] b = new Box[1]; float x,y,w,h; void setup(){ size(800,800); x=random(width); y=random(height); w=random(200); h=random(200);
Box [] b = new Box[1];
float x,y,w,h;
void setup(){
size(800,800);
x=random(width);
y=random(height);
w=random(200);
h=random(200);
b[0] = new Box(x,y,w,h);
}
void draw(){
background(0);
x=random(width);
y=random(height);
w=25;
h=25;
for(int j = 0; j<b.length;j++){
for(int k = 0; k<b.length;k++){
if(j!=k){
b[j].contact(b[k]);
}
}
}
for(int i=0;i<b.length;i++){
b[i].run();
}
}
void keyPressed(){
if(key =='n'){
Box boxnew = new Box(x,y,w,h);
b = (Box[]) append(b,boxnew);
}
}
class Box{
float x,y,w,h,c1,c2,c3,ii,xmo,ymo;
Box(float mx,float my,float mw,float mh){
x=mx;
y=my;
w=mw;
h=mh;
c1=150;
c2=50;
c3=200;
xmo=1;
ymo=1;
}
void run(){
maker();
mover();
wcolli();
}
void maker(){
ii=random(-1,1);
c1+=ii;
c2+=ii;
c3+=ii;
fill(c1,c2,c3);
rect(x,y,w,h);
}
void mover(){
x+=xmo;
y+=ymo;
}
void wcolli(){
if(x>800-w||x<1){
xmo*=-1;
}
if(y>800-h||y<1){
ymo*=-1;
}
}
void contact(Box b){
if((b.x>=this.x&&b.x<=this.w||b.w>=this.x&&b.w<=this.x) && (b.h>=this.y||b.y<=this.h)){
println("hit");
}
if((b.y<=this.h&&b.y>=this.y||b.h<=this.h&&b.h>=this.y) && (b.x<=this.w||b.w>=this.x)){
println("hit");
}
}
}
Box[]b=新框[1];
浮动x,y,w,h;
无效设置(){
尺寸(800800);
x=随机(宽度);
y=随机(高度);
w=随机(200);
h=随机(200);
b[0]=新框(x,y,w,h);
}
作废提款(){
背景(0);
x=随机(宽度);
y=随机(高度);
w=25;
h=25;
对于(int j=0;j碰撞检测中存在一些问题。最重要的是,您试图使用宽度和高度(w
和h
)好像它们是绝对位置。它们实际上是相对于每个框的左上角的,所以这就是为什么事情似乎不起作用。在进行任何比较之前,您必须计算实际的右下角位置
您还必须非常小心您的if
条件。当您与OR(&&
和|
等)组合时,最好使用括号来阐明逻辑操作的优先级
对于这样简单的轴对齐矩形碰撞,我发现以下方法很有用:
无效联系人(框b){
//计算长方体的右下角。
浮动myX2=x+w;
浮动MY2=y+h;
浮点数x2=b.x+b.w;
浮动其他y2=b.y+b.h;
//如果此框完全位于框b的左侧,则不会发生碰撞。
如果(xotherX2&&myX2>otherX2)返回;
//如果此框完全位于框b上方,则不会发生碰撞。
如果(yotherY2&&myY2>otherY2)返回;
//如果我们达到这一点,盒子就不会彼此错过。
//因此,一定会发生碰撞。
println(“hit”);
}
这是通过检查一个框可能遗漏另一个框的所有可能情况来确定碰撞。如果确定它们没有遗漏,则逻辑上一定存在碰撞。问题相关。。