X-Git-Url: https://git.verplant.org/?a=blobdiff_plain;f=src%2Fgame_object.h;h=b5b986041d8a16a5b036a8ca3fb120bb000d11dc;hb=f1e15f44f709d6b4fa45e858dc12d7d701ae8ddc;hp=d2824b59d902588790ad79195b340fcf6f6f23bc;hpb=b8c83bae1b0cd0367b6e3ac8c4c28e077eb1b594;p=supertux.git diff --git a/src/game_object.h b/src/game_object.h index d2824b59d..b5b986041 100644 --- a/src/game_object.h +++ b/src/game_object.h @@ -1,7 +1,7 @@ -// $Id$ +// $Id: game_object.h 2293 2005-03-25 20:39:56Z matzebraun $ // // SuperTux - A Jump'n Run -// Copyright (C) 2004 Matthias Braun // // This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License @@ -16,50 +16,94 @@ // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -#ifndef __GAMEOBJECT_HPP__ -#define __GAMEOBJECT_HPP__ +#ifndef SUPERTUX_GAMEOBJECT_H +#define SUPERTUX_GAMEOBJECT_H #include -class DisplayManager; +class DrawingContext; +class ObjectRemoveListener; /** - * Base class for all game objects. This contains functions for: - * -querying the actual type of the object - * -a flag that indicates if the object wants to be removed. Objects with this - * flag will be removed at the end of each frame. This is alot safer than - * having some uncontrollable "delete this" in the code. - * -an action function that is called once per frame and allows the object to - * update it's state. - * - * Most GameObjects will also implement the DrawableObject interface so that - * they can actually be drawn on screen. + * This is a base class for all game objects. Each sector of a level will hold a + * list of active GameObject while the game is played. + * + * This class is responsible for: + * - Updating and Drawing the object. This should happen in the update() and + * draw() functions. Both are called once per frame. + * - Providing a safe way to remove the object by calling the remove_me + * functions. + * - a 32bit bitset for flags... */ -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; + /** The GameObject should draw itself onto the provided DrawingContext if this + * function is called. + */ + virtual void draw(DrawingContext& context) = 0; + /** returns true if the object is not scheduled to be removed yet */ bool is_valid() const - { return !wants_to_die; } + { + return !wants_to_die; + } /** schedules this object to be removed at the end of the frame */ void remove_me() - { wants_to_die = true; } + { + 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; }; -#endif +#endif /*SUPERTUX_GAMEOBJECT_H*/