X-Git-Url: https://git.octo.it/?a=blobdiff_plain;f=src%2Fobject%2Funstable_tile.cpp;h=50ba0c624f270c7e162db35de38108233cdc3f76;hb=a6c19fc69bee325216222dca98dd8f466cdcf85a;hp=51410366c3c8fa856ca5c74e99c715fe19125571;hpb=c195429efc8b2ccc90bdd99f5561e421316b4fbb;p=supertux.git diff --git a/src/object/unstable_tile.cpp b/src/object/unstable_tile.cpp index 51410366c..50ba0c624 100644 --- a/src/object/unstable_tile.cpp +++ b/src/object/unstable_tile.cpp @@ -1,6 +1,7 @@ // SuperTux - Unstable Tile // Copyright (C) 2006 Matthias Braun // Copyright (C) 2006 Christoph Sommer +// Copyright (C) 2010 Florian Forster // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by @@ -17,17 +18,21 @@ #include "object/unstable_tile.hpp" +#include "object/explosion.hpp" #include "object/player.hpp" #include "sprite/sprite.hpp" #include "supertux/constants.hpp" #include "supertux/object_factory.hpp" UnstableTile::UnstableTile(const Reader& lisp) : - MovingSprite(lisp, LAYER_TILES, COLGROUP_STATIC), + MovingSprite(lisp, LAYER_TILES, COLGROUP_STATIC), physic(), - state(STATE_NORMAL) + state(STATE_NORMAL), + slowfall_timer() { sprite->set_action("normal"); + physic.set_gravity_modifier (.98); + physic.enable_gravity (false); } HitResponse @@ -37,40 +42,119 @@ UnstableTile::collision(GameObject& other, const CollisionHit& ) Player* player = dynamic_cast (&other); if(player != NULL && player->get_bbox().get_bottom() < get_bbox().get_top() + SHIFT_DELTA) { - state = STATE_CRUMBLING; - sprite->set_action("crumbling", 1); + shake (); + } + + if (dynamic_cast (&other)) { + shake (); } } return FORCE_MOVE; } +void UnstableTile::shake (void) +{ + if (state != STATE_NORMAL) + return; + + if (sprite->has_action ("shake")) { + state = STATE_SHAKE; + this->set_action ("shake", /* loops = */ 1); + } + else { + dissolve (); + } +} + +void UnstableTile::dissolve (void) +{ + if ((state != STATE_NORMAL) && (state != STATE_SHAKE)) + return; + + if (sprite->has_action ("dissolve")) { + state = STATE_DISSOLVE; + this->set_action ("dissolve", /* loops = */ 1); + } + else { + slow_fall (); + } +} + +void UnstableTile::slow_fall (void) +{ + /* Only enter slow-fall if neither shake nor dissolve is available. */ + if (state != STATE_NORMAL) { + this->fall_down (); + return; + } + + if (sprite->has_action ("fall-down")) { + state = STATE_SLOWFALL; + this->set_action ("fall-down", /* loops = */ 1); + physic.set_gravity_modifier (.10); + physic.enable_gravity (true); + slowfall_timer = 0.5; /* Fall slowly for half a second. */ + } + else { + remove_me (); + } +} + +void UnstableTile::fall_down (void) +{ + if ((state != STATE_NORMAL) + && (state != STATE_SHAKE) + && (state != STATE_DISSOLVE) + && (state != STATE_SLOWFALL)) + return; + + if (sprite->has_action ("fall-down")) { + state = STATE_FALL; + this->set_action ("fall-down", /* loops = */ 1); + physic.set_gravity_modifier (.98); + physic.enable_gravity (true); + } + else { + remove_me (); + } +} + void UnstableTile::update(float elapsed_time) { - switch (state) { - + switch (state) + { case STATE_NORMAL: break; - case STATE_CRUMBLING: - if (sprite->animation_done()) { - state = STATE_DISINTEGRATING; - sprite->set_action("disintegrating", 1); - set_group(COLGROUP_DISABLED); - physic.enable_gravity(true); - } + case STATE_SHAKE: + if (sprite->animation_done()) + dissolve (); break; - case STATE_DISINTEGRATING: - movement = physic.get_movement(elapsed_time); + case STATE_DISSOLVE: if (sprite->animation_done()) { - remove_me(); - return; + /* dissolving is done. Set to non-solid. */ + set_group (COLGROUP_DISABLED); + fall_down (); } break; + + case STATE_SLOWFALL: + if (slowfall_timer >= elapsed_time) + slowfall_timer -= elapsed_time; + else /* Switch to normal falling procedure */ + fall_down (); + movement = physic.get_movement (elapsed_time); + break; + + case STATE_FALL: + if (sprite->animation_done()) + remove_me (); + else + movement = physic.get_movement (elapsed_time); + break; } } -IMPLEMENT_FACTORY(UnstableTile, "unstable_tile"); - /* EOF */