#include <config.h>
-#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;
+ }
}
}
class DrawingContext;
+ class ObjectRemoveListener;
+
/**
* Base class for all game objects. This contains functions for:
* -querying the actual type of the object
{
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 {
*/
bool wants_to_die;
+ struct RemoveListenerListEntry
+ {
+ RemoveListenerListEntry* next;
+ ObjectRemoveListener* listener;
+ };
+ RemoveListenerListEntry* remove_listeners;
+
protected:
int flags;
};
--- /dev/null
+#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
+