خطأ في التدفق بعد إنشاء مثيل باستخدام "جديد"
-
24-09-2019 - |
سؤال
- تحرير - يبدو الرمز غريبًا هنا ، لذلك أقترح عرض الملفات مباشرة في الرابط الوارد.
أثناء العمل على محركي ، صادفت مشكلة لا أستطيع حلها. على أمل إصلاح هذا دون أي تعديل ثقيل ، يكون الرمز أدناه.
void Block::DoCollision(GameObject* obj){
obj->DoCollision(this);
}
هذا هو المكان الذي يحدث فيه فائض المكدس. يعمل هذا التطبيق بشكل جيد تمامًا حتى أقوم بإنشاء حالتين من الفصل باستخدام الكلمة الرئيسية الجديدة. إذا كان لدي حالة واحدة فقط من الفصل ، فقد عملت بشكل جيد.
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);
}
}