3

我写了一个小程序,当实现时停止一个小正方形穿过一个更大的矩形。

调用该collision()函数时,它会检查形状是否发生碰撞。目前它执行以下操作:

  • 当正方形up向形状移动时,它不会通过。(应该是这样)
  • 当正方形down向形状移动时,它不会通过。(应该是这样)
  • 向形状移动right时,它不会通过。(但它向上移动一键)
  • 向形状移动left时,它不会通过。(但它一键向左移动,一键向上移动)(见图)

毛刺

这是我的collision()功能:

if     (sprite_Bottom +y_Vel <= plat_Top    ){return false;}
else if(sprite_Top    +y_Vel >= plat_Bottom ){return false;}
else if(sprite_Right  +x_Vel <= plat_Left   ){return false;}
else if(sprite_Left   +x_Vel >= plat_Right  ){return false;}
//If any sides from A aren't touching B
return true;

这是我的move()功能:

   if(check_collision(sprite,platform1) || check_collision(sprite,platform2)){ //if colliding...
    if     (downKeyPressed ){ y_Vel += speed; downKeyPressed  = false;} //going down
    else if(upKeyPressed   ){ y_Vel -= speed; upKeyPressed    = false;} //going up
    else if(rightKeyPressed){ x_Vel -= speed; rightKeyPressed = false;} //going right
    else if(leftKeyPressed ){ x_Vel += speed; leftKeyPressed  = false;} //going left
   }
   glTranslatef(sprite.x+x_Vel, sprite.y+y_Vel, 0.0); //moves by translating sqaure

我希望leftandright碰撞与 and 一样up工作down。我的代码对每个方向都使用相同的逻辑,所以我不明白它为什么这样做......

4

2 回答 2

0

我认为你应该首先检查你的精灵的角落是否有碰撞。然后,如果您的平台比您的精灵厚,则不需要进一步检查。否则检查你的精灵的每一面是否与平台发生碰撞。

if ((plat_Bottom <= sprite_Bottom + y_Vel && sprite_Bottom  + y_Vel <= plat_Top)
    && (plat_Left <= sprite_Left + x_Vel && sprite_Left + x_Vel <= plat_Right))
    // then the left-bottom corner of the sprite is in the platform
    return true;

else if ... // do similar checking for other corners of the sprite.
else if ... // check whether each side of your sprite collides with the platform

return false;
于 2013-03-25T14:46:42.127 回答
0

原因似乎是因为您在检查碰撞后将速度添加到速度中。

这是一个问题,因为您在碰撞期间正在测试旧版本的速度。然后,您将您speed的速度添加到可能使精灵发生碰撞的速度。如果您要在碰撞后将速度添加到速度,那么您还需要将速度合并到碰撞算法中。

collision()在你的函数中试试这个:

int xDelta = x_Vel + speed;
int yDelta = y_Vel + speed;

if     (sprite_Bottom +yDelta <= plat_Top    ){return false;}
else if(sprite_Top    +yDelta >= plat_Bottom ){return false;}
else if(sprite_Right  +xDelta <= plat_Left   ){return false;}
else if(sprite_Left   +xDelta >= plat_Right  ){return false;}

//If any sides from A aren't touching B
return true;
于 2013-03-25T14:54:00.147 回答