X-Git-Url: https://git.octo.it/?a=blobdiff_plain;f=src%2Fbadguy%2Fskullyhop.cpp;h=7f1d7becbe7e5d77323b3adc95f60027005322ec;hb=5f860f41a3f362de0a5dda951ff2ba4ebff95681;hp=9282d29ea717a30a910a7b4f7574db5c4442ca43;hpb=78e9b27b7059c9b9b16a7f871ab71f751ec75323;p=supertux.git diff --git a/src/badguy/skullyhop.cpp b/src/badguy/skullyhop.cpp index 9282d29ea..7f1d7becb 100644 --- a/src/badguy/skullyhop.cpp +++ b/src/badguy/skullyhop.cpp @@ -1,12 +1,10 @@ -// $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 -// as published by the Free Software Foundation; either version 2 -// of the License, or (at your option) any later version. +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of @@ -14,48 +12,40 @@ // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License -// along with this program; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA -// 02111-1307, USA. -#include +// along with this program. If not, see . + +#include "badguy/skullyhop.hpp" -#include "skullyhop.hpp" -#include "random_generator.hpp" +#include "audio/sound_manager.hpp" +#include "math/random_generator.hpp" +#include "sprite/sprite.hpp" +#include "supertux/object_factory.hpp" 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 SKULLYHOP_SOUND = "sounds/hop.ogg"; } -SkullyHop::SkullyHop(const lisp::Lisp& reader) - : BadGuy(reader, "images/creatures/skullyhop/skullyhop.sprite") +SkullyHop::SkullyHop(const Reader& reader) : + BadGuy(reader, "images/creatures/skullyhop/skullyhop.sprite"), + recover_timer(), + state() { - has_initial_direction = false; + SoundManager::current()->preload( SKULLYHOP_SOUND ); } -SkullyHop::SkullyHop(const Vector& pos, Direction d) - : BadGuy(pos, "images/creatures/skullyhop/skullyhop.sprite") +SkullyHop::SkullyHop(const Vector& pos, Direction d) : + BadGuy(pos, d, "images/creatures/skullyhop/skullyhop.sprite"), + recover_timer(), + state() { - has_initial_direction = true; - initial_direction = d; + SoundManager::current()->preload( SKULLYHOP_SOUND ); } void -SkullyHop::write(lisp::Writer& writer) +SkullyHop::initialize() { - writer.start_list("skullyhop"); - writer.write_float("x", start_position.x); - writer.write_float("y", start_position.y); - writer.end_list("skullyhop"); -} - -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"); @@ -69,60 +59,77 @@ SkullyHop::set_state(SkullyHopState newState) physic.set_velocity_y(0); sprite->set_action(dir == LEFT ? "standing-left" : "standing-right"); - float recover_time = systemRandom.randf(MIN_RECOVER_TIME,MAX_RECOVER_TIME); + float recover_time = gameRandom.randf(MIN_RECOVER_TIME,MAX_RECOVER_TIME); recover_timer.start(recover_time); } else - if (newState == CHARGING) { - sprite->set_action(dir == LEFT ? "charging-left" : "charging-right", 1); - } else - if (newState == JUMPING) { - 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); - } + if (newState == CHARGING) { + sprite->set_action(dir == LEFT ? "charging-left" : "charging-right", 1); + } else + if (newState == JUMPING) { + sprite->set_action(dir == LEFT ? "jumping-left" : "jumping-right"); +const float HORIZONTAL_SPEED = 220; /**< x-speed when jumping */ + physic.set_velocity_x(dir == LEFT ? -HORIZONTAL_SPEED : HORIZONTAL_SPEED); +const float VERTICAL_SPEED = -450; /**< y-speed when jumping */ + physic.set_velocity_y(VERTICAL_SPEED); + SoundManager::current()->play( SKULLYHOP_SOUND, get_pos()); + } state = newState; } bool -SkullyHop::collision_squished(Player& player) +SkullyHop::collision_squished(GameObject& object) { + if (frozen) + return BadGuy::collision_squished(object); + sprite->set_action(dir == LEFT ? "squished-left" : "squished-right"); - kill_squished(player); + kill_squished(object); return true; } -HitResponse -SkullyHop::collision_solid(GameObject& , const CollisionHit& hit) +void +SkullyHop::collision_solid(const CollisionHit& hit) { + if (frozen) + { + BadGuy::collision_solid(hit); + return; + } + + // 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 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 @@ -130,6 +137,10 @@ SkullyHop::active_update(float elapsed_time) { BadGuy::active_update(elapsed_time); + // no change if frozen + if (frozen) + return; + // charge when fully recovered if ((state == STANDING) && (recover_timer.check())) { set_state(CHARGING); @@ -140,7 +151,20 @@ SkullyHop::active_update(float elapsed_time) if ((state == CHARGING) && (sprite->animation_done())) { set_state(JUMPING); return; - } + } +} + +void +SkullyHop::unfreeze() +{ + BadGuy::unfreeze(); + initialize(); +} + +bool +SkullyHop::is_freezable() const +{ + return true; } -IMPLEMENT_FACTORY(SkullyHop, "skullyhop") +/* EOF */