• 编辑-这里的代码看起来很奇怪,所以我建议直接在给定的链接中查看文件。

  • 使用引擎时,遇到一个无法解决的问题。希望在不做任何重大修改的情况下解决此问题,代码如下。
    void Block::DoCollision(GameObject* obj){
     obj->DoCollision(this);
    }
    

    那就是堆栈溢出发生的地方。在我使用new关键字创建该类的两个实例之前,该应用程序运行良好。如果我只有该类的1个实例,则效果很好。
    Block* a = new Block(0, 0, 0, 5);
    AddGameObject(a);
    a = new Block(30, 0, 0, 5);
    AddGameObject(a);
    

    这些参数只是x,y,z和大小。

    事先检查代码。只有具有匹配的Collisonflag和碰撞类型的对象才会触发DoCollision();。功能。
    ((*list1)->m_collisionFlag & (*list2)->m_type)
    

    也许我的支票搞砸了。我在这里附加了有关文件http://celestialcoding.com/index.php?topic=1465.msg9913;topicseen#new。您无需注册即可下载它们。主要的嫌疑人,我还粘贴了下面的代码。

    来自GameManager.cpp
    void GameManager::Update(float dt){
     GameList::iterator list1;
    
     for(list1=m_gameObjectList.begin(); list1 != m_gameObjectList.end(); ++list1){
      GameObject* temp = *list1;
    
      // Update logic and positions
      if((*list1)->m_active){
       (*list1)->Update(dt);
     //  Clip((*list1)->m_position); // Modify for bounce affect
      } else continue;
    
      // Check for collisions
      if((*list1)->m_collisionFlag != GameObject::TYPE_NONE){
       GameList::iterator list2;
       for(list2=m_gameObjectList.begin(); list2 != m_gameObjectList.end(); ++list2){
        if(!(*list2)->m_active)
         continue;
        if(list1 == list2)
         continue;
        if( (*list2)->m_active &&
         ((*list1)->m_collisionFlag & (*list2)->m_type) &&
         (*list1)->IsColliding(*list2)){
          (*list1)->DoCollision((*list2));
        }
       }
      }
      if(list1==m_gameObjectList.end()) break;
     }
     GameList::iterator end    = m_gameObjectList.end();
     GameList::iterator newEnd = remove_if(m_gameObjectList.begin(),m_gameObjectList.end(),RemoveNotActive);
     if(newEnd != end)
            m_gameObjectList.erase(newEnd,end);
    }
    
    void GameManager::LoadAllFiles(){
     LoadSkin(m_gameTextureList, "Models/Skybox/Images/Top.bmp",   GetNextFreeID());
     LoadSkin(m_gameTextureList, "Models/Skybox/Images/Right.bmp",  GetNextFreeID());
     LoadSkin(m_gameTextureList, "Models/Skybox/Images/Back.bmp",  GetNextFreeID());
     LoadSkin(m_gameTextureList, "Models/Skybox/Images/Left.bmp",  GetNextFreeID());
     LoadSkin(m_gameTextureList, "Models/Skybox/Images/Front.bmp",  GetNextFreeID());
     LoadSkin(m_gameTextureList, "Models/Skybox/Images/Bottom.bmp",  GetNextFreeID());
     LoadSkin(m_gameTextureList, "Terrain/Textures/Terrain1.bmp",  GetNextFreeID());
     LoadSkin(m_gameTextureList, "Terrain/Textures/Terrain2.bmp",  GetNextFreeID());
     LoadSkin(m_gameTextureList, "Terrain/Details/TerrainDetails.bmp", GetNextFreeID());
     LoadSkin(m_gameTextureList, "Terrain/Textures/Water1.bmp",   GetNextFreeID());
    
    
    
    
     Block* a = new Block(0, 0, 0, 5);
     AddGameObject(a);
     a = new Block(30, 0, 0, 5);
     AddGameObject(a);
     Player* d = new Player(0, 100,0);
     AddGameObject(d);
    }
    
    
    
    void Block::Draw(){
    
     glPushMatrix();
      glTranslatef(m_position.x(), m_position.y(), m_position.z());
      glRotatef(m_facingAngle, 0, 1, 0);
      glScalef(m_size, m_size, m_size);
      glBegin(GL_LINES);
       glColor3f(255, 255, 255);
       glVertex3f(m_boundingRect.left, m_boundingRect.top, m_position.z());
       glVertex3f(m_boundingRect.right, m_boundingRect.top, m_position.z());
       glVertex3f(m_boundingRect.left, m_boundingRect.bottom, m_position.z());
       glVertex3f(m_boundingRect.right, m_boundingRect.bottom, m_position.z());
    
       glVertex3f(m_boundingRect.left, m_boundingRect.top, m_position.z());
       glVertex3f(m_boundingRect.left, m_boundingRect.bottom, m_position.z());
       glVertex3f(m_boundingRect.right, m_boundingRect.top, m_position.z());
       glVertex3f(m_boundingRect.right, m_boundingRect.bottom, m_position.z());
      glEnd();
     //  DrawBox(m_position.x(), m_position.y(), m_position.z(), m_size, m_size, m_size, 8);
     glPopMatrix();
    }
    
    void Block::DoCollision(GameObject* obj){
     GameObject* t = this;   // I modified this to see for sure that it was causing the mistake.
    // obj->DoCollision(NULL); // Just revert it back to
    /*
    void Block::DoCollision(GameObject* obj){  
           obj->DoCollision(this);  
        }  
        */
    
    }
    

    最佳答案

    堆栈溢出通常来自无限递归。我在解析您的问题时遇到了麻烦,但这是一个猜测:

    void Block::DoCollision(GameObject* obj){
      if (this != obj) {
        obj->DoCollision(this);
      }
    }
    

    关于c++ - 使用 'new'创建实例后出现堆栈溢出错误,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2573541/

    10-11 10:38