#include <config.h>
#include "root.hpp"
+#include "sprite/sprite_manager.hpp"
+#include "timer.hpp"
-static const float SPEED = 5;
+static const float SPEED_GROW = 256;
+static const float SPEED_SHRINK = 128;
+static const float HATCH_TIME = 0.75;
Root::Root(const Vector& pos)
- : BadGuy(pos, "images/creatures/ghosttree/root.sprite", LAYER_OBJECTS+20),
- ypos(0), speed(-SPEED)
+ : BadGuy(pos, "images/creatures/ghosttree/root.sprite", LAYER_TILES-1),
+ mystate(STATE_APPEARING), offset_y(0)
{
- //ypos = sprite->get_height();
+ base_sprite.reset(sprite_manager->create("images/creatures/ghosttree/root-base.sprite"));
+ base_sprite->set_action("appearing", 1);
+ base_sprite->set_animation_loops(1); // TODO: necessary because set_action ignores loops for default action
+ physic.enable_gravity(false);
+ set_colgroup_active(COLGROUP_TOUCHABLE);
}
Root::~Root()
}
void
-Root::activate()
+Root::deactivate()
{
- set_pos(start_position + Vector(0, ypos));
- std::cout << "SetPos: " << get_pos() << "\n";
+ remove_me();
}
void
Root::active_update(float elapsed_time)
{
- ypos += elapsed_time * speed;
- if(ypos < 0) {
- ypos = 0;
- speed = -speed;
+ if (mystate == STATE_APPEARING) {
+ if (base_sprite->animation_done()) {
+ hatch_timer.start(HATCH_TIME);
+ mystate = STATE_HATCHING;
+ }
}
- if(speed > 0 && ypos > sprite->get_height()) {
- remove_me();
+ if (mystate == STATE_HATCHING) {
+ if (!hatch_timer.started()) mystate = STATE_GROWING;
}
- set_pos(start_position + Vector(0, ypos));
- std::cout << "SetPos: " << get_pos() << "\n";
+ else if (mystate == STATE_GROWING) {
+ offset_y -= elapsed_time * SPEED_GROW;
+ if (offset_y < -sprite->get_height()) {
+ offset_y = -sprite->get_height();
+ mystate = STATE_SHRINKING;
+ }
+ set_pos(start_position + Vector(0, offset_y));
+ }
+ else if (mystate == STATE_SHRINKING) {
+ offset_y += elapsed_time * SPEED_SHRINK;
+ if (offset_y > 0) {
+ offset_y = 0;
+ mystate = STATE_VANISHING;
+ base_sprite->set_action("vanishing", 2);
+ base_sprite->set_animation_loops(2); // TODO: doesn't seem to work for loops=1
+ }
+ set_pos(start_position + Vector(0, offset_y));
+ }
+ else if (mystate == STATE_VANISHING) {
+ if (base_sprite->animation_done()) remove_me();
+ }
+ BadGuy::active_update(elapsed_time);
+}
+
+void
+Root::draw(DrawingContext& context)
+{
+ base_sprite->draw(context, start_position, LAYER_TILES+1);
+ if ((mystate != STATE_APPEARING) && (mystate != STATE_VANISHING)) BadGuy::draw(context);
}