2013-06-29 3 views
2

스프라이트를 사용하는 간단한 DirectX 9 2d 게임에서 작업 중입니다. 필자는 책과 온라인에서 발견 한 코드 스 니펫을 하나의 작은 엔진으로 작성하여 응용 프로그램의 충돌 감지 요소까지 전달했습니다.충돌 감지 중 스택 오버플로 오류

void Game::UpdateSprite(int e) 
{ 
    UINT collision; 
    for(int f = 0; f < MAX_SPRITES; f++) 
    { 
    if(m_Sprites[f].occupied && m_Sprites[e].occupied && f != e) 
    { 
     collision = IsCollision(f, e); 

     switch (collision) 
     { 
     case BOTTOM: 
      m_Sprites[e].movey *= -1; 
      m_Sprites[f].movey *= -1; 
      break; 

     case TOP: 
      m_Sprites[e].movey *= -1; 
      m_Sprites[f].movey *= -1; 
      break; 

     case RIGHT: 
      m_Sprites[e].movex *= -1; 
      m_Sprites[f].movex *= -1; 
      break; 

     case LEFT: 
      m_Sprites[e].movex *= -1; 
      m_Sprites[f].movex *= -1; 
      break; 

     case NOCOLLISION: 
      break; 
     } 
     UpdateSprite(e); 
     UpdateSprite(f); 
    } 
    } 
} 

답변

3

UpdateSprite의 바닥에서 UpdateSprite에 대한 호출을 제거 또한 여기

UINT Game::IsCollision(int a, int b) 
{ 
    if(a != b) 
    { 
    if((m_Sprites[a].posrect.bottom >= m_Sprites[b].posrect.top) && (m_Sprites[a].posrect.top <= m_Sprites[b].posrect.bottom) && (m_Sprites[a].posrect.right >= m_Sprites[b].posrect.left) && (m_Sprites[a].posrect.left <= m_Sprites[b].posrect.right)) 
    { 
     if(m_Sprites[a].posrect.top < m_Sprites[b].posrect.top && m_Sprites[a].posrect.top < m_Sprites[b].posrect.bottom && m_Sprites[a].posrect.bottom < m_Sprites[b].posrect.bottom) 
     { 
     return BOTTOM; 
     } 
     else if(m_Sprites[b].posrect.top < m_Sprites[a].posrect.top && m_Sprites[a].posrect.top < m_Sprites[b].posrect.bottom && m_Sprites[b].posrect.bottom < m_Sprites[a].posrect.bottom) 
     { 
     return TOP; 
     } 
     else if(m_Sprites[a].posrect.left < m_Sprites[b].posrect.left && m_Sprites[b].posrect.left < m_Sprites[a].posrect.right && m_Sprites[a].posrect.right < m_Sprites[b].posrect.right) 
     { 
     return RIGHT; 
     } 
     else if(m_Sprites[b].posrect.left < m_Sprites[a].posrect.left && m_Sprites[a].posrect.left < m_Sprites[b].posrect.right && m_Sprites[b].posrect.right < m_Sprites[a].posrect.right) 
     { 
     return LEFT; 
     } 
    } 
    else 
    { 
     return NOCOLLISION; 
    } 
    } 
    return NOCOLLISION; 
} 

내가 함수를 호출하고 어떻게 : 나는 충돌 감지를 위해 만든 기능에 스택 오버플로 오류를 수신하고 . 함수가 재귀에 대한 종료 사례없이 자체적으로 호출하면 무한 재귀 및 스택 오버플로가 발생합니다.