我试图让一个物体与两个障碍中的任何一个碰撞并设置其位置,但是无论何时我通过它们中的任何一个,它都在记录碰撞,老实说,我让自己非常困惑,不知道是什么在这一点上是错误的。这是我正在使用的代码,与其他代码无关:
int[] player1;
int[] player2;
int p1width = 50;
int p1height = 50;
int sandbagwidth = 30;
int sandbagheight = 200;
int sand11 =200;
int sand12 = 0;
int sand21 =200;
int sand22 = 400;
void setup(){
size(1200, 600);
player1= new int[] {250, 250};
}
void draw(){
//draw players
fill(0);
rect(0,0,width/2,height);
fill(255,0,0);
rect(600,0,width/2,height);
//move players
fill(255);
rect(player1[0], player1[1], p1width, p1height);
if (keyPressed) {
switch(keyCode) {
case LEFT:
player1[0] -=10;
break;
case RIGHT:
player1[0] +=10;
break;
case UP:
player1[1] -=10;
break;
case DOWN:
player1[1] +=10;
break;
}
}
if(player1[0]+25>1150){
player1[0]-=25;
}
if(player1[0]-25<0){
player1[0]+=50;
}
if(player1[1]+25>550){
player1[1]-=25;
}
if(player1[1]-25<0){
player1[1]+=50;
}
//COLLISION
fill(0,255,0);
rect(sand11, sand12, sandbagwidth, sandbagheight);
fill(0,255,0);
rect(sand21, sand22, sandbagwidth, sandbagheight);
if(player1[0] + p1width/2 > sand11 - sandbagwidth/2
&& player1[0] - p1width/2 < sand11 + sandbagwidth/2
&& player1[1] + p1height/2 > sand12 - sandbagheight/2
&& player1[1] - p1height/2 < sand12 + sandbagheight/2){
player1[0]=220;
player1[1]=250;
}
if(player1[0] + p1width/2 > sand21 - sandbagwidth-25
&& player1[0] - p1width/2 < sand21 + sandbagwidth-25
&& player1[1] + p1height/2 > sand22 - sandbagheight-25
&& player1[1] - p1height/2 < sand22 + sandbagheight-25){
player1[0]=50;
player1[1]=50;
}
}
答案 0 :(得分:1)
在我看来,您在绘制时使用player1
,sandXX
等作为左上角,但在计算碰撞时将其用作中心(除非您有{{1 }}调用您未包含的代码)。这很容易导致您的错误-即使底部没有可见的缝隙,也请尝试通过底部的沙袋。
Nitpick:您还可以在常量和计算值之间切换;从长远来看,即使它在这里起作用,它也会咬你。例如,rectMode
应该是rect(600,0,width/2,height)
。碰撞响应代码中的rect(width/2,0,width/2,height)
是被基于您的变量的计算所取代的更好的选择。