0

无论出于什么原因,只要这个对象(圆圈)向左移动(-x),它就会粘在墙上,但是当它向右移动时,它会正常运行。我将包含问题的图片以及相关代码。球有重力,在右墙上时可以正常下落,但在左墙上则停留在空中。

该代码是一个处理任何调用它的重力/物理的函数。上半部分(在isPlayer之后)是处理玩家重力的,所以可以忽略,但是在“else”之后是相关代码开始的地方

球没有卡在墙上
球卡在了墙上

这是相关的代码:

/*
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;
    }
}

}

4

1 回答 1

0

我将根据我所看到的做出有根据的猜测。我不知道你的边界框大小是多少。

  • 您的代码检查对象右侧的任何内容都检查到左侧太远了。
  • 您对对象左侧的代码检查不够远。如果您的对象速度为 7 并且您只检查对象左侧的 6 个像素,那么您最终可能会进入墙内,这将允许您的代码向右检查以检测墙。
  • 如果您只检查某些点而不是边界框,那么您可能只是通过对象而不检测它,具体取决于墙壁的宽度。我会为这种事情使用collision_rectangle。

我还将学习封装和关注点分离的基础知识。通过将代码放入单独的函数中,您可以更轻松地调试和阅读。

于 2014-09-12T05:06:31.143 回答