From: Matthias Braun Date: Sun, 16 Jan 2005 12:11:22 +0000 (+0000) Subject: added object remove_listener so that you can get a message if some objects are remove... X-Git-Url: https://git.verplant.org/?a=commitdiff_plain;h=40e6e7cdc59c09befbd2595aea0c6e10428315d4;p=supertux.git added object remove_listener so that you can get a message if some objects are removed (not tested yet though) SVN-Revision: 2277 --- diff --git a/lib/special/game_object.cpp b/lib/special/game_object.cpp index c3fd98dcd..7a9db2b4f 100644 --- a/lib/special/game_object.cpp +++ b/lib/special/game_object.cpp @@ -19,18 +19,27 @@ #include -#include "special/game_object.h" +#include "game_object.h" +#include "object_remove_listener.h" namespace SuperTux { GameObject::GameObject() - : wants_to_die(false), flags(0) + : wants_to_die(false), remove_listeners(0), flags(0) { } GameObject::~GameObject() { + // call remove listeners (and remove them from the list) + RemoveListenerListEntry* entry = remove_listeners; + while(entry != 0) { + RemoveListenerListEntry* next = entry->next; + entry->listener->object_removed(this); + delete entry; + entry = next; + } } } diff --git a/lib/special/game_object.h b/lib/special/game_object.h index 88e1ccb52..b235c01ac 100644 --- a/lib/special/game_object.h +++ b/lib/special/game_object.h @@ -27,6 +27,8 @@ namespace SuperTux class DrawingContext; + class ObjectRemoveListener; + /** * Base class for all game objects. This contains functions for: * -querying the actual type of the object @@ -67,6 +69,18 @@ namespace SuperTux { wants_to_die = true; } + /** registers a remove listener which will be called if the object + * gets removed/destroyed + */ + void add_remove_listener(ObjectRemoveListener* listener) + { + RemoveListenerListEntry* entry = new RemoveListenerListEntry(); + entry->next = remove_listeners; + entry->listener = listener; + + remove_listeners = entry; + } + // flags enum { @@ -87,6 +101,13 @@ namespace SuperTux */ bool wants_to_die; + struct RemoveListenerListEntry + { + RemoveListenerListEntry* next; + ObjectRemoveListener* listener; + }; + RemoveListenerListEntry* remove_listeners; + protected: int flags; }; diff --git a/lib/special/object_remove_listener.h b/lib/special/object_remove_listener.h new file mode 100644 index 000000000..fdcb769bc --- /dev/null +++ b/lib/special/object_remove_listener.h @@ -0,0 +1,18 @@ +#ifndef __OBJECT_REMOVE_LISTENER_H__ +#define __OBJECT_REMOVE_LISTENER_H__ + +namespace SuperTux +{ + +class GameObject; + +class ObjectRemoveListener +{ +public: + virtual void object_removed(GameObject* object) = 0; +}; + +} + +#endif +