From 5ab69550afb268f8775d876406a9a5797f224f97 Mon Sep 17 00:00:00 2001 From: Ricardo Cruz Date: Mon, 24 May 2004 11:59:59 +0000 Subject: [PATCH] New flying platform object. Though seems to have some probs checking if reached next point, resulting in a bad movement. I'll have a look at this later. SVN-Revision: 1303 --- src/collision.h | 3 +- src/gameobjs.cpp | 144 ++++++++++++++++++++++++++++++++++++++++++++++++++----- src/gameobjs.h | 27 +++++++++++ src/player.cpp | 7 ++- src/world.cpp | 33 ++++++++++++- src/world.h | 2 + 6 files changed, 202 insertions(+), 14 deletions(-) diff --git a/src/collision.h b/src/collision.h index 225a771ff..b6c243e2e 100644 --- a/src/collision.h +++ b/src/collision.h @@ -32,7 +32,8 @@ enum CO_BULLET, CO_BADGUY, CO_PLAYER, - CO_TRAMPOLINE + CO_TRAMPOLINE, + CO_FLYING_PLATFORM }; enum CollisionType { diff --git a/src/gameobjs.cpp b/src/gameobjs.cpp index 480b7468b..61580e204 100644 --- a/src/gameobjs.cpp +++ b/src/gameobjs.cpp @@ -145,17 +145,6 @@ FloatingScore::draw(ViewPort& viewport, int ) #define TRAMPOLINE_FRAMES 4 Sprite *img_trampoline[TRAMPOLINE_FRAMES]; -void load_object_gfx() -{ - char sprite_name[16]; - - for (int i = 0; i < TRAMPOLINE_FRAMES; i++) - { - sprintf(sprite_name, "trampoline-%i", i+1); - img_trampoline[i] = sprite_manager->load(sprite_name); - } -} - Trampoline::Trampoline(DisplayManager& displaymanager, LispReader& reader) { displaymanager.add_drawable(this, LAYER_OBJECTS); @@ -289,4 +278,137 @@ Trampoline::collision(void *p_c_object, int c_object, CollisionType type) } } +/* Flying Platform */ + +#define FLYING_PLATFORM_FRAMES 1 +Sprite *img_flying_platform[FLYING_PLATFORM_FRAMES]; + +FlyingPlatform::FlyingPlatform(DisplayManager& displaymanager, LispReader& reader) +{ + displaymanager.add_drawable(this, LAYER_OBJECTS); + + reader.read_int_vector("x", &pos_x); + reader.read_int_vector("y", &pos_y); + + velocity = 2.0; + reader.read_float("velocity", &velocity); + + base.x = pos_x[0]; + base.y = pos_y[0]; + base.width = 96; + base.height = 40; + + point = 0; + move = false; + + frame = 0; +} + +void +FlyingPlatform::write(LispWriter& writer) +{ + writer.start_list("flying-trampoline"); + + writer.write_int_vector("x", pos_x); + writer.write_int_vector("y", pos_y); + writer.write_float("velocity", velocity); + writer.end_list("flying-trampoline"); +} + +void +FlyingPlatform::draw(ViewPort& viewport, int ) +{ +img_flying_platform[frame]->draw(viewport.world2screen(Vector(base.x, base.y))); +} + +void +FlyingPlatform::action(float frame_ratio) +{ + // TODO: Remove if we're too far off the screen + + // FIXME: change frame +if(!move) + return; + +if((unsigned)point+1 != pos_x.size()) + if(((pos_x[point+1] > pos_x[point] && base.x >= pos_x[point+1]) || + (pos_x[point+1] < pos_x[point] && base.x <= pos_x[point+1]) || + pos_x[point+1] == pos_x[point+1]) && + ((pos_y[point+1] > pos_y[point] && base.y >= pos_y[point+1]) || + (pos_y[point+1] < pos_y[point] && base.y <= pos_y[point+1]) || + pos_y[point+1] == pos_y[point+1])) + { + point++; +std::cerr << "next point: " << point << std::endl; + } +else // last point + { + // point = 0; + // reverse vector + return; + } + +if(pos_x[point] > base.x) + base.x += velocity * frame_ratio; +else if(pos_x[point] < base.x) + base.x -= velocity * frame_ratio; + +if(pos_y[point] > base.y) + base.y += velocity * frame_ratio; +else if(pos_y[point] < base.y) + base.y -= velocity * frame_ratio; +/* +float x = pos_x[point+1] - pos_x[point]; +float y = pos_y[point+1] - pos_y[point]; +float vel_x = x*velocity / sqrt(x*x + y*y); +float vel_y = velocity - vel_x; + +base.x += vel_x * frame_ratio; +base.y += vel_y * frame_ratio; +*/ +} + +void +FlyingPlatform::collision(const MovingObject&, int) +{ + // comes later +} + +void +FlyingPlatform::collision(void *p_c_object, int c_object, CollisionType type) +{ +(void) p_c_object; +(void) type; + +// Player* pplayer_c = NULL; + switch (c_object) + { + case CO_PLAYER: +// pplayer_c = (Player*) p_c_object; + move = true; + + break; + + default: + break; + + } +} + +void load_object_gfx() +{ + char sprite_name[16]; + + for (int i = 0; i < TRAMPOLINE_FRAMES; i++) + { + sprintf(sprite_name, "trampoline-%i", i+1); + img_trampoline[i] = sprite_manager->load(sprite_name); + } + + for (int i = 0; i < FLYING_PLATFORM_FRAMES; i++) + { + sprintf(sprite_name, "flying_platform-%i", i+1); + img_flying_platform[i] = sprite_manager->load(sprite_name); + } +} diff --git a/src/gameobjs.h b/src/gameobjs.h index 103defa85..bc0d0e7f1 100644 --- a/src/gameobjs.h +++ b/src/gameobjs.h @@ -132,6 +132,33 @@ public: unsigned int frame; }; +class FlyingPlatform : public MovingObject, public Drawable, public Serializable +{ +public: + FlyingPlatform(DisplayManager& displaymanager, LispReader& reader); + + virtual void write(LispWriter& writer); + virtual void action(float frame_ratio); + virtual void draw(ViewPort& viewport, int layer); + virtual std::string type() const + { return "Trampoline"; }; + + virtual void collision(const MovingObject& other, int); + void collision(void *p_c_object, int c_object, CollisionType type); + + Physic physic; + enum { M_NORMAL, M_HELD } mode; + + private: + std::vector pos_x; + std::vector pos_y; + float velocity; + + int point; + bool move; + unsigned int frame; +}; + void load_object_gfx(); #endif diff --git a/src/player.cpp b/src/player.cpp index 829016488..e8b4c2c87 100644 --- a/src/player.cpp +++ b/src/player.cpp @@ -709,6 +709,7 @@ Player::collision(void* p_c_object, int c_object) { BadGuy* pbad_c = NULL; Trampoline* ptramp_c = NULL; + FlyingPlatform* pplatform_c = NULL; switch (c_object) { @@ -799,7 +800,11 @@ Player::collision(void* p_c_object, int c_object) } } */ - + break; + case CO_FLYING_PLATFORM: + pplatform_c = (FlyingPlatform*) p_c_object; + + base.y = pplatform_c->base.y - base.height; break; default: diff --git a/src/world.cpp b/src/world.cpp index 7863584ee..91acb667a 100644 --- a/src/world.cpp +++ b/src/world.cpp @@ -165,6 +165,9 @@ World::add_object(GameObject* object) Trampoline* trampoline = dynamic_cast (object); if(trampoline) trampolines.push_back(trampoline); + FlyingPlatform* flying_platform = dynamic_cast (object); + if(flying_platform) + flying_platforms.push_back(flying_platform); gameobjects.push_back(object); } @@ -180,7 +183,11 @@ World::parse_objects(lisp_object_t* cur) if(object_type == "trampoline") { add_object(new Trampoline(displaymanager, reader)); - } else { + } + else if(object_type == "flying-platform") { + add_object(new FlyingPlatform(displaymanager, reader)); + } + else { BadGuyKind kind = badguykind_from_string(object_type); add_object(new BadGuy(displaymanager, kind, reader)); } @@ -259,6 +266,12 @@ World::action(float elapsed_time) std::remove(trampolines.begin(), trampolines.end(), trampoline), trampolines.end()); } + FlyingPlatform* flying_platform= dynamic_cast (*i); + if(flying_platform) { + flying_platforms.erase( + std::remove(flying_platforms.begin(), flying_platforms.end(), flying_platform), + flying_platforms.end()); + } delete *i; i = gameobjects.erase(i); @@ -485,6 +498,24 @@ World::collision_handler() } } } + + // CO_FLYING_PLATFORM & (CO_PLAYER or CO_BADGUY) + for (FlyingPlatforms::iterator i = flying_platforms.begin(); i != flying_platforms.end(); ++i) + { + if (rectcollision((*i)->base, tux->base)) + { + if (tux->previous_base.y < tux->base.y && + tux->previous_base.y + tux->previous_base.height + < (*i)->base.y + (*i)->base.height/2) + { + (*i)->collision(tux, CO_PLAYER, COLLISION_SQUISH); + tux->collision(*i, CO_FLYING_PLATFORM); + } +/* else if (tux->previous_base.y <= tux->base.y) + { + }*/ + } + } } void diff --git a/src/world.h b/src/world.h index 1f90d9f42..80ed8803e 100644 --- a/src/world.h +++ b/src/world.h @@ -44,6 +44,8 @@ private: BadGuys bad_guys_to_add; typedef std::list Trampolines; Trampolines trampolines; + typedef std::list FlyingPlatforms; + FlyingPlatforms flying_platforms; Level* level; Player* tux; -- 2.11.0