#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
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_)
{
- this->frame = (float) (frame_ % get_frames());
+ this->frame = 0;
+ this->frameidx = frame_ % get_frames();
}
SurfacePtr get_frame(unsigned int frame_)
{
return action->surfaces[frame_];
}
+ bool has_action (const std::string& name)
+ {
+ return (data.get_action(name) != NULL);
+ }
+
private:
void update();
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&);
};