2011-01-14 29 views
0

私は衝突検出機能を持っていますが、何らかの理由でプレーヤが地面1フレームに入り、次のフレームで飛び出してから落ちたようです。私は例としてだけY方向を使用して、衝突検出衝突検出のバウンスの問題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を元に戻すとcollisionDepth.Yはあなたが地面に交差していることを示している場合は、おそらくあなただけで戻ってオブジェクトをプッシュする必要があり、Yを元に戻すべきではありませんcollisionDepth

でオブジェクトを押し出す衝突あなたが地面にぶつかってしまう深さの量。

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