2013-02-27 2 views
1

현재 XNA에 플랫폼 게임을 작성 중입니다. 충돌 테스트는 현재 foreach 루프를 실행하여 플레이어의 테두리 상자를 모든 타일의 테두리 상자로 테스트하여 작동합니다. 그러나 플레이어가 어떤 블록을 만지지 않고 있는지 테스트하는 방법을 알 수는 없습니다.XNA의 비 충돌 타일 테스트하기

플레이어가 공중에 있는지 확인할 수 있도록 플레이어가 아무 블록도 건드리지 않는지 테스트하려면 어떻게해야합니까? 어떤 도움이나 조언이라도 대단히 감사하겠습니다. 미리 감사드립니다. /////////////////////////////////////

내 충돌 코드는

입니다
if (personRectangle.TouchTopOf(newRectangle)) 
    { 
     onGround = true; 
     test = false; 
     test2 = true; 
    } 

대응 BOOL 시험

public static bool TouchTopOf(this Rectangle r1, Rectangle r2) 
    { 
     return (r1.Bottom >= r2.Top - 1 && 
       r1.Bottom <= r2.Top + (r2.Height/2) && 
       r1.Right >= r2.Left + (r2.Width/5) && 
       r1.Left <= r2.Right - (r2.Width/5)); 
    } 

그리고은 Game1.cs 업데이트 코드 테스트 충돌의 조각이다. 내지도 클래스에 타일의 목록입니다

 foreach (CollisionTiles tile in map.CollisionTiles) 
      player.Collision(tile.Rectangle); 

private List<CollisionTiles> collisionTiles = new List<CollisionTiles>(); 

답변

3

는 XNA 사각형이있는 내장이 교차 방법 : 타일 사각형 통해

if (rect1.Intersects(rect2)){ 
... 
} 

단지 루프 교차 전화 각각에. 좀 더 효율적으로 사용하려면 플레이어 좌표를 세계 좌표로 매핑하고 플레이어에 가장 가까운 타일을 결정해야합니다. 이렇게하면 반복 할 타일의 수를 줄일 수 있습니다.

편집 : 명확한 설명을 위해, 당신은 할 수 :

bool collision=false; 
foreach (CollisionTiles tile in map.CollisionTiles) { 
    if(personRectangle.Intersects(tile.Rectangle)) { 
     collision =true; 
     break; 
    } 
} 

는 그런 충돌에 해당하는 경우 어딘가에 충돌이 있었는지 알고.

+0

내가 무슨 뜻인지 잘 모르겠다. 현재 경계를 테스트하기 위해 rectangle.Top 등의 메서드를 사용하고 있습니다. 그러나 모든 블록을 테스트하고 일부 블록을 만지기 때문에 다른 블록을 만져서 혼란스러워 지므로 if (true) 및 else (false)가 트리거됩니다. 내가 어떤 블록을 만지지 않고 있는지 테스트 해보고 싶습니다. – Brecon

+0

@Brecon 내 편집을 참조하십시오. –

0

이유가없는 한 간단하게하십시오. 충돌 한 물건 몇 개를 추적하십시오. 당신의 카운트가 0이된다면 아무 것도 충돌하지 않았을 것입니다. 전혀 충돌 경우 충돌 방법 안에 그런

int touchedCount = 0; 
foreach (CollisionTiles tile in map.CollisionTiles) 
{ 
     if (player.Collision(tile.Rectangle)) 
     { 
      touchedCount++; 
     } 
} 

if (touchedCount == 0) 
{ 
    //You did not collide with anything 
} 

수표를 추적 할 비슷한 일을하고 :

/수정 당신이 가지고있는 코드의 최적화에 대한 걱정없이, 그것은 같은 것이 될 수있다 . 다른 해답처럼 Rectangle.Intersects를 사용하는 것이 가장 쉽습니다.

+0

코드가 올바르지 않습니다. 충돌하지 않으면 코드가 잘못됩니다. touchCount가 0이 아닙니다. if의 내부에 증분을 넣을 수는 있지만 다른 쪽의 충돌은 감지되지 않습니다 –

+0

Hah. 그 생각으로도 내 코드가 잘못되었습니다. 지금 무슨 뜻인지 알 겠어. 제 편집이 여전히 문제를 해결했다고 생각합니다. 다시 한 번 감사드립니다! – SpartanDonut