c++ - 冲突检测期间堆栈溢出错误

标签 c++ collision-detection stack-overflow

我正在使用 Sprite 开发一个简单的 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);
    }
  }
}

最佳答案

从 UpdateSprite 底部删除对 UpdateSprite 的调用。当函数在没有递归终止情况的情况下调用自身时,您将获得无限递归和堆栈溢出。

关于c++ - 冲突检测期间堆栈溢出错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17376174/

相关文章:

c++ - BIO 不会刷新 OpenSSL 中的数据

java - Stackoverflow 在 Map 上调用 metaClass 方法

c# - 为什么我的数组初始化代码会导致抛出 StackOverflowException?

c++ - 在 TicTacToe 类中使用 char 数组的意外输出

c++ - 使用模板图像匹配具有比例、旋转变化和使用 opencv 的部分遮挡的目标

javascript - 只要一个对象在 Phaser 3 中与另一个对象发生碰撞,如何播放动画?

c++ - 二维碰撞检测分辨率

java - 需要帮助检测两个物体之间的碰撞

scala - 可遍历递归节点结构

c++ - Qt从子方法更新文本框