X-Git-Url: https://git.verplant.org/?a=blobdiff_plain;f=src%2Fsprite%2Fsprite.hpp;h=b85b62ed48304236fef929d52c406d5ecdd67835;hb=4434ccd7364d603d6bf952ff1df56e28e1978a63;hp=9b1dee8507d20508517a25e9585956b5410dc1a1;hpb=5b7f9214cb929399f1a855ef5807018a9447d510;p=supertux.git diff --git a/src/sprite/sprite.hpp b/src/sprite/sprite.hpp index 9b1dee850..b85b62ed4 100644 --- a/src/sprite/sprite.hpp +++ b/src/sprite/sprite.hpp @@ -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 @@ -12,7 +12,7 @@ // 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. @@ -21,74 +21,116 @@ #define SUPERTUX_SPRITE_H #include -#include -#include -#include +#include +#include -#include "video/surface.hpp" #include "math/vector.hpp" +#include "math/rect.hpp" #include "sprite_data.hpp" +#include "video/color.hpp" +#include "video/drawing_context.hpp" + +class Surface; +class DrawingContext; +class Color; +class Blend; class Sprite { public: - Sprite(SpriteData& data); - Sprite(const Sprite& other); - ~Sprite(); - - /** Draw sprite, automatically calculates next frame */ - void draw(DrawingContext& context, const Vector& pos, int layer); - - void draw_part(DrawingContext& context, const Vector& source, - const Vector& size, const Vector& pos, int layer); - - /** Set action (or state) */ - void set_action(std::string act, int loops = -1); - - /* Stop animation */ - void stop_animation() - { animation_loops = 0; } - /** Check if animation is stopped or not */ - bool check_animation(); - - float get_fps() const - { return action->fps; } - /** Get current action total frames */ - int get_frames() const - { return action->surfaces.size(); } - /** Get sprite's name */ - const std::string& get_name() const - { return data.name; } - /** Get current action name */ - const std::string& get_action_name() const - { return action->name; } - - int get_width() const; - int get_height() const; - - /** Get current frame */ - int get_frame() const - { return (int)frame; } - /** Set current frame */ - void set_frame(int frame_) - { if(frame_ > get_frames()) frame = 0; else frame = frame_; } - Surface* get_frame(unsigned int frame) - { - assert(frame < action->surfaces.size()); - return action->surfaces[frame]; - } + Sprite(SpriteData& data); + Sprite(const Sprite& other); + ~Sprite(); + + /** Draw sprite, automatically calculates next frame */ + void draw(DrawingContext& context, const Vector& pos, int layer); + + void draw_part(DrawingContext& context, const Vector& source, + const Vector& size, const Vector& pos, int layer); + + /** Set action (or state) */ + void set_action(const std::string& act, int loops = -1); + + /** Set number of animation cycles until animation stops */ + void set_animation_loops(int loops = -1) + { animation_loops = loops; } + + /** Set framerate */ + void set_fps(float new_fps); + + /* Stop animation */ + void stop_animation() + { animation_loops = 0; } + /** Check if animation is stopped or not */ + bool animation_done(); + + float get_fps() const + { return action->fps; } + /** Get current action total frames */ + int get_frames() const + { return action->surfaces.size(); } + /** Get sprite's name */ + const std::string& get_name() const + { return data.name; } + /** Get current action name */ + const std::string& get_action() const + { return action->name; } + + int get_width() const; + int get_height() const; + + /** return x-offset of current action's hitbox, relative to start of image */ + float get_current_hitbox_x_offset() const; + /** return y-offset of current action's hitbox, relative to start of image */ + float get_current_hitbox_y_offset() const; + /** return width of current action's hitbox */ + float get_current_hitbox_width() const; + /** return height of current action's hitbox */ + float get_current_hitbox_height() const; + /** return current action's hitbox, relative to 0,0 */ + Rect get_current_hitbox() const; + + /** Set the angle of the sprite rotation in degree */ + void set_angle(float angle); + + /** Get the angle of the sprite rotation in degree */ + float get_angle() const; + + void set_color(const Color& color); + + Color get_color() const; + + void set_blend(const Blend& blend); + + Blend get_blend() const; + + /** Get current frame */ + int get_frame() const + { return (int)frame; } + /** Set current frame */ + void set_frame(int frame) + { + this->frame = (float) (frame % get_frames()); + } + Surface* get_frame(unsigned int frame) + { + assert(frame < action->surfaces.size()); + return action->surfaces[frame]; + } private: - void update(); + void update(); - SpriteData& data; + SpriteData& data; - float frame; - int animation_loops; - Uint32 last_ticks; + float frame; + int animation_loops; + float last_ticks; + float angle; + Color color; + Blend blend; - SpriteData::Action* action; + SpriteData::Action* action; }; #endif -