2013-03-30 3 views
0

작은 2D 엔진을 만들고 연습을 위해 분리 축 정리를 사용하기로 결정했습니다. 충돌 감지 및 번역 작업을 플레이어 개체와 함께 처리 할 수 ​​있지만 두 개 이상의 개체가 충돌하면 플레이어의 움직임이 멈 춥니 다. 다음은 내 문제의 예입니다.Separating Axis Theorem을 사용하는 중 다중 충돌

플레이어는 자신을 아래로 오른쪽으로 밀면서 벽을 따라 움직입니다. 플레이어가 두 개의 타일 사이의 교차점에 도달하면 더 아래로 내려갈 수 없으므로 아래 타일이 충돌을 감지하고 오른쪽 타일이 플레이어를 왼쪽으로 밀기 전에 플레이어를 밀어 올립니다. 문제는 플레이어 아래의 타일이 다른 타일보다 먼저 충돌을 테스트하고 있다고 생각하지만이 문제를 해결하는 방법을 모르겠습니다. 여기

내가 필요를 믿고 내 코드의 일부가 변경 될 수 있습니다 :

protected override void Update(GameTime gameTime) 
    { 
     gameCamera.Update(new Vector2(player._boundingBox.X, player._boundingBox.Y)); 

     foreach (Layer l in currentLevel.Layers) 
     { 
      foreach (GameObject gameObject in l.layerMapObjects) 
      { 
       gameObject.Update(gameTime); 
      } 
     } 

     player.Update(gameTime); 

     foreach (Layer l in currentLevel.Layers) 
     { 
      foreach (GameObject gameObject in l.layerMapObjects) 
      { 
       if (gameObject._isCollidable) 
       { 
        Vector2 vectorTranslation = Collision(player._boundingBox, gameObject._boundingBox); 
        player._boundingBox.X += (int)vectorTranslation.X; 
        player._boundingBox.Y += (int)vectorTranslation.Y; 
       } 
      } 
     } 

     base.Update(gameTime); 
    } 

내 충돌의 모든 지금 사각형 사이에, 그리고 충돌() 함수는 충돌을 감지하고 필요한 번역을 반환합니다 플레이어가있을 경우 이동합니다. 나는 누군가가 나를 도와 줄 수 있기를 바랍니다. 감사.

답변

1

모든 충돌이 감지되기 ​​전에 플레이어가 업데이트되는 것이 문제라면 프로세스를 일괄 처리하십시오. 그건; vectorTranslations를 적용하는 대신 즉시 목록을 작성한 다음 모든 충돌이 감지되면 플레이어에 번역 목록을 적용하십시오.

+0

나는 당신이 무슨 말을하는지 이해하고 있으며, 그 문제는 결국 두 번역이 결국 플레이어에 적용된다는 것입니다. 목록 아이디어와 함께, 나는 플레이어와 충돌하고 있던 모든 객체의 목록을 만들었고, 플레이어와의 거리가 가장 먼 객체 충돌을 해결했습니다. 그런 다음 나머지 객체를 반복하여 충돌이 발생했는지 확인합니다. 남아있는 물체가 여전히 충돌 한 경우 모든 충돌이 해결 될 때까지 프로세스를 반복합니다. 이것은 작동하는 것처럼 보이지만 더 쉬운 방법이 있다면 알려주십시오. –

+0

아, 나는 진드기 시간이 충돌이 무효화 될만큼 충분히 큰 경우를 고려하지 않았습니다. 프로세스에 대한 가장 가까운 생각, 업데이트, 다른 프로세스는 현명한 것 같습니다. 다른 속도로 움직이는 물체를 가지고 있다면 어려움이있을 것입니다. 정렬되지 않은 목록 대신 영향을 줄 수있는 순서가 지정된 대기열을 작성하여이를 최적화 할 수 있습니다. – Alan

관련 문제