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

在我的引擎上工作时,我遇到了一个我无法解决的问题。希望在不进行任何重大修改的情况下解决此问题,代码如下。

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

这就是发生堆栈溢出的地方。在我使用 new 关键字创建类的两个实例之前,此应用程序运行良好。如果我只有一个类的实例,它工作得很好。

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);  
    }  
    */

}
4

1 回答 1

4

堆栈溢出通常来自无限递归。我无法解析您的问题,但这里有一个猜测:

void Block::DoCollision(GameObject* obj){
  if (this != obj) {
    obj->DoCollision(this);
  }
}
于 2010-04-04T04:21:07.647 回答