From: Christoph Sommer Date: Sat, 20 May 2006 13:32:55 +0000 (+0000) Subject: UnstableTile now has configurable sprite and allows for animations X-Git-Url: https://git.verplant.org/?a=commitdiff_plain;h=00b3f83fd19472aa1e12dccba9e592425d687001;p=supertux.git UnstableTile now has configurable sprite and allows for animations SVN-Revision: 3555 --- diff --git a/data/images/objects/unstable_tile/crumbling-0.png b/data/images/objects/unstable_tile/crumbling-0.png new file mode 100644 index 000000000..9cc8e6844 Binary files /dev/null and b/data/images/objects/unstable_tile/crumbling-0.png differ diff --git a/data/images/objects/unstable_tile/crumbling-1.png b/data/images/objects/unstable_tile/crumbling-1.png new file mode 100644 index 000000000..a60fbf79e Binary files /dev/null and b/data/images/objects/unstable_tile/crumbling-1.png differ diff --git a/data/images/objects/unstable_tile/normal.png b/data/images/objects/unstable_tile/normal.png new file mode 100644 index 000000000..a60fbf79e Binary files /dev/null and b/data/images/objects/unstable_tile/normal.png differ diff --git a/data/images/objects/unstable_tile/unstable_tile.png b/data/images/objects/unstable_tile/unstable_tile.png deleted file mode 100644 index a60fbf79e..000000000 Binary files a/data/images/objects/unstable_tile/unstable_tile.png and /dev/null differ diff --git a/data/images/objects/unstable_tile/unstable_tile.sprite b/data/images/objects/unstable_tile/unstable_tile.sprite index b51635be2..b7411027d 100644 --- a/data/images/objects/unstable_tile/unstable_tile.sprite +++ b/data/images/objects/unstable_tile/unstable_tile.sprite @@ -1,6 +1,31 @@ (supertux-sprite (action - (name "default") - (images "unstable_tile.png") + (name "normal") + (images + "normal.png" + ) + ) + (action + (name "crumbling") + (fps 20) + (images + "crumbling-0.png" + "crumbling-1.png" + "crumbling-0.png" + "crumbling-1.png" + "crumbling-0.png" + "crumbling-1.png" + "crumbling-0.png" + "crumbling-1.png" + "crumbling-0.png" + "crumbling-1.png" + ) + ) + (action + (name "disintegrating") + (fps 1) + (images + "normal.png" + ) ) ) diff --git a/src/object/unstable_tile.cpp b/src/object/unstable_tile.cpp index 8a61d09c4..1d0895846 100644 --- a/src/object/unstable_tile.cpp +++ b/src/object/unstable_tile.cpp @@ -1,7 +1,8 @@ // $Id$ // -// SuperTux +// SuperTux - Unstable Tile // Copyright (C) 2006 Matthias Braun +// Copyright (C) 2006 Christoph Sommer // // This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License @@ -27,63 +28,70 @@ #include "resources.hpp" #include "sprite/sprite.hpp" #include "random_generator.hpp" - -static const float CRACKTIME = 0.3; -static const float FALLTIME = 0.8; +#include "object/bullet.hpp" UnstableTile::UnstableTile(const lisp::Lisp& lisp) - : MovingSprite(lisp, "images/objects/unstable_tile/unstable_tile.sprite", LAYER_TILES, COLGROUP_STATIC), hit(false), falling(false) + : MovingSprite(lisp, LAYER_TILES, COLGROUP_STATIC), state(STATE_NORMAL) { + sprite->set_action("normal"); flags |= FLAG_SOLID; } HitResponse -UnstableTile::collision(GameObject& other, const CollisionHit& hitdata) +UnstableTile::collision(GameObject& other, const CollisionHit& hit) { - if(hitdata.normal.y < 0.8) - return FORCE_MOVE; + switch (state) { - Player* player = dynamic_cast (&other); - if(player) - hit = true; + case STATE_NORMAL: + if ((hit.normal.y >= 0.8 ) && (dynamic_cast(&other))) { + state = STATE_CRUMBLING; + sprite->set_action("crumbling", 1); + return FORCE_MOVE; + } + return FORCE_MOVE; + break; - return FORCE_MOVE; -} + case STATE_CRUMBLING: + return FORCE_MOVE; + break; -void -UnstableTile::draw(DrawingContext& context) -{ - Vector pos = get_pos(); - // shacking - if(timer.get_timegone() > CRACKTIME) { - pos.x += systemRandom.rand(-3, 3); - } + case STATE_DISINTEGRATING: + return FORCE_MOVE; + break; + + } - sprite->draw(context, pos, LAYER_TILES); + log_debug << "unhandled state" << std::endl; + return FORCE_MOVE; } void UnstableTile::update(float elapsed_time) { - if(falling) { - movement = physic.get_movement(elapsed_time); - if(!Sector::current()->inside(bbox)) { - remove_me(); - return; - } - } else if(hit) { - if(timer.check()) { - falling = true; - physic.enable_gravity(true); - flags &= ~FLAG_SOLID; - timer.stop(); - } else if(!timer.started()) { - timer.start(FALLTIME); - } - } else { - timer.stop(); + switch (state) { + + case STATE_NORMAL: + break; + + case STATE_CRUMBLING: + if (sprite->animation_done()) { + state = STATE_DISINTEGRATING; + sprite->set_action("disintegrating", 1); + flags &= ~FLAG_SOLID; + set_group(COLGROUP_DISABLED); + physic.enable_gravity(true); + } + break; + + case STATE_DISINTEGRATING: + movement = physic.get_movement(elapsed_time); + if (sprite->animation_done()) { + remove_me(); + return; + } + break; + } - hit = false; } IMPLEMENT_FACTORY(UnstableTile, "unstable_tile"); diff --git a/src/object/unstable_tile.hpp b/src/object/unstable_tile.hpp index 0e8cb3221..cd19c4e0d 100644 --- a/src/object/unstable_tile.hpp +++ b/src/object/unstable_tile.hpp @@ -1,7 +1,8 @@ // $Id$ // -// SuperTux +// SuperTux - Unstable Tile // Copyright (C) 2006 Matthias Braun +// Copyright (C) 2006 Christoph Sommer // // This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License @@ -25,9 +26,9 @@ #include "physic.hpp" #include "timer.hpp" -class Player; - -/** A tile that starts falling down if tux stands to long on it */ +/** + * A block that disintegrates when stood on + */ class UnstableTile : public MovingSprite { public: @@ -36,13 +37,16 @@ public: HitResponse collision(GameObject& other, const CollisionHit& hit); void update(float elapsed_time); - void draw(DrawingContext& context); private: + enum State { + STATE_NORMAL, /**< default state */ + STATE_CRUMBLING, /**< crumbling, still solid */ + STATE_DISINTEGRATING /**< disintegrating, no longer solid */ + }; + State state; + Physic physic; - Timer timer; - bool hit; - bool falling; }; #endif