X-Git-Url: https://git.octo.it/?a=blobdiff_plain;f=src%2Fsprite%2Fsprite.cpp;h=c508642670188c3e8cc22318780bdcd28fb6e240;hb=7ebef4bb8c5483983cbf870396541a5ec36ac31e;hp=38a448de07e3650b50f450fcdc917076f17326b6;hpb=c0093d25093395cb62fc2526ab42be65a9f015b8;p=supertux.git diff --git a/src/sprite/sprite.cpp b/src/sprite/sprite.cpp index 38a448de0..c50864267 100644 --- a/src/sprite/sprite.cpp +++ b/src/sprite/sprite.cpp @@ -1,12 +1,10 @@ -// $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 -// 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,62 +12,90 @@ // 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 "sprite/sprite.hpp" -#include -#include -#include -#include +#include +#include -#include "app/globals.h" -#include "app/setup.h" -#include "sprite.h" -#include "video/drawing_context.h" +#include "supertux/timer.hpp" -Sprite::Sprite(SpriteData& newdata) - : data(newdata), frame(0), animation_loops(-1) +Sprite::Sprite(SpriteData& newdata) : + data(newdata), + frame(0), + frameidx(0), + animation_loops(-1), + last_ticks(), + angle(0.0f), + color(1.0f, 1.0f, 1.0f, 1.0f), + blend(), + action(data.get_action("normal")) { - action = data.get_action("normal"); if(!action) action = data.actions.begin()->second; - last_ticks = SDL_GetTicks(); + last_ticks = game_time; } -Sprite::Sprite(const Sprite& other) - : data(other.data), frame(other.frame), - animation_loops(other.animation_loops), - action(other.action) +Sprite::Sprite(const Sprite& other) : + data(other.data), + frame(other.frame), + frameidx(other.frameidx), + animation_loops(other.animation_loops), + last_ticks(game_time), + angle(0.0f), // FIXME: this can't be right + color(1.0f, 1.0f, 1.0f, 1.0f), + blend(), + action(other.action) { - last_ticks = SDL_GetTicks(); } Sprite::~Sprite() { } +SpritePtr +Sprite::clone() const +{ + return SpritePtr(new Sprite(*this)); +} + void -Sprite::set_action(std::string name, int loops) +Sprite::set_action(const std::string& name, int loops) { if(action && action->name == name) return; - SpriteData::Action* newaction = data.get_action(name); + const 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; } action = newaction; animation_loops = loops; frame = 0; + frameidx = 0; +} + +void +Sprite::set_action_continued(const std::string& name) +{ + if(action && action->name == name) + return; + + const SpriteData::Action* newaction = data.get_action(name); + if(!newaction) { + log_debug << "Action '" << name << "' not found." << std::endl; + return; + } + + action = newaction; + update(); } bool -Sprite::check_animation() +Sprite::animation_done() { return animation_loops == 0; } @@ -77,68 +103,140 @@ Sprite::check_animation() void Sprite::update() { - if(animation_loops == 0) - return; - - Uint32 ticks = SDL_GetTicks(); - float frame_inc = action->fps * float(ticks - last_ticks)/1000.0; - last_ticks = ticks; + float frame_inc = action->fps * (game_time - last_ticks); + last_ticks = game_time; frame += frame_inc; - if(frame >= get_frames()) { - frame = fmodf(frame+get_frames(), get_frames()); - + while(frame >= 1.0f) { + frame -= 1.0f; + frameidx++; + } + + while(frameidx >= get_frames()) { + frameidx -= get_frames(); animation_loops--; - if(animation_loops == 0) - frame = 0; + if(animation_done()) { + break; + } } + + if(animation_done()) { + frame = 0; + frameidx = get_frames()-1; + } + + assert(frameidx < get_frames()); } void Sprite::draw(DrawingContext& context, const Vector& pos, int layer, - Uint32 drawing_effect) + DrawingEffect effect) { assert(action != 0); 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; - else - context.draw_surface(action->surfaces[(int)frame], - pos - Vector(action->x_offset, action->y_offset), - layer + action->z_order, drawing_effect); + context.set_drawing_effect(effect); + context.draw_surface(action->surfaces[frameidx], + pos - Vector(action->x_offset, action->y_offset), + angle, + color, + blend, + layer + action->z_order); } void Sprite::draw_part(DrawingContext& context, const Vector& source, - const Vector& size, const Vector& pos, int layer, Uint32 drawing_effect) + const Vector& size, const Vector& pos, int layer) { 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, drawing_effect); + context.draw_surface_part(action->surfaces[frameidx], + Rectf(source, Sizef(size)), + Rectf(pos - Vector(action->x_offset, action->y_offset), + Sizef(size)), + layer + action->z_order); } int Sprite::get_width() const { - return action->surfaces[get_frame()]->w; + assert(frameidx < get_frames()); + return (int) action->surfaces[get_frame()]->get_width(); } int Sprite::get_height() const { - return action->surfaces[get_frame()]->h; + assert(frameidx < get_frames()); + 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; +} + +Rectf +Sprite::get_current_hitbox() const +{ + return Rectf(action->x_offset, action->y_offset, action->x_offset + action->hitbox_w, action->y_offset + action->hitbox_h); +} + +void +Sprite::set_angle(float a) +{ + angle = a; +} + +float +Sprite::get_angle() const +{ + return angle; +} + +void +Sprite::set_color(const Color& c) +{ + color = c; } +Color +Sprite::get_color() const +{ + return color; +} + +void +Sprite::set_blend(const Blend& b) +{ + blend = b; +} + +Blend +Sprite::get_blend() const +{ + return blend; +} +/* EOF */