X-Git-Url: https://git.octo.it/?a=blobdiff_plain;f=src%2Fsprite%2Fsprite.cpp;h=7a32c3fee4f2c809d37ea456677aa3ea6c5df33a;hb=e19e93b038e0feb50d7895371827b24e58de3edd;hp=50475461e4ec5f69dccec4b46297652b16ab7fe0;hpb=86181b0a14d89cf45daf97199c3556c4dd1ee7b7;p=supertux.git diff --git a/src/sprite/sprite.cpp b/src/sprite/sprite.cpp index 50475461e..7a32c3fee 100644 --- a/src/sprite/sprite.cpp +++ b/src/sprite/sprite.cpp @@ -1,7 +1,7 @@ // $Id$ // // SuperTux -// Copyright (C) 2004 Ingo Ruhnke +// 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 @@ -16,6 +16,7 @@ // 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 @@ -25,6 +26,8 @@ #include "sprite.hpp" #include "video/drawing_context.hpp" +#include "log.hpp" +#include "timer.hpp" Sprite::Sprite(SpriteData& newdata) : data(newdata), frame(0), animation_loops(-1) @@ -32,7 +35,7 @@ Sprite::Sprite(SpriteData& newdata) action = data.get_action("normal"); if(!action) action = data.actions.begin()->second; - last_ticks = SDL_GetTicks(); + last_ticks = real_time; } Sprite::Sprite(const Sprite& other) @@ -40,7 +43,7 @@ Sprite::Sprite(const Sprite& other) animation_loops(other.animation_loops), action(other.action) { - last_ticks = SDL_GetTicks(); + last_ticks = real_time; } Sprite::~Sprite() @@ -55,9 +58,7 @@ Sprite::set_action(const std::string& name, int loops) SpriteData::Action* newaction = data.get_action(name); if(!newaction) { -#ifdef DEBUG - std::cerr << "Action '" << name << "' not found.\n"; -#endif + log_debug << "Action '" << name << "' not found." << std::endl; return; } @@ -67,7 +68,7 @@ Sprite::set_action(const std::string& name, int loops) } bool -Sprite::check_animation() +Sprite::animation_done() { return animation_loops == 0; } @@ -75,21 +76,20 @@ Sprite::check_animation() void Sprite::update() { - if(animation_loops == 0) + if(animation_done()) return; - Uint32 ticks = SDL_GetTicks(); - float frame_inc = action->fps * float(ticks - last_ticks)/1000.0; - last_ticks = ticks; + float frame_inc = action->fps * (real_time - last_ticks); + last_ticks = real_time; frame += frame_inc; if(frame >= get_frames()) { - frame = fmodf(frame+get_frames(), get_frames()); - + frame = fmodf(frame, get_frames()); + animation_loops--; - if(animation_loops == 0) - frame = 0; + if(animation_done()) + frame = get_frames()-1; } } @@ -100,9 +100,7 @@ Sprite::draw(DrawingContext& context, const Vector& pos, int layer) update(); if((int)frame >= get_frames() || (int)frame < 0) - std::cerr << "Warning: frame out of range: " << (int)frame - << "/" << get_frames() << " at " << get_name() - << "/" << get_action_name() << std::endl; + log_warning << "frame out of range: " << (int)frame << "/" << get_frames() << " at " << get_name() << "/" << get_action() << std::endl; else context.draw_surface(action->surfaces[(int)frame], pos - Vector(action->x_offset, action->y_offset), @@ -116,14 +114,20 @@ Sprite::draw_part(DrawingContext& context, const Vector& source, assert(action != 0); update(); - if((int)frame >= get_frames() || (int)frame < 0) - std::cerr << "Warning: frame out of range: " << (int)frame - << "/" << get_frames() << " at sprite: " << get_name() - << "/" << get_action_name() << std::endl; - else - context.draw_surface_part(action->surfaces[(int)frame], source, size, - pos - Vector(action->x_offset, action->y_offset), - layer + action->z_order); + int frameidx = (int) frame; + + if(frameidx >= get_frames() || frameidx < 0) { +#ifndef DEBUG + // in optimized mode we get some small rounding errors in floating point + // number sometimes... + log_warning << "frame out of range: " << frameidx << "/" << get_frames() << " at sprite: " << get_name() << "/" << get_action() << std::endl; +#endif + frameidx = get_frames() - 1; + } + + context.draw_surface_part(action->surfaces[frameidx], source, size, + pos - Vector(action->x_offset, action->y_offset), + layer + action->z_order); } int @@ -138,4 +142,40 @@ Sprite::get_height() const return (int) action->surfaces[get_frame()]->get_height(); } +float +Sprite::get_current_hitbox_x_offset() const +{ + return action->x_offset; +} + +float +Sprite::get_current_hitbox_y_offset() const +{ + return action->y_offset; +} + +float +Sprite::get_current_hitbox_width() const +{ + return action->hitbox_w; +} + +float +Sprite::get_current_hitbox_height() const +{ + return action->hitbox_h; +} + +Rect +Sprite::get_current_hitbox() const +{ + return Rect(action->x_offset, action->y_offset, action->x_offset + action->hitbox_w, action->y_offset + action->hitbox_h); +} + +void +Sprite::set_fps(float new_fps) +{ + action->fps = new_fps; +} +