Pergunta

  • EDIT - O código parece estranho aqui, então sugiro visualizar os arquivos diretamente no link fornecido.

Enquanto trabalhava no meu motor, me deparei com um problema que não consigo resolver. Na esperança de corrigir isso sem nenhuma modificação pesada, o código está abaixo.

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

É aí que ocorre o excesso de pilha. Este aplicativo funciona perfeitamente bem até eu criar duas instâncias da classe usando a nova palavra -chave. Se eu tivesse apenas 1 instância da classe, funcionou bem.

Block* a = new Block(0, 0, 0, 5);
AddGameObject(a);
a = new Block(30, 0, 0, 5);
AddGameObject(a);

Esses parâmetros são apenas x, y, z e tamanho.

O código é verificado antes da mão. Somente um objeto com um tipo CollisonFlag e colisão correspondente acionará o docollision (); função.

((*list1)->m_collisionFlag & (*list2)->m_type)

Talvez meu cheque esteja bagunçado. Anexei os arquivos envolvidos aqui http://celestialcoding.com/index.php?topic=1465.msg9913; Topicseen#new. Você pode baixá -los sem precisar se inscrever. Os principais suspeitos, também colei o código para abaixo.

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

}
Foi útil?

Solução

O transbordamento da pilha geralmente vem da recursão infinita. Estou tendo problemas para analisar sua pergunta, mas aqui está um palpite:

void Block::DoCollision(GameObject* obj){
  if (this != obj) {
    obj->DoCollision(this);
  }
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top