使用引擎时,遇到一个无法解决的问题。希望在不做任何重大修改的情况下解决此问题,代码如下。
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/