2011-01-14 3 views
0

충돌 감지 기능이 작동하지만 어떤 이유로 플레이어가 지상 1 프레임을 소개 한 다음 다음 프레임에서 해당 신호로 점프 한 다음 예상대로 떨어지는 것으로 보입니다.충돌 감지 수신 거부 문제 C#

코드 내가 예를 들어 단지 Y 방향을 사용하여 충돌 감지

 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

collisionDepth.Y 당신이 단지에 의해 다시 개체를 밀어해야 땅을 교차하고 있음을 나타냅니다 경우 당신은 아마의 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; 
     }