X-Git-Url: https://git.verplant.org/?a=blobdiff_plain;f=src%2Fobject%2Funstable_tile.cpp;h=089a18d6290c115346b18d542c1a4db1a97635a9;hb=20f50f690c18aefbedeeb43eda094c8cb70351a9;hp=eabbd2dbb4ccf6a58f81e8975304251bea9a77f7;hpb=20f975e6fefc179e110cff27d424ec231b8d3801;p=supertux.git diff --git a/src/object/unstable_tile.cpp b/src/object/unstable_tile.cpp index eabbd2dbb..089a18d62 100644 --- a/src/object/unstable_tile.cpp +++ b/src/object/unstable_tile.cpp @@ -1,79 +1,80 @@ -#include +// $Id$ +// +// 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 +// as published by the Free Software Foundation; either version 2 +// of the License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -#include "unstable_tile.h" -#include "lisp/lisp.h" -#include "object_factory.h" -#include "player.h" -#include "sector.h" -#include "resources.h" -#include "special/sprite_manager.h" -#include "special/sprite.h" +#include -static const float CRACKTIME = 1; -static const float FALLTIME = 1.5; +#include "unstable_tile.hpp" +#include "lisp/lisp.hpp" +#include "object_factory.hpp" +#include "player.hpp" +#include "sector.hpp" +#include "resources.hpp" +#include "sprite/sprite.hpp" +#include "random_generator.hpp" +#include "object/bullet.hpp" UnstableTile::UnstableTile(const lisp::Lisp& lisp) - : hit(false), falling(false) -{ - lisp.get("x", bbox.p1.x); - lisp.get("y", bbox.p1.y); - bbox.set_size(32, 32); - sprite = sprite_manager->create("unstable_tile"); - flags |= FLAG_SOLID; -} - -UnstableTile::~UnstableTile() + : MovingSprite(lisp, LAYER_TILES, COLGROUP_STATIC), state(STATE_NORMAL) { - delete sprite; + sprite->set_action("normal"); } HitResponse -UnstableTile::collision(GameObject& other, const CollisionHit& hitdata) +UnstableTile::collision(GameObject& other, const CollisionHit& ) { - if(hitdata.normal.y < 0.8) - return FORCE_MOVE; - - Player* player = dynamic_cast (&other); - if(player) - hit = true; - - return FORCE_MOVE; + if(state == STATE_NORMAL) { + Player* player = dynamic_cast (&other); + if(player != NULL && + player->get_bbox().get_bottom() < get_bbox().get_top() + 7.0) { + state = STATE_CRUMBLING; + sprite->set_action("crumbling", 1); + } + } + return SOLID; } void -UnstableTile::draw(DrawingContext& context) +UnstableTile::update(float elapsed_time) { - Vector pos = get_pos(); - // shacking - if(timer.get_timegone() > CRACKTIME) { - pos.x += (rand() % 6) - 3; - } + switch (state) { - sprite->draw(context, pos, LAYER_TILES); -} + case STATE_NORMAL: + break; -void -UnstableTile::action(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(); + case STATE_CRUMBLING: + if (sprite->animation_done()) { + state = STATE_DISINTEGRATING; + sprite->set_action("disintegrating", 1); + 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");