X-Git-Url: https://git.verplant.org/?a=blobdiff_plain;f=src%2Fobject%2Fweak_block.cpp;h=182efae8c50a8c7b0ca168373199f4e632ceaefb;hb=ca967dcf4ee89f99880355be00782d1cd047be6a;hp=8f33f3c15230e66fa9a85cbdc9474f87ad444b7b;hpb=716d5248e22793b65a57fdd476fe43f0f0646beb;p=supertux.git diff --git a/src/object/weak_block.cpp b/src/object/weak_block.cpp index 8f33f3c15..182efae8c 100644 --- a/src/object/weak_block.cpp +++ b/src/object/weak_block.cpp @@ -1,4 +1,4 @@ -// $Id: weak_block.cpp 3435 2006-04-26 02:13:42Z sik0fewl $ +// $Id$ // // SuperTux - Weak Block // Copyright (C) 2006 Matthias Braun @@ -26,26 +26,14 @@ #include "player.hpp" #include "sector.hpp" #include "resources.hpp" -#include "sprite/sprite_manager.hpp" #include "sprite/sprite.hpp" #include "random_generator.hpp" #include "object/bullet.hpp" WeakBlock::WeakBlock(const lisp::Lisp& lisp) - : state(STATE_NORMAL) + : MovingSprite(lisp, "images/objects/strawbox/strawbox.sprite", LAYER_TILES, COLGROUP_STATIC), state(STATE_NORMAL) { - lisp.get("x", bbox.p1.x); - lisp.get("y", bbox.p1.y); - bbox.set_size(32, 32); - sprite = sprite_manager->create("images/objects/strawbox/strawbox.sprite"); sprite->set_action("normal"); - flags |= FLAG_SOLID; - set_group(COLGROUP_STATIC); -} - -WeakBlock::~WeakBlock() -{ - delete sprite; } HitResponse @@ -55,9 +43,8 @@ WeakBlock::collision(GameObject& other, const CollisionHit& ) case STATE_NORMAL: if (dynamic_cast(&other)) { - state = STATE_BURNING; - sprite->set_action("burning", 1); - return FORCE_MOVE; + startBurning(); + return FORCE_MOVE; } return FORCE_MOVE; break; @@ -77,13 +64,6 @@ WeakBlock::collision(GameObject& other, const CollisionHit& ) } void -WeakBlock::draw(DrawingContext& context) -{ - Vector pos = get_pos(); - sprite->draw(context, pos, LAYER_TILES); -} - -void WeakBlock::update(float ) { switch (state) { @@ -93,21 +73,49 @@ WeakBlock::update(float ) case STATE_BURNING: if (sprite->animation_done()) { - state = STATE_DISINTEGRATING; - sprite->set_action("disintegrating", 1); - flags &= ~FLAG_SOLID; + state = STATE_DISINTEGRATING; + sprite->set_action("disintegrating", 1); + spreadHit(); set_group(COLGROUP_DISABLED); } break; case STATE_DISINTEGRATING: if (sprite->animation_done()) { - remove_me(); - return; + remove_me(); + return; } break; } } +void +WeakBlock::startBurning() +{ + if (state != STATE_NORMAL) return; + state = STATE_BURNING; + sprite->set_action("burning", 1); +} + +void +WeakBlock::spreadHit() +{ + Sector* sector = Sector::current(); + if (!sector) { + log_debug << "no current sector" << std::endl; + return; + } + for(Sector::GameObjects::iterator i = sector->gameobjects.begin(); i != sector->gameobjects.end(); ++i) { + WeakBlock* wb = dynamic_cast(*i); + if (!wb) continue; + if (wb == this) continue; + if (wb->state != STATE_NORMAL) continue; + float dx = fabsf(wb->get_pos().x - this->get_pos().x); + float dy = fabsf(wb->get_pos().y - this->get_pos().y); + if ((dx <= 32.5) && (dy <= 32.5)) wb->startBurning(); + } +} + + IMPLEMENT_FACTORY(WeakBlock, "weak_block");