X-Git-Url: https://git.verplant.org/?a=blobdiff_plain;f=src%2Fobject%2Fgameobjs.cpp;h=59b09ce01ff3332382982f2e92b2c4f97f3aac20;hb=75acd4b141f45e851a492f089aa9ad24a9552409;hp=6a5d391a4a3c11d480a296d68ab0f05108b815e8;hpb=c0093d25093395cb62fc2526ab42be65a9f015b8;p=supertux.git diff --git a/src/object/gameobjs.cpp b/src/object/gameobjs.cpp index 6a5d391a4..59b09ce01 100644 --- a/src/object/gameobjs.cpp +++ b/src/object/gameobjs.cpp @@ -1,8 +1,7 @@ // $Id$ -// +// // SuperTux -// Copyright (C) 2000 Bill Kendrick -// Copyright (C) 2004 Tobias Glaesser +// 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 @@ -13,35 +12,45 @@ // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // 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. +// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + #include #include #include #include -#include "app/globals.h" -#include "tile.h" -#include "tile_manager.h" -#include "game_session.h" -#include "gameobjs.h" -#include "sprite/sprite_manager.h" -#include "resources.h" -#include "sector.h" -#include "tilemap.h" -#include "video/drawing_context.h" -#include "camera.h" - -BouncyCoin::BouncyCoin(const Vector& pos) - : position(pos) -{ - timer.start(.3); - sprite = sprite_manager->create("coin"); - sprite->set_action("still"); +#include "tile.hpp" +#include "tile_manager.hpp" +#include "game_session.hpp" +#include "gameobjs.hpp" +#include "sprite/sprite_manager.hpp" +#include "sprite/sprite.hpp" +#include "resources.hpp" +#include "sector.hpp" +#include "tilemap.hpp" +#include "video/drawing_context.hpp" +#include "camera.hpp" +#include "main.hpp" +#include "random_generator.hpp" + +/** this controls the time over which a bouncy coin fades */ +static const float FADE_TIME = .2f; +/** this is the total life time of a bouncy coin */ +static const float LIFE_TIME = .5f; + +BouncyCoin::BouncyCoin(const Vector& pos, bool emerge) + : position(pos), emerge_distance(0) +{ + timer.start(LIFE_TIME); + sprite = sprite_manager->create("images/objects/coin/coin.sprite"); + + if(emerge) { + emerge_distance = sprite->get_height(); + } } BouncyCoin::~BouncyCoin() @@ -50,9 +59,11 @@ BouncyCoin::~BouncyCoin() } void -BouncyCoin::action(float elapsed_time) +BouncyCoin::update(float elapsed_time) { - position.y += -200 * elapsed_time; + float dist = -200 * elapsed_time; + position.y += dist; + emerge_distance += dist; if(timer.check()) remove_me(); @@ -61,7 +72,25 @@ BouncyCoin::action(float elapsed_time) void BouncyCoin::draw(DrawingContext& context) { - sprite->draw(context, position, LAYER_OBJECTS); + float time_left = timer.get_timeleft(); + bool fading = time_left < FADE_TIME; + if(fading) { + float alpha = time_left/FADE_TIME; + context.push_transform(); + context.set_alpha(alpha); + } + + int layer; + if(emerge_distance > 0) { + layer = LAYER_OBJECTS - 5; + } else { + layer = LAYER_OBJECTS + 5; + } + sprite->draw(context, position, layer); + + if(fading) { + context.pop_transform(); + } } //--------------------------------------------------------------------------- @@ -70,7 +99,7 @@ BrokenBrick::BrokenBrick(Sprite* nsprite, const Vector& pos, const Vector& nmovement) : sprite(new Sprite(*nsprite)), position(pos), movement(nmovement) { - timer.start(.2); + timer.start(.2f); } BrokenBrick::~BrokenBrick() @@ -79,7 +108,7 @@ BrokenBrick::~BrokenBrick() } void -BrokenBrick::action(float elapsed_time) +BrokenBrick::update(float elapsed_time) { position += movement * elapsed_time; @@ -91,7 +120,7 @@ void BrokenBrick::draw(DrawingContext& context) { sprite->draw_part(context, - Vector(rand() % 16, rand() % 16), Vector(16, 16), + Vector(systemRandom.rand(16), systemRandom.rand(16)), Vector(16, 16), position, LAYER_OBJECTS + 1); } @@ -100,14 +129,14 @@ BrokenBrick::draw(DrawingContext& context) FloatingText::FloatingText(const Vector& pos, const std::string& text_) : position(pos), text(text_) { - timer.start(.1); + timer.start(.1f); position.x -= text.size() * 8; } FloatingText::FloatingText(const Vector& pos, int score) : position(pos) { - timer.start(.1); + timer.start(.1f); // turn int into a string char str[10]; @@ -118,7 +147,7 @@ FloatingText::FloatingText(const Vector& pos, int score) } void -FloatingText::action(float elapsed_time) +FloatingText::update(float elapsed_time) { position.y -= 1.4 * elapsed_time; @@ -131,7 +160,7 @@ FloatingText::action(float elapsed_time) void FloatingText::draw(DrawingContext& context) { - // make an alpha animation when disapearing + // make an alpha animation when disappearing int alpha; if(timer.get_timeleft() < FADING_TIME) alpha = int(timer.get_timeleft() * 255 / FADING_TIME); @@ -141,7 +170,7 @@ FloatingText::draw(DrawingContext& context) context.push_transform(); context.set_alpha(alpha); - context.draw_text(gold_text, text, position, LEFT_ALLIGN, LAYER_OBJECTS+1); + context.draw_text(normal_font, text, position, ALIGN_LEFT, LAYER_OBJECTS+1, FloatingText::text_color); context.pop_transform(); } @@ -151,112 +180,26 @@ Sprite *img_smoke_cloud = 0; SmokeCloud::SmokeCloud(const Vector& pos) : position(pos) { - timer.start(.3); -} - -void -SmokeCloud::action(float elapsed_time) -{ - position.y -= 120 * elapsed_time; - - if(timer.check()) - remove_me(); -} - -void -SmokeCloud::draw(DrawingContext& context) -{ - img_smoke_cloud->draw(context, position, LAYER_OBJECTS+1); + timer.start(.3f); + sprite = sprite_manager->create("images/objects/particles/stomp.sprite"); } -Particles::Particles(const Vector& epicenter, int min_angle, int max_angle, - const Vector& initial_velocity, const Vector& acceleration, int number, - Color color_, int size_, float life_time, int drawing_layer_) - : accel(acceleration), color(color_), size(size_), drawing_layer(drawing_layer_) +SmokeCloud::~SmokeCloud() { - if(life_time == 0) { - live_forever = true; - } else { - live_forever = false; - timer.start(life_time); - } - - // create particles - for(int p = 0; p < number; p++) - { - Particle* particle = new Particle; - particle->pos = epicenter; - - float angle = ((rand() % (max_angle-min_angle))+min_angle) - * (M_PI / 180); // convert to radius - particle->vel.x = /*fabs*/(sin(angle)) * initial_velocity.x; -// if(angle >= M_PI && angle < M_PI*2) -// particle->vel.x *= -1; // work around to fix signal - particle->vel.y = /*fabs*/(cos(angle)) * initial_velocity.y; -// if(angle >= M_PI_2 && angle < 3*M_PI_2) -// particle->vel.y *= -1; - - particles.push_back(particle); - } -} - -Particles::~Particles() -{ - // free particles - for(std::vector::iterator i = particles.begin(); - i < particles.end(); i++) - delete (*i); + delete sprite; } void -Particles::action(float elapsed_time) +SmokeCloud::update(float elapsed_time) { - Vector camera = Sector::current()->camera->get_translation(); - - // update particles - for(std::vector::iterator i = particles.begin(); - i != particles.end(); ) { - (*i)->pos.x += (*i)->vel.x * elapsed_time; - (*i)->pos.y += (*i)->vel.y * elapsed_time; - - (*i)->vel.x += accel.x * elapsed_time; - (*i)->vel.y += accel.y * elapsed_time; - - if((*i)->pos.x < camera.x || (*i)->pos.x > SCREEN_WIDTH + camera.x || - (*i)->pos.y < camera.y || (*i)->pos.y > SCREEN_HEIGHT + camera.y) { - delete (*i); - i = particles.erase(i); - } else { - ++i; - } - } + position.y -= 120 * elapsed_time; - if((timer.check() && !live_forever) || particles.size() == 0) + if(timer.check()) remove_me(); } void -Particles::draw(DrawingContext& context) -{ - // draw particles - for(std::vector::iterator i = particles.begin(); - i != particles.end(); i++) { - context.draw_filled_rect((*i)->pos, Vector(size,size), color,drawing_layer); - } -} - -void load_object_gfx() -{ -#if 0 - img_trampoline = sprite_manager->load("trampoline"); - img_trampoline->start_animation(0); - img_flying_platform = sprite_manager->load("flying_platform"); -#endif - img_smoke_cloud = sprite_manager->create("stomp"); -} - -void free_object_gfx() +SmokeCloud::draw(DrawingContext& context) { - delete img_smoke_cloud; + sprite->draw(context, position, LAYER_OBJECTS+1); } -