#include "timer.hpp"
Sprite::Sprite(SpriteData& newdata)
- : data(newdata), frame(0), animation_loops(-1), angle(0.0f)
+ : data(newdata),
+ frame(0),
+ animation_loops(-1),
+ angle(0.0f),
+ color(1.0f, 1.0f, 1.0f, 1.0f)
{
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),
+ color(1.0f, 1.0f, 1.0f, 1.0f),
action(other.action)
{
- last_ticks = real_time;
+ last_ticks = game_time;
}
Sprite::~Sprite()
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()
{
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;
context.draw_surface(action->surfaces[(int)frame],
pos - Vector(action->x_offset, action->y_offset),
angle,
+ color,
+ blend,
layer + action->z_order);
}
update();
int frameidx = (int) frame;
-
+
if(frameidx >= get_frames() || frameidx < 0) {
#ifndef DEBUG
// in optimized mode we get some small rounding errors in floating point
#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);
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 */