为什么游戏制作者的这个对象在墙上?

时间:2014-09-12 04:45:58

标签: game-maker

无论出于何种原因,只要这个物体(圆圈)向左移动(-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;
    }
}

}

1 个答案:

答案 0 :(得分:0)

我将根据我所看到的情况做出有根据的猜测。我不知道你的边框尺寸是多少。

  • 检查对象右边任何内容的代码是在左边稍微检查一下。
  • 检查对象左侧的代码是否检查得不够远。如果您的对象速度为7并且您只检查对象左侧的6个像素,那么您可以最终进入墙内,这将允许您的代码检查右侧以检测墙。
  • 如果您只检查某些点而不是边界框,那么您可能只是在没有检测到的情况下传递对象,具体取决于墙的宽度。我会使用collision_rectangle来做这类事情。

此外,我将学习封装和分离问题的基础知识。通过将代码放入单独的函数中,您可以更轻松地进行调试和阅读。