无论出于何种原因,只要这个物体(圆圈)向左移动(-x),它就会粘在墙上,但是当它向右移动时,它就会发挥作用。我将包括问题的图片以及相关代码。球具有重力,在右壁上正确落下,但留在左墙上的空气中。
代码是一个函数,可以处理任何调用它的重力/物理。上半部分(在isPlayer之后)是处理玩家的重力,因此可以忽略,但在“else”之后是相关代码开始的地方
Ball not stuck in wall
Ball stuck in wall
以下是相关代码:
/*
runPhys(collision object, phys object, xVil, yVil, grav, environment x, environment y, isPlayer(1=player))
*/
obj=argument0;
physObj=argument1;
xVal=argument2;
yVal=argument3;
grav=argument4;
xEnv=argument5;
yEnv=argument6;
isPlayer=argument7;
with physObj{
if(isPlayer = 1){ //can ignore from here to
ySpeed = ySpeed + yVal + grav;
xAcc = xAcc+xVal;
if(xAcc>5){
xAcc = 5;
}
if(xAcc<-5){
xAcc = -5;
}
if(position_meeting(x,y+14,obj)){
xSpeed = 0;
xAcc = 0;
if(xVal = -0.2){
xAcc = -5;
}
if(xVal = 0.2){
xAcc = 5;
}
}
xSpeed = xAcc;
if(xSpeed>0){
if((!position_meeting(x+xSpeed+6,y,obj))&&(!position_meeting(x+xSpeed+6,y+12,obj))&&(!position_meeting(x+xSpeed+6,y-12,obj))){
x = x + xSpeed;
}else{
xSpeed = 0;
xAcc = 0;
}
}else{
if((!position_meeting(x-xSpeed-12,y,obj))&&(!position_meeting(x-xSpeed-12,y+12,obj))&&(!position_meeting(x-xSpeed-12,y-12,obj))){
x = x + xSpeed;
}else{
xSpeed = 0;
xAcc = 0;
}
}
if(ySpeed>0){
if(!position_meeting(x,y+ySpeed+12,obj)){
y = y + ySpeed;
}else{
ySpeed = 0;
}
}else{
if(!position_meeting(x,y-ySpeed-24,obj)){
y = y + ySpeed;
}else{
ySpeed = 0;
}
}
if(position_meeting(x,y+12,obj)){
y = y-1;
}
xSpeed = xSpeed/1.02;
}else{ //here, everything above here can be ignored
ySpeed = ySpeed + yVal + grav;
xSpeed = xSpeed + xVal;
if(xSpeed>0){ //the if below checks 3 positions according to the objects bounding box, in this case its checking the right top, right middle, and right bottom of the sprite
if((!position_meeting(x+xSpeed+(bbox_right-bbox_left)/2,y,obj))&&(!position_meeting(x+xSpeed+(bbox_right-bbox_left)/2,y+(bbox_bottom-bbox_top)/2,obj))&&(!position_meeting(x+xSpeed+(bbox_right-bbox_left)/2,y-(bbox_bottom-bbox_top)/2,obj))){
x = x + xSpeed;
}else{
xSpeed = 0;
xAcc = 0;
}
}else{ //this is where I believe the error to be. The above code handles moving to the right, and the below code handles moving to the left, where my problem is.
if((!position_meeting(x-xSpeed-((bbox_right-bbox_left)/2),y,obj))&&(!position_meeting(x-(xSpeed*2)-((bbox_right-bbox_left)/2),y+(bbox_bottom-bbox_top)/2,obj))&&(!position_meeting(x-(xSpeed*2)-((bbox_right-bbox_left)/2),y-(bbox_bottom-bbox_top)/2,obj))){
x = x + xSpeed;
}else{
xSpeed = 0;
xAcc = 0;
}
}
if(ySpeed>0){ //this is all y movement
if((!position_meeting(x,y+ySpeed+(bbox_bottom-bbox_top)/2,obj))&&(!position_meeting(x+(bbox_right-bbox_left)/2,y+ySpeed+(bbox_bottom-bbox_top)/2,obj))&&(!position_meeting(x-(bbox_right-bbox_left)/2,y+ySpeed+(bbox_bottom-bbox_top)/2,obj))){
y = y + ySpeed;
}else{
ySpeed = 0;
xSpeed = 0;
}
}else{
if((!position_meeting(x,y-ySpeed-(bbox_bottom-bbox_top)/2,obj))&&(!position_meeting(x+(bbox_right-bbox_left)/2,y-ySpeed-(bbox_bottom-bbox_top)/2,obj))&&(!position_meeting(x-(bbox_right-bbox_left)/2,y-ySpeed-(bbox_bottom-bbox_top)/2,obj))){
y = y + ySpeed;
}else{
ySpeed = 0;
xSpeed = 0;
}
}
if(position_meeting(x,y+(bbox_bottom-bbox_top)/2,obj)){
y = y-1;
xSpeed = 0;
}
}
}
答案 0 :(得分:0)
我将根据我所看到的情况做出有根据的猜测。我不知道你的边框尺寸是多少。
此外,我将学习封装和分离问题的基础知识。通过将代码放入单独的函数中,您可以更轻松地进行调试和阅读。