X-Git-Url: https://git.octo.it/?a=blobdiff_plain;f=src%2Fsprite%2Fsprite.cpp;h=d4ac1c5a2ba3d02a8df28cfd9d26763455f0282e;hb=8099ed94a2642c410ebcd1315a28d14fa6524d49;hp=00c624713a91667f88c329d5412e602b0c6ebcbf;hpb=0281069747a0a8b81b6d51f5e090353334a74c01;p=supertux.git diff --git a/src/sprite/sprite.cpp b/src/sprite/sprite.cpp index 00c624713..d4ac1c5a2 100644 --- a/src/sprite/sprite.cpp +++ b/src/sprite/sprite.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,39 +12,39 @@ // 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 -#include -#include -#include +#include +#include "sprite/sprite.hpp" +#include "supertux/timer.hpp" -#include "video/surface.hpp" -#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), angle(0.0f) +Sprite::Sprite(SpriteData& newdata) : + data(newdata), + frame(0), + animation_loops(-1), + last_ticks(), + angle(0.0f), + color(1.0f, 1.0f, 1.0f, 1.0f), + blend(), + action() { action = data.get_action("normal"); if(!action) action = data.actions.begin()->second; - last_ticks = real_time; + last_ticks = game_time; } -Sprite::Sprite(const Sprite& other) - : data(other.data), frame(other.frame), - animation_loops(other.animation_loops), - angle(0.0f), - action(other.action) +Sprite::Sprite(const Sprite& other) : + data(other.data), + frame(other.frame), + 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 = real_time; } Sprite::~Sprite() @@ -70,6 +68,28 @@ Sprite::set_action(const std::string& name, int loops) frame = 0; } +void +Sprite::set_action_continued(const std::string& name) +{ + if(action && action->name == name) + return; + + SpriteData::Action* newaction = data.get_action(name); + if(!newaction) { + log_debug << "Action '" << name << "' not found." << std::endl; + return; + } + + action = newaction; + if(frame >= get_frames()) { + frame = fmodf(frame, get_frames()); + + if (animation_loops > 0) animation_loops--; + if(animation_done()) + frame = get_frames()-1; + } +} + bool Sprite::animation_done() { @@ -82,14 +102,14 @@ Sprite::update() if(animation_done()) return; - float frame_inc = action->fps * (real_time - last_ticks); - last_ticks = real_time; + 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()); - + animation_loops--; if(animation_done()) frame = get_frames()-1; @@ -108,42 +128,60 @@ Sprite::draw(DrawingContext& context, const Vector& pos, int layer) context.draw_surface(action->surfaces[(int)frame], 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) + const Vector& size, const Vector& pos, int layer) { assert(action != 0); update(); int frameidx = (int) frame; - + if(frameidx >= get_frames() || frameidx < 0) { -#ifndef DEBUG +#ifdef NDEBUG // 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); + pos - Vector(action->x_offset, action->y_offset), + layer + action->z_order); } int Sprite::get_width() const { - return (int) action->surfaces[get_frame()]->get_width(); + if((int)frame >= get_frames() || (int)frame < 0) + { + log_warning << "frame out of range: " << (int)frame << "/" << get_frames() << " at " << get_name() << "/" << get_action() << std::endl; + return 0; + } + else + { + return (int) action->surfaces[get_frame()]->get_width(); + } } int Sprite::get_height() const { + if((int)frame >= get_frames() || (int)frame < 0) + { + log_warning << "frame out of range: " << (int)frame << "/" << get_frames() << " at " << get_name() << "/" << get_action() << std::endl; + return 0; + } + else + { return (int) action->surfaces[get_frame()]->get_height(); + } } float @@ -170,10 +208,10 @@ Sprite::get_current_hitbox_height() const return action->hitbox_h; } -Rect +Rectf 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); + return Rectf(action->x_offset, action->y_offset, action->x_offset + action->hitbox_w, action->y_offset + action->hitbox_h); } void @@ -194,4 +232,28 @@ 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 */