#define HEADER_SUPERTUX_SPRITE_SPRITE_HPP
#include "sprite/sprite_data.hpp"
+#include "sprite/sprite_ptr.hpp"
#include "video/drawing_context.hpp"
class Surface;
{
public:
Sprite(SpriteData& data);
- Sprite(const Sprite& other);
~Sprite();
+ SpritePtr clone() const;
+
/** Draw sprite, automatically calculates next frame */
- void draw(DrawingContext& context, const Vector& pos, int layer);
+ void draw(DrawingContext& context, const Vector& pos, int layer,
+ DrawingEffect effect = NO_EFFECT);
void draw_part(DrawingContext& context, const Vector& source,
const Vector& size, const Vector& pos, int layer);
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; }
float get_fps() const
{ return action->fps; }
/** Get current action total frames */
- int get_frames() const
+ unsigned int get_frames() const
{ return action->surfaces.size(); }
/** Get sprite's name */
const std::string& get_name() 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;
+ Rectf get_current_hitbox() const;
/** Set the angle of the sprite rotation in degree */
void set_angle(float angle);
Blend get_blend() const;
/** Get current frame */
- int get_frame() const
- { return (int)frame; }
+ unsigned int get_frame() const
+ { return frameidx; }
/** Set current frame */
- void set_frame(int frame)
+ void set_frame(int frame_)
{
- this->frame = (float) (frame % get_frames());
+ this->frame = 0;
+ this->frameidx = frame_ % get_frames();
}
- Surface* get_frame(unsigned int frame)
+ SurfacePtr get_frame(unsigned int frame_)
{
- assert(frame < action->surfaces.size());
- return action->surfaces[frame];
+ assert(frame_ < action->surfaces.size());
+ return action->surfaces[frame_];
+ }
+
+ bool has_action (const std::string& name)
+ {
+ return (data.get_action(name) != NULL);
}
private:
SpriteData& data;
+ // between 0 and 1
float frame;
+ // between 0 and get_frames()
+ unsigned int frameidx;
int animation_loops;
float last_ticks;
float angle;
Color color;
Blend blend;
- SpriteData::Action* action;
+ const SpriteData::Action* action;
private:
+ Sprite(const Sprite& other);
Sprite& operator=(const Sprite&);
};