X-Git-Url: https://git.verplant.org/?a=blobdiff_plain;f=src%2Fbadguy%2Fskullyhop.cpp;h=63e6435de30b90f315876c8e2185cc5ad3eeae5b;hb=d84d73b701cc7fa2bd74f3490b9be1bf8b6f705a;hp=2679ee7f0f4661152dd443ebfb995bf130a05413;hpb=d963f8dc3d2c4e432d3eeecd15351169e10243da;p=supertux.git diff --git a/src/badguy/skullyhop.cpp b/src/badguy/skullyhop.cpp index 2679ee7f0..63e6435de 100644 --- a/src/badguy/skullyhop.cpp +++ b/src/badguy/skullyhop.cpp @@ -23,29 +23,23 @@ #include "random_generator.hpp" namespace { - const float VERTICAL_SPEED = 450; /**< y-speed when jumping */ + const float VERTICAL_SPEED = -450; /**< y-speed when jumping */ const float HORIZONTAL_SPEED = 220; /**< x-speed when jumping */ const float MIN_RECOVER_TIME = 0.1; /**< minimum time to stand still before starting a (new) jump */ const float MAX_RECOVER_TIME = 1.0; /**< maximum time to stand still before starting a (new) jump */ + static const std::string HOP_SOUND = "sounds/hop.ogg"; } SkullyHop::SkullyHop(const lisp::Lisp& reader) + : BadGuy(reader, "images/creatures/skullyhop/skullyhop.sprite") { - reader.get("x", start_position.x); - reader.get("y", start_position.y); - bbox.set_size(33.8, 43.8); //sprite is 34x44 - sprite = sprite_manager->create("images/creatures/skullyhop/skullyhop.sprite"); - has_initial_direction = false; + sound_manager->preload( HOP_SOUND ); } -SkullyHop::SkullyHop(float pos_x, float pos_y, Direction d) +SkullyHop::SkullyHop(const Vector& pos, Direction d) + : BadGuy(pos, d, "images/creatures/skullyhop/skullyhop.sprite") { - start_position.x = pos_x; - start_position.y = pos_y; - bbox.set_size(33.8, 43.8); //sprite is 34x44 - sprite = sprite_manager->create("images/creatures/skullyhop/skullyhop.sprite"); - has_initial_direction = true; - initial_direction = d; + sound_manager->preload( HOP_SOUND ); } void @@ -60,8 +54,6 @@ SkullyHop::write(lisp::Writer& writer) void SkullyHop::activate() { - if (has_initial_direction) dir = initial_direction; - // initial state is JUMPING, because we might start airborne state = JUMPING; sprite->set_action(dir == LEFT ? "jumping-left" : "jumping-right"); @@ -85,6 +77,7 @@ SkullyHop::set_state(SkullyHopState newState) sprite->set_action(dir == LEFT ? "jumping-left" : "jumping-right"); physic.set_velocity_x(dir == LEFT ? -HORIZONTAL_SPEED : HORIZONTAL_SPEED); physic.set_velocity_y(VERTICAL_SPEED); + sound_manager->play( HOP_SOUND, get_pos()); } state = newState; @@ -98,37 +91,37 @@ SkullyHop::collision_squished(Player& player) return true; } -HitResponse -SkullyHop::collision_solid(GameObject& , const CollisionHit& hit) +void +SkullyHop::collision_solid(const CollisionHit& hit) { // ignore collisions while standing still - if(state != JUMPING) return CONTINUE; + if(state != JUMPING) + return; // check if we hit the floor while falling - if ((hit.normal.y < 0) && (physic.get_velocity_y() < 0)) { + if(hit.bottom && physic.get_velocity_y() > 0 ) { set_state(STANDING); } - // check if we hit the roof while climbing - if ((hit.normal.y > 0) && (physic.get_velocity_y() > 0)) { + if(hit.top) { physic.set_velocity_y(0); } // check if we hit left or right while moving in either direction - if ((hit.normal.x != 0) && (physic.get_velocity_x() != 0)) { + if(hit.left || hit.right) { dir = dir == LEFT ? RIGHT : LEFT; sprite->set_action(dir == LEFT ? "jumping-left" : "jumping-right"); physic.set_velocity_x(-0.25*physic.get_velocity_x()); } - - return CONTINUE; } HitResponse -SkullyHop::collision_badguy(BadGuy& badguy, const CollisionHit& hit) +SkullyHop::collision_badguy(BadGuy& , const CollisionHit& hit) { // behaviour for badguy collisions is the same as for collisions with solids - return collision_solid(badguy, hit); + collision_solid(hit); + + return CONTINUE; } void