From fc3c10b10042ffa92c63a9dc227d5e88095e2b73 Mon Sep 17 00:00:00 2001 From: Christoph Sommer Date: Tue, 27 Jun 2006 15:56:15 +0000 Subject: [PATCH] Changed door to only teleport Tux when he is standing in the doorway SVN-Revision: 3785 --- data/images/objects/door/door.sprite | 63 ++++++++++++++++++----------- src/trigger/door.cpp | 77 +++++++++++++++++++++++++++++++----- src/trigger/door.hpp | 13 +++++- 3 files changed, 120 insertions(+), 33 deletions(-) diff --git a/data/images/objects/door/door.sprite b/data/images/objects/door/door.sprite index 1eea8c793..364b6bc92 100644 --- a/data/images/objects/door/door.sprite +++ b/data/images/objects/door/door.sprite @@ -1,25 +1,44 @@ (supertux-sprite - (action - (name "normal") - (hitbox 0 0 0 0) - (images "door-0.png")) - (action - (name "open") - (hitbox 0 0 0 0) - (images "door-0.png" - "door-1.png" - "door-2.png" - "door-3.png" - "door-4.png" - "door-5.png" - "door-6.png" - "door-7.png" - "door-6.png" - "door-5.png" - "door-4.png" - "door-3.png" - "door-2.png" - "door-1.png" - "door-0.png") + (action + (name "closed") + (hitbox 0 0 0 0) + (images + "door-0.png" + ) + ) + (action + (name "opening") + (hitbox 0 0 0 0) + (images + "door-0.png" + "door-1.png" + "door-2.png" + "door-3.png" + "door-4.png" + "door-5.png" + "door-6.png" + "door-7.png" + ) + ) + (action + (name "open") + (hitbox 0 0 0 0) + (images + "door-7.png" + ) + ) + (action + (name "closing") + (hitbox 0 0 0 0) + (images + "door-7.png" + "door-6.png" + "door-5.png" + "door-4.png" + "door-3.png" + "door-2.png" + "door-1.png" + "door-0.png" + ) ) ) diff --git a/src/trigger/door.cpp b/src/trigger/door.cpp index 5956cb598..f21d01c11 100644 --- a/src/trigger/door.cpp +++ b/src/trigger/door.cpp @@ -30,25 +30,28 @@ #include "lisp/writer.hpp" Door::Door(const lisp::Lisp& reader) + : state(CLOSED) { reader.get("x", bbox.p1.x); reader.get("y", bbox.p1.y); - bbox.set_size(32, 64); - reader.get("sector", target_sector); reader.get("spawnpoint", target_spawnpoint); sprite = sprite_manager->create("images/objects/door/door.sprite"); + sprite->set_action("closed"); + bbox.set_size(sprite->get_current_hitbox_width(), sprite->get_current_hitbox_height()); } Door::Door(int x, int y, std::string sector, std::string spawnpoint) + : state(CLOSED) { bbox.set_pos(Vector(x, y)); - bbox.set_size(32, 64); target_sector = sector; target_spawnpoint = spawnpoint; sprite = sprite_manager->create("images/objects/door/door.sprite"); + sprite->set_action("closed"); + bbox.set_size(sprite->get_current_hitbox_width(), sprite->get_current_hitbox_height()); } Door::~Door() @@ -75,10 +78,28 @@ Door::write(lisp::Writer& writer) void Door::update(float ) { - //Check if door animation is complete - if(sprite->animation_done()) { - sprite->set_action("normal"); - GameSession::current()->respawn(target_sector, target_spawnpoint); + switch (state) { + case CLOSED: + break; + case OPENING: + if(sprite->animation_done()) { + state = OPEN; + sprite->set_action("open"); + stay_open_timer.start(1.0); + } + break; + case OPEN: + if (stay_open_timer.check()) { + state = CLOSING; + sprite->set_action("closing", 1); + } + break; + case CLOSING: + if(sprite->animation_done()) { + state = CLOSED; + sprite->set_action("closed"); + } + break; } } @@ -89,11 +110,47 @@ Door::draw(DrawingContext& context) } void -Door::event(Player& , EventType type) +Door::event(Player& who, EventType type) +{ + switch (state) { + case CLOSED: + if (type == EVENT_ACTIVATE) { + state = OPENING; + sprite->set_action("opening", 1); + } + break; + case OPENING: + break; + case OPEN: + break; + case CLOSING: + break; + } +} + +HitResponse +Door::collision(GameObject& other, const CollisionHit& hit) { - if(type == EVENT_ACTIVATE) { - sprite->set_action("open", 1); + switch (state) { + case CLOSED: + break; + case OPENING: + break; + case OPEN: + { + Player* player = dynamic_cast (&other); + if (player) { + state = CLOSING; + sprite->set_action("closing", 1); + GameSession::current()->respawn(target_sector, target_spawnpoint); + } + } + break; + case CLOSING: + break; } + + return TriggerBase::collision(other, hit); } IMPLEMENT_FACTORY(Door, "door"); diff --git a/src/trigger/door.hpp b/src/trigger/door.hpp index 14e359a0b..af7d218f6 100644 --- a/src/trigger/door.hpp +++ b/src/trigger/door.hpp @@ -27,6 +27,7 @@ #include "trigger_base.hpp" #include "serializable.hpp" #include "timer.hpp" +#include "object/player.hpp" class Door : public TriggerBase, public Serializable { @@ -40,11 +41,21 @@ public: virtual void update(float elapsed_time); virtual void draw(DrawingContext& context); virtual void event(Player& player, EventType type); - + virtual HitResponse collision(GameObject& other, const CollisionHit& hit); + private: + enum DoorState { + CLOSED, + OPENING, + OPEN, + CLOSING + }; + + DoorState state; std::string target_sector; std::string target_spawnpoint; Sprite* sprite; + Timer stay_open_timer; }; #endif -- 2.11.0