X-Git-Url: https://git.octo.it/?a=blobdiff_plain;f=src%2Fobject%2Fcoin.cpp;h=d3cc16398a853f26d4b67854857980a29fb79684;hb=3546f9b659b3b2ec53b2bee45e6f81e755d9207f;hp=2684bcd2a0e816342d3a4dc9817d7110a1a1e8cb;hpb=b4868c421ba670cd6301394558f1034e38a0c7b3;p=supertux.git diff --git a/src/object/coin.cpp b/src/object/coin.cpp index 2684bcd2a..d3cc16398 100644 --- a/src/object/coin.cpp +++ b/src/object/coin.cpp @@ -1,12 +1,10 @@ -// $Id$ -// // SuperTux // Copyright (C) 2006 Matthias Braun // -// 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,35 +12,74 @@ // 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 - -#include "coin.hpp" -#include "resources.hpp" -#include "video/drawing_context.hpp" -#include "sprite/sprite_manager.hpp" -#include "player.hpp" -#include "sector.hpp" -#include "player_status.hpp" -#include "gameobjs.hpp" -#include "statistics.hpp" -#include "object_factory.hpp" -#include "level.hpp" -#include "random_generator.hpp" -#include "audio/sound_source.hpp" +// along with this program. If not, see . + +#include "object/coin.hpp" + #include "audio/sound_manager.hpp" -#include "timer.hpp" +#include "util/reader.hpp" +#include "object/bouncy_coin.hpp" +#include "object/player.hpp" +#include "object/tilemap.hpp" +#include "supertux/level.hpp" +#include "supertux/object_factory.hpp" +#include "supertux/sector.hpp" Coin::Coin(const Vector& pos) - : MovingSprite(pos, "images/objects/coin/coin.sprite", LAYER_TILES, COLGROUP_TOUCHABLE) + : MovingSprite(pos, "images/objects/coin/coin.sprite", LAYER_OBJECTS - 1, COLGROUP_TOUCHABLE), + path(), + walker(), + offset(), + from_tilemap(false), + physic() +{ + sound_manager->preload("sounds/coin.wav"); +} + +Coin::Coin(const Vector& pos, TileMap* tilemap) + : MovingSprite(pos, "images/objects/coin/coin.sprite", LAYER_OBJECTS - 1, COLGROUP_TOUCHABLE), + path(boost::shared_ptr(tilemap->get_path())), + walker(boost::shared_ptr(tilemap->get_walker())), + offset(), + from_tilemap(true), + physic() +{ + if(walker.get()) { + Vector v = path->get_base(); + offset = pos - v; + } + + sound_manager->preload("sounds/coin.wav"); +} + +Coin::Coin(const Reader& reader) + : MovingSprite(reader, "images/objects/coin/coin.sprite", LAYER_OBJECTS - 1, COLGROUP_TOUCHABLE), + path(), + walker(), + offset(), + from_tilemap(false), + physic() { + const lisp::Lisp* pathLisp = reader.get_lisp("path"); + if (pathLisp) { + path.reset(new Path()); + path->read(*pathLisp); + walker.reset(new PathWalker(path.get())); + Vector v = path->get_base(); + set_pos(v); + } + + sound_manager->preload("sounds/coin.wav"); } -Coin::Coin(const lisp::Lisp& reader) - : MovingSprite(reader, "images/objects/coin/coin.sprite", LAYER_TILES, COLGROUP_TOUCHABLE) +void +Coin::update(float elapsed_time) { + // if we have a path to follow, follow it + if (walker.get()) { + Vector v = from_tilemap ? offset + walker->get_pos() : walker->advance(elapsed_time); + movement = v - get_pos(); + } } void @@ -50,74 +87,74 @@ Coin::collect() { // TODO: commented out musical code. Maybe fork this for a special "MusicalCoin" object? /* - static Timer sound_timer; - static int pitch_one = 128; - static float last_pitch = 1; - float pitch = 1; + static Timer sound_timer; + static int pitch_one = 128; + static float last_pitch = 1; + float pitch = 1; - int tile = static_cast(get_pos().y / 32); + int tile = static_cast(get_pos().y / 32); - if (!sound_timer.started()) { + if (!sound_timer.started()) { pitch_one = tile; pitch = 1; last_pitch = 1; - } - else if (sound_timer.get_timegone() < 0.02) { + } + else if (sound_timer.get_timegone() < 0.02) { pitch = last_pitch; - } - else - { + } + else + { switch ((pitch_one - tile) % 7) { - case -6: - pitch = 1.0/2; - break; - case -5: - pitch = 5.0/8; - break; - case -4: - pitch = 4.0/6; - break; - case -3: - pitch = 3.0/4; - break; - case -2: - pitch = 5.0/6; - break; - case -1: - pitch = 9.0/10; - break; - case 0: - pitch = 1.0; - break; - case 1: - pitch = 9.0/8; - break; - case 2: - pitch = 5.0/4; - break; - case 3: - pitch = 4.0/3; - break; - case 4: - pitch = 3.0/2; - break; - case 5: - pitch = 5.0/3; - break; - case 6: - pitch = 9.0/5; - break; + case -6: + pitch = 1.0/2; + break; + case -5: + pitch = 5.0/8; + break; + case -4: + pitch = 4.0/6; + break; + case -3: + pitch = 3.0/4; + break; + case -2: + pitch = 5.0/6; + break; + case -1: + pitch = 9.0/10; + break; + case 0: + pitch = 1.0; + break; + case 1: + pitch = 9.0/8; + break; + case 2: + pitch = 5.0/4; + break; + case 3: + pitch = 4.0/3; + break; + case 4: + pitch = 3.0/2; + break; + case 5: + pitch = 5.0/3; + break; + case 6: + pitch = 9.0/5; + break; } last_pitch = pitch; - } - sound_timer.start(1); - - SoundSource* soundSource = sound_manager->create_sound_source("sounds/coin.wav"); - soundSource->set_position(get_pos()); - soundSource->set_pitch(pitch); - soundSource->play(); - sound_manager->manage_source(soundSource); -*/ + } + sound_timer.start(1); + + SoundSource* soundSource = sound_manager->create_sound_source("sounds/coin.wav"); + soundSource->set_position(get_pos()); + soundSource->set_pitch(pitch); + soundSource->play(); + sound_manager->manage_source(soundSource); + */ Sector::current()->player->get_status()->add_coins(1); Sector::current()->add_object(new BouncyCoin(get_pos())); Sector::current()->get_level()->stats.coins++; @@ -135,4 +172,59 @@ Coin::collision(GameObject& other, const CollisionHit& ) return ABORT_MOVE; } -IMPLEMENT_FACTORY(Coin, "coin"); +/* The following defines a coin subject to gravity */ +HeavyCoin::HeavyCoin(const Vector& pos, const Vector& init_velocity) + : Coin(pos), + physic() +{ + physic.enable_gravity(true); + sound_manager->preload("sounds/coin2.ogg"); + set_group(COLGROUP_MOVING); + physic.set_velocity(init_velocity); +} + +HeavyCoin::HeavyCoin(const Reader& reader) + : Coin(reader), + physic() +{ + physic.enable_gravity(true); + sound_manager->preload("sounds/coin2.ogg"); + set_group(COLGROUP_MOVING); +} + +void +HeavyCoin::update(float elapsed_time) +{ + // enable physics + movement = physic.get_movement(elapsed_time); +} + +void +HeavyCoin::collision_solid(const CollisionHit& hit) +{ + int clink_threshold = 100; // sets the minimum speed needed to result in collision noise + //TODO: colliding HeavyCoins should have their own unique sound + + if(hit.bottom) { + if(physic.get_velocity_y() > clink_threshold) + sound_manager->play("sounds/coin2.ogg"); + if(physic.get_velocity_y() > 200) {// lets some coins bounce + physic.set_velocity_y(-99); + }else{ + physic.set_velocity_y(0); + physic.set_velocity_x(0); + } + } + if(hit.right || hit.left) { + if(physic.get_velocity_x() > clink_threshold || physic.get_velocity_x() < clink_threshold) + sound_manager->play("sounds/coin2.ogg"); + physic.set_velocity_x(-physic.get_velocity_x()); + } + if(hit.top) { + if(physic.get_velocity_y() < clink_threshold) + sound_manager->play("sounds/coin2.ogg"); + physic.set_velocity_y(-physic.get_velocity_y()); + } +} + +/* EOF */