2013-07-09 3 views
0

저는 현재 매우 간단한 Sprite to Spice 충돌 감지 프로그램을 만들고 있습니다. 스틱 맨이 만지면 벽에 멈추게됩니다. 내 코드는 정상적으로 실행되지만 문제는 내 stickman 스프라이트가 왼쪽과 위 벽 (이 경우 왼쪽과 위쪽 만의 화면 높이와 화면 너비)에서 멈추지 않는다는 것입니다. 여기 내 코드가 있습니다, 당신은 문제가 어디인지 알아낼 수 있습니까? 어떻게 해결합니까?SDL 충돌 감지

bool check_CollisionWall(oSprite* Sprite1) 
{  
    //top left 
    if(Sprite1->m_vPosition.x <= 0 && Sprite1->m_vPosition.x + Sprite1->m_nFrameWidth >= SCREEN_WIDTH) 
    { 
     if(Sprite1->m_vPosition.y <= 0 && Sprite1->m_vPosition.y + Sprite1->m_nFrameHeight >= SCREEN_HEIGHT) 
     { 
      return true; 
     } 
    } 

    //top right 
    if(Sprite1->m_vPosition.x+Sprite1->m_nFrameWidth > 0 && Sprite1->m_vPosition.x+Sprite1->m_nFrameWidth >= SCREEN_WIDTH) 
    { 
     if(Sprite1->m_vPosition.y <= 0 && Sprite1->m_vPosition.y+Sprite1->m_nFrameHeight >= SCREEN_HEIGHT) 
     { 
      return true; 
     } 
    } 

    //bottom left 
    if(Sprite1->m_vPosition.x > 0 && Sprite1->m_vPosition.x + Sprite1->m_nFrameWidth <= SCREEN_WIDTH) 
    { 
     if(Sprite1->m_vPosition.y + Sprite1->m_nFrameHeight > 0 && Sprite1->m_vPosition.y + Sprite1->m_nFrameHeight <= SCREEN_HEIGHT) 
     { 
      return true; 
     } 
    } 

    //bottom right 
    if(Sprite1->m_vPosition.x + Sprite1->m_nFrameWidth > 0 && Sprite1->m_vPosition.x + Sprite1->m_nFrameWidth <= SCREEN_WIDTH) 
    { 
     if(Sprite1->m_vPosition.y + Sprite1->m_nFrameHeight > 0 && Sprite1->m_vPosition.y + Sprite1->m_nFrameHeight <= SCREEN_HEIGHT) 
     { 
      return true; 
     } 
    } 

    return false; 
} 
+0

내가 착각 할 수 있지만, 코드가 수직 경계와 수평 경계 모두에 도달하거나 동시에 초과하는 경우와 같이 충돌을 정의하기 위해 구성 될 것으로 보인다. 수직 경계가 초과되었거나 수평 경계가 초과되면 충돌 조건이 충족됩니까? –

답변

0

왼쪽, 위쪽, 오른쪽 및 아래쪽 벽과의 충돌을 확인하면됩니다. 확인해야 할 왼쪽 상단, 오른쪽 하단 조합은 없습니다.

4 가지 간단한 검사가 있습니다. X의 COORD + 스프라이트의 폭> = 오른쪽 벽 인덱스인지 확인 -

  1. 좌측 벽 충돌 - 스프라이트의 좌변 < = 0
  2. 오른쪽 벽에 충돌이 있는지 확인.
  3. & 4. 왼쪽 및 오른쪽 벽 논리와 유사하게 상단 및 하단에만 사용하십시오.

이러한 문은 if 문에 독립적입니다. if는 내가 볼 수있는 방식으로 중첩 될 필요가 없습니다.

중 하나가 양수를 반환하더라도 충돌이 발생하고 함수가 true를 반환해야합니다.

0

이렇게하면 문제를 해결할 수 있습니다. 충돌 확인은 분리되어 있습니다. 즉, 충돌이 독립적입니다. 따라서 본질적으로 왼쪽 충돌 OR 오른쪽을 검사하고 어느 쪽이든 true이면 y 방향으로 true를 반환합니다.

bool check_CollisionWall(oSprite* Sprite1) 
{ 

//left or right 
if(Sprite1->m_vPosition.x <= 0 || Sprite1->m_vPosition.x + Sprite1->m_nFrameWidth >= SCREEN_WIDTH) 
{ 
    return true; 
} 

//top or bottom 
if(Sprite1->m_vPosition.y <= 0 || Sprite1->m_vPosition.y + Sprite1->m_nFrameHeight >= SCREEN_HEIGHT) 
{ 
    return true; 
} 

return false; 
}