X-Git-Url: https://git.verplant.org/?a=blobdiff_plain;f=src%2Fgameobjs.h;h=197273f0aac01cfc0584111fe3fa2b0406a79f5e;hb=e4db6eb50cd6bcba607858b5e6c4c5d53531ed1f;hp=b6cec554159cbaf06ac5d962ae7068ae7727efdd;hpb=c1a047586177a23f892e9d051858466e4a9b9f3f;p=supertux.git diff --git a/src/gameobjs.h b/src/gameobjs.h index b6cec5541..197273f0a 100644 --- a/src/gameobjs.h +++ b/src/gameobjs.h @@ -22,44 +22,37 @@ #ifndef SUPERTUX_GAMEOBJS_H #define SUPERTUX_GAMEOBJS_H -#include "type.h" -#include "texture.h" -#include "timer.h" +#include "special/base.h" +#include "video/surface.h" +#include "special/timer.h" #include "scene.h" -#include "physic.h" +#include "math/physic.h" #include "collision.h" - -enum ObjectType { OBJ_NONE, OBJ_BADGUY, OBJ_TRAMPOLINE }; - -template -struct ObjectData -{ - int x; - int y; - ObjectType type; - T type_specific; - - ObjectData(ObjectData* pobject) - : x((int)pobject->x), y((int)pobject->y), type(pobject->type), type_specific(pobject->type_specific) {}; - ObjectData(int x_, int y_, ObjectType type_, T type_specific_) - : x(x_), y(y_), type(type_), type_specific(type_specific_) {}; - - ObjectData() - : x(0), y(0), type(OBJ_NONE), type_specific() {}; -}; +#include "special/game_object.h" +#include "special/moving_object.h" +#include "serializable.h" +#include "utils/lispwriter.h" /* Bounciness of distros: */ #define NO_BOUNCE 0 #define BOUNCE 1 +namespace SuperTux { +class Sprite; +} + +struct TileId; + class BouncyDistro : public GameObject { - public: - - void init(float x, float y); - void action(double frame_ratio); - void draw(); - std::string type() { return "BouncyDistro"; }; +public: + BouncyDistro(const Vector& pos); + virtual void action(float elapsed_time); + virtual void draw(DrawingContext& context); + +private: + Vector position; + float ym; }; extern Surface* img_distro[4]; @@ -71,63 +64,61 @@ class Tile; class BrokenBrick : public GameObject { - public: +public: + BrokenBrick(Tile* tile, const Vector& pos, const Vector& movement); + + virtual void action(float elapsed_time); + virtual void draw(DrawingContext& context); + +private: Timer timer; Tile* tile; - - void init(Tile* tile, float x, float y, float xm, float ym); - void action(double frame_ratio); - void draw(); - std::string type() { return "BrokenBrick"; }; + Vector position; + Vector movement; }; class BouncyBrick : public GameObject { - public: - float offset; +public: + BouncyBrick(const Vector& pos); + virtual void action(float elapsed_time); + virtual void draw(DrawingContext& context); + +private: + Vector position; + float offset; float offset_m; - int shape; - - void init(float x, float y); - void action(double frame_ratio); - void draw(); - std::string type() { return "BouncyBrick"; }; + TileId& shape; }; -class FloatingScore : public GameObject +class FloatingText : public GameObject { - public: - int value; - Timer timer; +public: + FloatingText(const Vector& pos, const std::string& text_); + FloatingText(const Vector& pos, int s); // use this for score, for instance - void init(float x, float y, int s); - void action(double frame_ratio); - void draw(); - std::string type() { return "FloatingScore"; }; -}; + virtual void action(float elapsed_time); + virtual void draw(DrawingContext& context); - -/* Trampoline */ -struct TrampolineData -{ - float power; +private: + Vector position; + std::string text; + Timer timer; }; -class Trampoline : public GameObject -{ - public: - void init(float x, float y); - void action(double frame_ratio); - void draw(); - std::string type() { return "Trampoline"; }; - - Trampoline(ObjectData data) - { - power = data.type_specific.power; - - init(data.x, data.y); - }; +extern Sprite *img_trampoline; +class Trampoline : public MovingObject, public Serializable +{ +public: + Trampoline(LispReader& reader); + Trampoline(float x, float y); + + virtual void write(LispWriter& writer); + virtual void action(float frame_ratio); + virtual void draw(DrawingContext& context); + + virtual void collision(const MovingObject& other, int); void collision(void *p_c_object, int c_object, CollisionType type); Physic physic; @@ -138,56 +129,79 @@ class Trampoline : public GameObject unsigned int frame; }; -void load_object_gfx(); - +extern Sprite *img_flying_platform; -class ObjectManager +class FlyingPlatform : public MovingObject, public Serializable { +public: + FlyingPlatform(LispReader& reader); + FlyingPlatform(int x, int y); + + virtual void write(LispWriter& writer); + virtual void action(float frame_ratio); + virtual void draw(DrawingContext& context); + + virtual void collision(const MovingObject& other, int); + void collision(void *p_c_object, int c_object, CollisionType type); + + float get_vel_x() { return vel_x; } + float get_vel_y() { return vel_y; } + + Physic physic; + enum { M_NORMAL, M_HELD } mode; + private: - ObjectManager(); - ~ObjectManager(); + std::vector pos_x; + std::vector pos_y; + float velocity; - static ObjectManager* instance_; + float vel_x, vel_y; // calculated based in the velocity - // XXX Objects will have to be split up into two categories: - // - Drawn before tux - // - Drawn after tux - // Eventually Player should be a part of ObjectManager + int point; + bool move; + unsigned int frame; +}; - std::vector badguys; - std::vector trampolines; - std::vector bouncy_distros; - std::vector broken_bricks; - std::vector bouncy_bricks; - //std::vector upgrades; - //std::vector bullets; +extern Sprite *img_smoke_cloud; - void load_badguys(std::string filename); +class SmokeCloud : public GameObject +{ +public: + SmokeCloud(const Vector& pos); + + virtual void action(float elapsed_time); + virtual void draw(DrawingContext& context); - public: - static ObjectManager* instance() { return instance_ ? instance_ : instance_ = new ObjectManager(); } - static void destroy_instance() { delete instance_; instance_ = 0; } +private: + Timer timer; + Vector position; +}; - void draw_bg(); - void draw_fg(); - void actions(); +class Particles : public GameObject +{ +public: + Particles(const Vector& epicenter, const Vector& velocity, const Vector& acceleration, int number, Color color, int size, int life_time); + ~Particles(); -/* Object* get(unsigned int id) { - if(id < badguys.size()) - { - return badguys[id]; - } - else - { - // Never return 0, but return the 0th tile instead so that - // user code doesn't have to check for NULL pointers all over - // the place - return badguys[0]; - } - } -*/ + virtual void action(float elapsed_time); + virtual void draw(DrawingContext& context); + +private: + Color color; + float size; + Vector vel, accel; + Timer timer; + bool live_forever; + + struct Particle { + Vector pos; + float angle; + }; + std::vector particles; }; +void load_object_gfx(); + #endif /* Local Variables: */