如何解决加工中的碰撞问题
所以我正在尝试制作一个平台游戏,而我刚刚开始研究碰撞。现在碰撞非常小故障,只有在矩形的一侧而不是顶部时才有效(如果您运行代码,这更有意义)。我想知道如何让碰撞更干净,整体故障更少。
float x = 100;
float y = 100;
float vy = 0;
float vx = 0;
boolean rightCollision = false;
boolean leftCollision = false;
void setup(){
size(700,500);
}
void draw(){
background(0);
fill(255);
rect(x,y,50,50);
y += vy;
vy += .3;
x += vx;
vx -= vx * 0.07;
if(y > 400){
vy = 0;
y = 400;
}
if(left){
x -= 1;
vx -= .5;
}
if(right){
x += 1;
vx += .5;
}
if(touching(x,400,325,100,500) && keyCode == RIGHT){
rightCollision = true;
}
else{
rightCollision = false;
}
if(rightCollision){
vx -= 2;
}
if(touching(x,500) && keyCode == LEFT){
leftCollision = true;
}
else{
leftCollision = false;
}
if(leftCollision){
vx += 2;
}
fill(167);
noStroke();
rect(0,450,1000,50);
rect(400,500);
}
boolean left = false;
boolean right = false;
void keyPressed(){
if(keyCode == RIGHT || key == 'd'){
right = true;
}
if(keyCode == LEFT || key == 'a'){
left = true;
}
if(keyCode == UP || key == 'w'){
if(y == 400){
vy -= 10;
}
}
}
void keyReleased(){
if(keyCode == RIGHT || key == 'd'){
right = false;
}
if(keyCode == LEFT || key == 'a'){
left = false;
}
}
boolean touching(float x1,float y1,float w1,float h1,float x2,float y2,float w2,float h2){
return x1 + w1 >= x2 && x2 + w2 >= x1 && y1 + h1 >= y2 && y2 + h2 >= y1;
}
解决方法
您需要在玩家移动时(vx != 0
,vy != 0
)检测碰撞,而不仅仅是在按下键时。
将移动设置为 0 并在检测到碰撞时限制玩家的位置:
int pw = 50,ph = 50;
int ox = 400,oy = 325,ow = 100,oh = 400;
topCollision = touching(x,y,pw,ph,ox,oy,ow,oh) && vy > 0.0 && y < oy;
if (topCollision){
vy = 0;
y = oy-ph;
}
rightCollision = touching(x,oh) && vx < 0.0;
if (rightCollision){
vx = 0;
x = ox+ow;
}
leftCollision = touching(x,oh) && vx > 0.0;
if (leftCollision) {
vx = 0;
x = ox-pw;
}
使用 >
代替 >=
进行碰撞检测:
boolean touching(float x1,float y1,float w1,float h1,float x2,float y2,float w2,float h2){
return x1 + w1 > x2 && x2 + w2 > x1 && y1 + h1 > y2 && y2 + h2 > y1;
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。