From: Florian Forster Date: Sat, 6 Mar 2010 16:49:53 +0000 (+0000) Subject: Owl: Implement carrying around of "Portable" objects. X-Git-Url: https://git.verplant.org/?a=commitdiff_plain;h=53b1ffef8615fa3eb69e071525860bd343378d93;p=supertux.git Owl: Implement carrying around of "Portable" objects. Owls now bring a "rock" by default. SVN-Revision: 6561 --- diff --git a/data/levels/test/owl.stl b/data/levels/test/owl.stl index 62d720123..da47c913e 100644 --- a/data/levels/test/owl.stl +++ b/data/levels/test/owl.stl @@ -17,6 +17,7 @@ (owl (x 1312) (y 832) + (carry "trampoline") ) (owl (x 2400) diff --git a/src/badguy/owl.cpp b/src/badguy/owl.cpp index 0813209f8..6389f71da 100644 --- a/src/badguy/owl.cpp +++ b/src/badguy/owl.cpp @@ -17,20 +17,28 @@ #include "badguy/owl.hpp" -#include "audio/sound_manager.hpp" #include "sprite/sprite.hpp" #include "supertux/object_factory.hpp" +#include "supertux/sector.hpp" +#include "object/rock.hpp" +#include "util/reader.hpp" +#include "util/log.hpp" #define FLYING_SPEED 120.0 Owl::Owl(const Reader& reader) : - BadGuy(reader, "images/creatures/owl/owl.sprite") + BadGuy(reader, "images/creatures/owl/owl.sprite"), + carried_obj_name("rock"), + carried_object(NULL) { + reader.get("carry", carried_obj_name); set_action (dir == LEFT ? "left" : "right", /* loops = */ -1); } -Owl::Owl(const Vector& pos, Direction d) - : BadGuy(pos, d, "images/creatures/owl/owl.sprite") +Owl::Owl(const Vector& pos, Direction d) : + BadGuy(pos, d, "images/creatures/owl/owl.sprite"), + carried_obj_name("rock"), + carried_object(NULL) { set_action (dir == LEFT ? "left" : "right", /* loops = */ -1); } @@ -38,14 +46,48 @@ Owl::Owl(const Vector& pos, Direction d) void Owl::initialize() { + GameObject *game_object; + physic.set_velocity_x(dir == LEFT ? -FLYING_SPEED : FLYING_SPEED); physic.enable_gravity(false); sprite->set_action(dir == LEFT ? "left" : "right"); + + game_object = ObjectFactory::instance().create(carried_obj_name, get_pos(), dir); + if (game_object == NULL) { + log_fatal << "Creating \"" << carried_obj_name << "\" object failed." << std::endl; + return; + } + + carried_object = dynamic_cast (game_object); + if (carried_object == NULL) { + log_warning << "Object is not portable: " << carried_obj_name << std::endl; + delete game_object; + return; + } + + Sector::current ()->add_object (game_object); +} /* void initialize */ + +void +Owl::active_update (float elapsed_time) +{ + BadGuy::active_update (elapsed_time); + + if (carried_object != NULL) { + Vector obj_pos = get_pos (); + + obj_pos.y += bbox.get_height (); + carried_object->grab (*this, obj_pos, dir); + } } bool Owl::collision_squished(GameObject&) { + if (carried_object != NULL) { + carried_object->ungrab (*this, dir); + carried_object = NULL; + } kill_fall (); return true; } @@ -73,6 +115,10 @@ Owl::collision_player(Player& player, const CollisionHit& hit) //Hack to tell if we should die HitResponse response = BadGuy::collision_player(player, hit); if(response == FORCE_MOVE) { + if (carried_object != NULL) { + carried_object->ungrab (*this, dir); + carried_object = NULL; + } kill_fall (); } diff --git a/src/badguy/owl.hpp b/src/badguy/owl.hpp index b5f2b8698..7510cae44 100644 --- a/src/badguy/owl.hpp +++ b/src/badguy/owl.hpp @@ -19,6 +19,7 @@ #define HEADER_SUPERTUX_BADGUY_OWL_HPP #include "badguy/badguy.hpp" +#include "object/portable.hpp" class Owl : public BadGuy { @@ -30,8 +31,12 @@ public: void collision_solid(const CollisionHit& hit); protected: + void active_update (float elapsed_time); bool collision_squished(GameObject& object); HitResponse collision_player(Player& player, const CollisionHit& hit); + + std::string carried_obj_name; + Portable *carried_object; }; #endif /* HEADER_SUPERTUX_BADGUY_OWL_HPP */