summaryrefslogtreecommitdiff
path: root/main.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'main.cpp')
-rw-r--r--main.cpp58
1 files changed, 48 insertions, 10 deletions
diff --git a/main.cpp b/main.cpp
index a10231e..b279d78 100644
--- a/main.cpp
+++ b/main.cpp
@@ -13,9 +13,10 @@
using namespace std;
-static shared_ptr<Object> makeobjectbyname(int x,int y,const char *name){
+__attribute__((unused))
+static Object* makeobjectbyname(int x,int y,const char *name){
-#define X(objname) if(strcmp(name,#objname)==0)return make_shared<objname>(x,y);
+#define X(objname) if(strcmp(name,#objname)==0)return new objname(x,y);
OBJECT_CLASSES_XLIST
#undef X
@@ -28,6 +29,37 @@ Global global;
sf::RenderWindow window;
+void applyObjectChanges(){
+ set<Object*> seen;
+ for(Object *obj : global.objects_todelete){
+ if(seen.insert(obj).second){
+ delete obj;
+ global.objects.erase(obj);
+ }
+ }
+ global.objects_todelete.clear();
+}
+
+void applyObjectChanges(set<Object*>::iterator &it){
+ bool incremented=false;
+ set<Object*> seen;
+ for(Object *obj : global.objects_todelete){
+ if(seen.insert(obj).second){
+ delete obj;
+ if(it!=global.objects.end()&&*it==obj){
+ ++it;
+ incremented=true;
+ }
+ global.objects.erase(obj);
+ }
+ }
+ global.objects_todelete.clear();
+ if(!incremented){
+ ++it;
+ }
+}
+
+
void eventCycle(){
sf::Event event;
while(window.pollEvent(event)){
@@ -42,14 +74,18 @@ void eventCycle(){
}
}
- for(int i=0;i<(int)global.objects.size();i++){
- global.objects[i]->step();
+ for(set<Object*>::iterator it=global.objects.begin();
+ it!=global.objects.end();
+ applyObjectChanges(it)){
+ (*it)->step();
}
window.clear(sf::Color::White);
- for(int i=0;i<(int)global.objects.size();i++){
- global.objects[i]->draw();
+ for(set<Object*>::iterator it=global.objects.begin();
+ it!=global.objects.end();
+ applyObjectChanges(it)){
+ (*it)->draw();
}
window.display();
@@ -63,15 +99,17 @@ int main(void){
window.create(sf::VideoMode(640,480),GAME_NAME);
window.setVerticalSyncEnabled(true);
- global.objects.push_back(makeobjectbyname(0,0,"obj_control"));
- global.objects[0]->create();
+ instance_create<obj_control>(0,0);
+ applyObjectChanges();
while(window.isOpen()){
eventCycle();
}
- for(shared_ptr<Object> p : global.objects){
- p->destroy();
+ for(set<Object*>::iterator it=global.objects.begin();
+ it!=global.objects.end();
+ applyObjectChanges(it)){
+ instance_destroy(*it);
}
}