X-Git-Url: https://git.verplant.org/?a=blobdiff_plain;f=src%2Fbadguy%2Fsnail.cpp;h=f54573fd006edd8eaa087e82eca784b3272307cd;hb=e7042da286e68756298cc205910b35c1da551167;hp=c2da55673ed0d69dee00816af2402f7948385967;hpb=36afad72b6c66d4619372892f589a4131afed638;p=supertux.git diff --git a/src/badguy/snail.cpp b/src/badguy/snail.cpp index c2da55673..f54573fd0 100644 --- a/src/badguy/snail.cpp +++ b/src/badguy/snail.cpp @@ -23,51 +23,53 @@ #include "object/block.hpp" namespace { - const float WALKSPEED = 80; const float KICKSPEED = 500; const int MAXSQUISHES = 10; const float KICKSPEED_Y = -500; /**< y-velocity gained when kicked */ } Snail::Snail(const lisp::Lisp& reader) - : BadGuy(reader, "images/creatures/snail/snail.sprite"), state(STATE_NORMAL), squishcount(0) + : WalkingBadguy(reader, "images/creatures/snail/snail.sprite", "left", "right"), state(STATE_NORMAL), squishcount(0) { - set_direction = false; + walk_speed = 80; + max_drop_height = 600; + sound_manager->preload("sounds/iceblock_bump.wav"); + sound_manager->preload("sounds/stomp.wav"); + sound_manager->preload("sounds/kick.wav"); } Snail::Snail(const Vector& pos, Direction d) - : BadGuy(pos, "images/creatures/snail/snail.sprite"), state(STATE_NORMAL), squishcount(0) + : WalkingBadguy(pos, d, "images/creatures/snail/snail.sprite", "left", "right"), state(STATE_NORMAL), squishcount(0) { - set_direction = true; - initial_direction = d; + walk_speed = 80; + max_drop_height = 600; + sound_manager->preload("sounds/iceblock_bump.wav"); + sound_manager->preload("sounds/stomp.wav"); + sound_manager->preload("sounds/kick.wav"); } void Snail::write(lisp::Writer& writer) { writer.start_list("snail"); - - writer.write_float("x", start_position.x); - writer.write_float("y", start_position.y); - + WalkingBadguy::write(writer); writer.end_list("snail"); } void Snail::activate() { - if (set_direction) {dir = initial_direction;} - + WalkingBadguy::activate(); be_normal(); } void Snail::be_normal() { - state = STATE_NORMAL; - sprite->set_action(dir == LEFT ? "left" : "right"); + if (state == STATE_NORMAL) return; - physic.set_velocity_x(dir == LEFT ? -WALKSPEED : WALKSPEED); + state = STATE_NORMAL; + WalkingBadguy::activate(); } void @@ -104,11 +106,7 @@ Snail::active_update(float elapsed_time) switch (state) { case STATE_NORMAL: - if (might_fall(601)) { - dir = (dir == LEFT ? RIGHT : LEFT); - sprite->set_action(dir == LEFT ? "left" : "right"); - physic.set_velocity_x(-physic.get_velocity_x()); - } + WalkingBadguy::active_update(elapsed_time); break; case STATE_FLAT: @@ -118,6 +116,7 @@ Snail::active_update(float elapsed_time) if (flat_timer.check()) { be_normal(); } + BadGuy::active_update(elapsed_time); break; case STATE_KICKED_DELAY: @@ -126,72 +125,73 @@ Snail::active_update(float elapsed_time) physic.set_velocity_y(KICKSPEED_Y); state = STATE_KICKED; } + BadGuy::active_update(elapsed_time); break; case STATE_KICKED: physic.set_velocity_x(physic.get_velocity_x() * pow(0.99, elapsed_time/0.02)); - if (fabsf(physic.get_velocity_x()) < WALKSPEED) be_normal(); + if (fabsf(physic.get_velocity_x()) < walk_speed) be_normal(); + BadGuy::active_update(elapsed_time); break; } - BadGuy::active_update(elapsed_time); } -HitResponse -Snail::collision_solid(GameObject& object, const CollisionHit& hit) +void +Snail::collision_solid(const CollisionHit& hit) { - if(fabsf(hit.normal.y) > .5) { // floor or roof - physic.set_velocity_y(0); - - switch (state) { - case STATE_NORMAL: - case STATE_FLAT: - case STATE_KICKED_DELAY: - break; - case STATE_KICKED: - break; - } - - return CONTINUE; - } - // hit left or right - switch(state) { - + update_on_ground_flag(hit); + + switch (state) { case STATE_NORMAL: - dir = dir == LEFT ? RIGHT : LEFT; - sprite->set_action(dir == LEFT ? "left" : "right"); - physic.set_velocity_x(-physic.get_velocity_x()); + WalkingBadguy::collision_solid(hit); break; - case STATE_FLAT: - case STATE_KICKED_DELAY: - physic.set_velocity_x(0); + if(hit.top || hit.bottom) { + physic.set_velocity_y(0); + } + if(hit.left || hit.right) { + } break; - - case STATE_KICKED: { - sound_manager->play("sounds/iceblock_bump.wav", get_pos()); - - // open bonusblocks, crash bricks - BonusBlock* bonusblock = dynamic_cast (&object); - if(bonusblock) { - bonusblock->try_open(); + case STATE_KICKED_DELAY: + if(hit.top || hit.bottom) { + physic.set_velocity_y(0); } - Brick* brick = dynamic_cast (&object); - if(brick) { - brick->try_break(); + if(hit.left || hit.right) { + physic.set_velocity_x(0); } - - dir = (dir == LEFT) ? RIGHT : LEFT; - sprite->set_action(dir == LEFT ? "flat-left" : "flat-right"); - - physic.set_velocity_x(-physic.get_velocity_x()*0.75); - if (fabsf(physic.get_velocity_x()) < WALKSPEED) be_normal(); break; + case STATE_KICKED: + if(hit.top || hit.bottom) { + physic.set_velocity_y(0); + } + if(hit.left || hit.right) { + sound_manager->play("sounds/iceblock_bump.wav", get_pos()); + +#if 0 + // TODO move this into BonusBlock code + // open bonusblocks, crash bricks + BonusBlock* bonusblock = dynamic_cast (&object); + if(bonusblock) { + bonusblock->try_open(); + } + Brick* brick = dynamic_cast (&object); + if(brick) { + brick->try_break(); + } +#endif + if( ( dir == LEFT && hit.left ) || ( dir == RIGHT && hit.right) ){ + dir = (dir == LEFT) ? RIGHT : LEFT; + sprite->set_action(dir == LEFT ? "flat-left" : "flat-right"); + + physic.set_velocity_x(-physic.get_velocity_x()*0.75); + if (fabsf(physic.get_velocity_x()) < walk_speed) be_normal(); + } - } + } + break; } - - return CONTINUE; + } HitResponse @@ -199,12 +199,7 @@ Snail::collision_badguy(BadGuy& badguy, const CollisionHit& hit) { switch(state) { case STATE_NORMAL: - if(fabsf(hit.normal.x) > .5) { - dir = (dir == LEFT) ? RIGHT : LEFT; - sprite->set_action(dir == LEFT ? "left" : "right"); - physic.set_velocity_x(-physic.get_velocity_x()); - } - return CONTINUE; + return WalkingBadguy::collision_badguy(badguy, hit); case STATE_FLAT: case STATE_KICKED_DELAY: return FORCE_MOVE;