X-Git-Url: https://git.verplant.org/?a=blobdiff_plain;f=src%2Fbadguy%2Ftreewillowisp.cpp;h=4a0c06bce183a90832e3ba42d5ca6e3b61a6780c;hb=13c84268f16872f9b442251c4175a3a1a7a7899a;hp=c3d14e0e552fa1700875591d6660d2dbde66d24c;hpb=ecd50c335ca7dd467d97bdb6f234fda6681e43ee;p=supertux.git diff --git a/src/badguy/treewillowisp.cpp b/src/badguy/treewillowisp.cpp index c3d14e0e5..4a0c06bce 100644 --- a/src/badguy/treewillowisp.cpp +++ b/src/badguy/treewillowisp.cpp @@ -24,11 +24,12 @@ #include "object/lantern.hpp" static const std::string SOUNDFILE = "sounds/willowisp.wav"; +static const float SUCKSPEED = 25; TreeWillOWisp::TreeWillOWisp(GhostTree* tree, const Vector& pos, float radius, float speed) : BadGuy(Vector(0, 0), "images/creatures/willowisp/willowisp.sprite", - LAYER_OBJECTS - 20), mystate(STATE_DEFAULT), tree(tree) + LAYER_OBJECTS - 20), was_sucked(false), mystate(STATE_DEFAULT), tree(tree) { treepos_delta = pos; sound_manager->preload(SOUNDFILE); @@ -37,6 +38,8 @@ TreeWillOWisp::TreeWillOWisp(GhostTree* tree, const Vector& pos, this->angle = 0; this->speed = speed; start_position = tree->get_pos() + treepos_delta; + + set_colgroup_active(COLGROUP_MOVING); } TreeWillOWisp::~TreeWillOWisp() @@ -52,8 +55,6 @@ TreeWillOWisp::activate() sound_source->set_gain(2.0); sound_source->set_reference_distance(32); sound_source->play(); - - set_group(COLGROUP_MOVING); } void @@ -61,9 +62,15 @@ TreeWillOWisp::vanish() { mystate = STATE_VANISHING; sprite->set_action("vanishing", 1); - set_group(COLGROUP_DISABLED); + set_colgroup_active(COLGROUP_DISABLED); +} - tree->willowisp_died(this); +void +TreeWillOWisp::start_sucking(Vector suck_target) +{ + mystate = STATE_SUCKED; + this->suck_target = suck_target; + was_sucked = true; } HitResponse @@ -85,14 +92,39 @@ TreeWillOWisp::collides(GameObject& other, const CollisionHit& ) { } void +TreeWillOWisp::draw(DrawingContext& context) +{ + sprite->draw(context, get_pos(), layer); + + context.push_target(); + context.set_target(DrawingContext::LIGHTMAP); + + sprite->draw(context, get_pos(), layer); + + context.pop_target(); +} + +void TreeWillOWisp::active_update(float elapsed_time) { // remove TreeWillOWisp if it has completely vanished if (mystate == STATE_VANISHING) { if(sprite->animation_done()) { remove_me(); + tree->willowisp_died(this); + } + return; + } + + if (mystate == STATE_SUCKED) { + Vector dir = suck_target - get_pos(); + if(dir.norm() < 5) { + vanish(); return; } + Vector newpos = get_pos() + dir * elapsed_time; + movement = newpos - get_pos(); + return; } angle = fmodf(angle + elapsed_time * speed, (float) (2*M_PI));