From: Ondřej Hošek Date: Mon, 16 Jan 2006 20:04:28 +0000 (+0000) Subject: Improved stay-on-platform code to handle non-32x32 badguys. Implemented s-o-p for... X-Git-Url: https://git.octo.it/?a=commitdiff_plain;h=a40453e7f04c072a8054063f1826ff9d7446fe22;p=supertux.git Improved stay-on-platform code to handle non-32x32 badguys. Implemented s-o-p for Mr Tree as proof. SVN-Revision: 3002 --- diff --git a/src/badguy/badguy.cpp b/src/badguy/badguy.cpp index 7da606bea..bafa67bf4 100644 --- a/src/badguy/badguy.cpp +++ b/src/badguy/badguy.cpp @@ -24,6 +24,7 @@ #include "object/tilemap.hpp" #include "tile.hpp" #include "statistics.hpp" +#include "game_session.hpp" static const float SQUISH_TIME = 2; static const float X_OFFSCREEN_DISTANCE = 1600; @@ -310,10 +311,14 @@ bool BadGuy::may_fall_off_platform() { int tile_x, tile_y; - // First, let's say the badguy moves once its width in the - // direction it's heading. - Vector pos = get_pos(); - pos.x += (dir == LEFT ? -bbox.get_width() : bbox.get_width()); + // First, let's say the badguy moves 32 units in the + // direction it's heading, so do some voodoo maths magic + // to determine its future position. + Vector pos; + if (dir == LEFT) + pos = Vector(bbox.p1.x - 32.f, bbox.p2.y); + else + pos = Vector(bbox.p2.x, bbox.p2.y); // Now, snap the badguy's X coordinate to the 32x32/cell grid. if (dir == LEFT) // use the ceiling @@ -325,8 +330,14 @@ BadGuy::may_fall_off_platform() // get the lower position. (Positive Y goes downward.) tile_y = (int)ceilf(pos.y/32.0f); +#if defined(DEBUG_STAY_ON_PLATFORM) + // Draw! + GameSession::current()->context->draw_filled_rect(Vector(tile_x*32.0f, tile_y*32.0f), Vector(32.f, 32.f), Color(1.f, 0.f, 0.f), 999); +#endif + // Now, if the badguy intersects with a tile, he won't fall off. // If he doesn't intersect, he probably will. + // Note that the tile's Y coordinate is offset by +1 from the object's Y. if (Sector::current()->solids->get_tile(tile_x, tile_y)->getAttributes() & FLAG_SOLID) { // It's a solid tile. Good. diff --git a/src/badguy/mrtree.cpp b/src/badguy/mrtree.cpp index 3f73bd44e..b06e5bd28 100644 --- a/src/badguy/mrtree.cpp +++ b/src/badguy/mrtree.cpp @@ -30,6 +30,8 @@ MrTree::MrTree(const lisp::Lisp& reader) { reader.get("x", start_position.x); reader.get("y", start_position.y); + stay_on_platform = false; + reader.get("stay-on-platform", stay_on_platform); bbox.set_size(84.8, 95.8); sprite = sprite_manager->create("images/creatures/mr_tree/mr_tree.sprite"); } @@ -57,6 +59,19 @@ MrTree::activate() } } +void +MrTree::active_update(float elapsed_time) +{ + if (stay_on_platform && may_fall_off_platform()) + { + dir = (dir == LEFT ? RIGHT : LEFT); + sprite->set_action(dir == LEFT ? "left" : "right"); + physic.set_velocity_x(-physic.get_velocity_x()); + } + + BadGuy::active_update(elapsed_time); +} + bool MrTree::collision_squished(Player& player) { diff --git a/src/badguy/mrtree.hpp b/src/badguy/mrtree.hpp index 058e26141..93463f74f 100644 --- a/src/badguy/mrtree.hpp +++ b/src/badguy/mrtree.hpp @@ -29,6 +29,7 @@ public: MrTree(const lisp::Lisp& reader); void activate(); + void active_update(float elapsed_time); void write(lisp::Writer& writer); HitResponse collision_solid(GameObject& other, const CollisionHit& hit); HitResponse collision_badguy(BadGuy& badguy, const CollisionHit& hit); @@ -38,7 +39,8 @@ protected: STATE_BIG, STATE_NORMAL }; MyState mystate; - + bool stay_on_platform; + bool collision_squished(Player& player); };