- don't add new objects until end of Sector::action()
authorRyan Flegel <rflegel@gmail.com>
Tue, 8 Jun 2004 19:48:33 +0000 (19:48 +0000)
committerRyan Flegel <rflegel@gmail.com>
Tue, 8 Jun 2004 19:48:33 +0000 (19:48 +0000)
- fixes cases where adding a new object while iterating over the objects can cause a crash

SVN-Revision: 1436

src/sector.cpp
src/sector.h

index b9b959a..bef23cf 100644 (file)
@@ -274,7 +274,8 @@ Sector::write(LispWriter& writer)
 void
 Sector::add_object(GameObject* object)
 {
-  // XXX a bit hackish, at least try to keep the number of these things down...
+  gameobjects_new.push_back(object);
+#if 0
   BadGuy* badguy = dynamic_cast<BadGuy*> (object);
   if(badguy)
     badguys.push_back(badguy);
@@ -296,6 +297,8 @@ Sector::add_object(GameObject* object)
     interactive_objects.push_back(interactive_object);
 
   gameobjects.push_back(object);
+
+#endif
 }
 
 void
@@ -397,6 +400,35 @@ Sector::action(float elapsed_time)
       ++i;
     }
   }
+
+  /* add newly created objects */
+  for(std::vector<GameObject*>::iterator i = gameobjects_new.begin();
+      i != gameobjects_new.end(); ++i)
+  {
+          BadGuy* badguy = dynamic_cast<BadGuy*> (*i);
+          if(badguy)
+            badguys.push_back(badguy);
+          Bullet* bullet = dynamic_cast<Bullet*> (*i);
+          if(bullet)
+            bullets.push_back(bullet);
+          Upgrade* upgrade = dynamic_cast<Upgrade*> (*i);
+          if(upgrade)
+            upgrades.push_back(upgrade);
+          Trampoline* trampoline = dynamic_cast<Trampoline*> (*i);
+          if(trampoline)
+            trampolines.push_back(trampoline);
+          FlyingPlatform* flying_platform = dynamic_cast<FlyingPlatform*> (*i);
+          if(flying_platform)
+            flying_platforms.push_back(flying_platform);
+          InteractiveObject* interactive_object 
+              = dynamic_cast<InteractiveObject*> (*i);
+          if(interactive_object)
+            interactive_objects.push_back(interactive_object);
+
+          gameobjects.push_back(*i);
+  }
+  gameobjects_new.clear();
+
 }
 
 void
index fea92d3..96a2e45 100644 (file)
@@ -148,6 +148,7 @@ public: // ugly
   InteractiveObjects interactive_objects;
   typedef std::vector<GameObject*> GameObjects;
   GameObjects gameobjects;
+  GameObjects gameobjects_new; // For newly created objects
 
 private:
   typedef std::vector<SpawnPoint*> SpawnPoints;