预期目标的碰撞改为仅沿轴碰撞
Collision for intended target is instead colliding along axis only
我试图让一个物体与两个障碍物中的任何一个碰撞并设置它的位置,但是每当我经过其中一个障碍物时它就会记录碰撞,老实说,我很困惑自己并且没有知道此时出了什么问题。这是我正在使用的代码,与其他所有代码分开:
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;
}
}
在我看来,您使用 player1
、sandXX
等作为绘图时的左上角,但在计算碰撞时作为中心(除非您有 rectMode
调用你没有包含的代码)。这很容易导致你的错误 - 尝试通过底部的底部沙袋,即使那里没有可见的缝隙。
吹毛求疵:你还在常量和计算值之间切换;这会在很长一段时间 运行 中咬你一口,即使它在这里有效。例如,rect(600,0,width/2,height)
可能应该是 rect(width/2,0,width/2,height)
。碰撞响应代码中的 player1[0]=220
更适合替换为基于您的变量的计算。
我试图让一个物体与两个障碍物中的任何一个碰撞并设置它的位置,但是每当我经过其中一个障碍物时它就会记录碰撞,老实说,我很困惑自己并且没有知道此时出了什么问题。这是我正在使用的代码,与其他所有代码分开:
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;
}
}
在我看来,您使用 player1
、sandXX
等作为绘图时的左上角,但在计算碰撞时作为中心(除非您有 rectMode
调用你没有包含的代码)。这很容易导致你的错误 - 尝试通过底部的底部沙袋,即使那里没有可见的缝隙。
吹毛求疵:你还在常量和计算值之间切换;这会在很长一段时间 运行 中咬你一口,即使它在这里有效。例如,rect(600,0,width/2,height)
可能应该是 rect(width/2,0,width/2,height)
。碰撞响应代码中的 player1[0]=220
更适合替换为基于您的变量的计算。