2011-01-14 130 views
0

因此,我得到了我的碰撞检测工作,但由于某种原因,玩家似乎将介绍地面1帧,然后在下一帧跳出来,然后按其预期跌落。碰撞检测弹跳问题c#

代码我使用的碰撞检测

 void DoCollisions() 
    { 
     onGround = false; 
     Position.Y += Velocity.Y; 
     Vector2 tileCollision = GetTileCollision(); 
     if (tileCollision.X != -1 || tileCollision.Y != -1) 
     { 
      onGround = true; 
      Vector2 collisionDepth = CollisionRectangle.DepthIntersection(
       new Rectangle(
        tileCollision.X * World.tileEngine.TileWidth, 
        tileCollision.Y * World.tileEngine.TileHeight, 
        World.tileEngine.TileWidth, 
        World.tileEngine.TileHeight 
       ) 
      ); 
      Position.Y -= Velocity.Y; 
      Velocity.Y = 0; 
      Position.Y += collisionDepth.Y; 

     } 

     Position.X += Velocity.X; 
     tileCollision = GetTileCollision(); 
     if (tileCollision.X != -1 || tileCollision.Y != -1) 
     { 
      Vector2 collisionDepth = CollisionRectangle.DepthIntersection(
       new Rectangle(
        tileCollision.X * World.tileEngine.TileWidth, 
        tileCollision.Y * World.tileEngine.TileHeight, 
        World.tileEngine.TileWidth, 
        World.tileEngine.TileHeight 
       ) 
      ); 
      Position.X -= Velocity.X; 
      Velocity.X = 0; 
      Position.X += collisionDepth.X; 

     } 
    } 

    Vector2 GetTileCollision() 
    { 
     int topLeftTileX = (int)(CollisionRectangle.TopLeft.X/World.tileEngine.TileWidth); 
     int topLeftTileY = (int)(CollisionRectangle.TopLeft.Y/World.tileEngine.TileHeight); 
     int BottomRightTileX = (int)(CollisionRectangle.DownRight.X/World.tileEngine.TileWidth); 
     int BottomRightTileY = (int)(CollisionRectangle.DownRight.Y/World.tileEngine.TileHeight); 

     for (int i = topLeftTileX; i <= BottomRightTileX; i++) 
     { 
      for (int j = topLeftTileY; j <= BottomRightTileY; j++) 
      { 
       if (World.tileEngine.TileIsSolid(i, j)) 
       { 
        return new Vector2(i,j); 
       } 
      } 
     } 

     return new Vector2(-1,-1); 
    } 

回答

2

只需使用Y方向为例,乍一看似乎你正在调整Y两次,在碰撞前检查一次,然后当你得到一个碰撞你恢复了YcollisionDepth

你可能不应该被恢复的Y,如果collisionDepth.Y表明您相交的地面,你应该只由推你的对象回推的对象了深度的数量,这会让你在地面上冲洗。

 if (tileCollision.X != -1 || tileCollision.Y != -1) 
     { 
      onGround = true; 
      Vector2 collisionDepth = CollisionRectangle.DepthIntersection(
       new Rectangle(
        tileCollision.X * World.tileEngine.TileWidth, 
        tileCollision.Y * World.tileEngine.TileHeight, 
        World.tileEngine.TileWidth, 
        World.tileEngine.TileHeight 
       ) 
      ); 
      Velocity.Y = 0; 
      // Depending on your coordinate system this should 
      // be either + or - collisionDepth.Y 
      Position.Y += collisionDepth.Y; 
     }