added object remove_listener so that you can get a message if some objects are remove...
[supertux.git] / lib / special / game_object.h
index 1a4175b..b235c01 100644 (file)
@@ -1,7 +1,7 @@
 //  $Id$
 //
 //  SuperTux -  A Jump'n Run
-//  Copyright (C) 2004 Matthias Braun <matze@braunis.de
+//  Copyright (C) 2004 Matthias Braun <matze@braunis.de>
 //
 //  This program is free software; you can redistribute it and/or
 //  modify it under the terms of the GNU General Public License
@@ -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
@@ -39,15 +41,16 @@ namespace SuperTux
    * Most GameObjects will also implement the DrawableObject interface so that
    * they can actually be drawn on screen.
    */
-  class GameObject // TODO rename this once the game has been converted
+  class GameObject
     {
     public:
       GameObject();
       virtual ~GameObject();
 
       /** This function is called once per frame and allows the object to update
-       * it's state. The elapsed_time is the time since the last frame and should be
-       * the base for all timed things.
+       * it's state. The elapsed_time is the time since the last frame in
+       * seconds and should be the base for all timed calculations (don't use
+       * SDL_GetTicks directly as this will fail in pause mode)
        */
       virtual void action(float elapsed_time) = 0;
 
@@ -66,12 +69,47 @@ 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 {
+        /// the tile so you can stand on it
+        FLAG_SOLID       = 0x0001,
+        /// can be used to temporatily disable collision detection
+        FLAG_NO_COLLDET  = 0x0002
+      };                     
+
+      int get_flags() const
+      {
+        return flags;            
+      }
 
     private:
       /** this flag indicates if the object should be removed at the end of the
        * frame
        */
       bool wants_to_die;
+
+      struct RemoveListenerListEntry
+      {
+        RemoveListenerListEntry* next;
+        ObjectRemoveListener* listener;
+      };
+      RemoveListenerListEntry* remove_listeners;
+
+    protected:
+      int flags;
     };
 
 }