X-Git-Url: https://git.verplant.org/?a=blobdiff_plain;f=src%2Fbadguy%2Fskullyhop.cpp;h=3c1fe3e219af491b9b9943945aa11199303df01c;hb=013a5ca196545a094f27c1b708facd0084d58d55;hp=d9b954e8ec415c44dcb9631452577558cbcebe11;hpb=2892ebda09d24c977547159e34abf0244884b89e;p=supertux.git diff --git a/src/badguy/skullyhop.cpp b/src/badguy/skullyhop.cpp index d9b954e8e..3c1fe3e21 100644 --- a/src/badguy/skullyhop.cpp +++ b/src/badguy/skullyhop.cpp @@ -1,7 +1,7 @@ // $Id$ // // SkullyHop - A Hopping Skull -// Copyright (C) 2006 Christoph Sommer +// Copyright (C) 2006 Christoph Sommer // // This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License @@ -25,18 +25,21 @@ namespace { 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 */ + const float MIN_RECOVER_TIME = 0.1f; /**< minimum time to stand still before starting a (new) jump */ + const float MAX_RECOVER_TIME = 1.0f; /**< 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") { + sound_manager->preload( HOP_SOUND ); } SkullyHop::SkullyHop(const Vector& pos, Direction d) : BadGuy(pos, d, "images/creatures/skullyhop/skullyhop.sprite") { + sound_manager->preload( HOP_SOUND ); } void @@ -49,7 +52,7 @@ SkullyHop::write(lisp::Writer& writer) } void -SkullyHop::activate() +SkullyHop::initialize() { // initial state is JUMPING, because we might start airborne state = JUMPING; @@ -74,32 +77,38 @@ 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; } bool -SkullyHop::collision_squished(Player& player) +SkullyHop::collision_squished(GameObject& object) { sprite->set_action(dir == LEFT ? "squished-left" : "squished-right"); - kill_squished(player); + kill_squished(object); return true; } void SkullyHop::collision_solid(const CollisionHit& hit) { + // just default behaviour (i.e. stop at floor/walls) when squished + if (BadGuy::get_state() == STATE_SQUISHED) { + BadGuy::collision_solid(hit); + } + // ignore collisions while standing still if(state != JUMPING) return; // check if we hit the floor while falling - if(hit.bottom) { + if(hit.bottom && physic.get_velocity_y() > 0 ) { set_state(STANDING); } // check if we hit the roof while climbing - if(hit.top) { + if(hit.top) { physic.set_velocity_y(0); } @@ -135,7 +144,7 @@ SkullyHop::active_update(float elapsed_time) if ((state == CHARGING) && (sprite->animation_done())) { set_state(JUMPING); return; - } + } } IMPLEMENT_FACTORY(SkullyHop, "skullyhop")