2

スプライトを使用した単純な DirectX 9 2D ゲームに取り組んでいます。私は小さなエンジンを作成し (書籍やオンラインで見つけたいくつかのコード スニペットをつなぎ合わせました)、アプリケーションの衝突検出要素に取りかかりました。衝突検出用に作成した関数でスタック オーバーフロー エラーが発生しています。

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;
}

また、関数を呼び出す方法は次のとおりです。

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);
    }
  }
}
4

1 に答える 1

3

UpdateSprite の下部から UpdateSprite への呼び出しを削除します。関数が再帰の終了ケースなしでそれ自体を呼び出すと、無限再帰とスタック オーバーフローが発生します。

于 2013-06-29T02:56:50.683 に答える