qmax patch to fix bug #0000389 - colors in infoblocks
[supertux.git] / src / sprite / sprite.cpp
index 0c011ef..20c11fb 100644 (file)
 
 Sprite::Sprite(SpriteData& newdata)
   : data(newdata),
-    frame(0), 
-    animation_loops(-1), 
-    angle(0.0f), 
+    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)
@@ -51,7 +51,7 @@ Sprite::Sprite(const Sprite& other)
     color(1.0f, 1.0f, 1.0f, 1.0f),
     action(other.action)
 {
-  last_ticks = real_time;
+  last_ticks = game_time;
 }
 
 Sprite::~Sprite()
@@ -75,6 +75,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()
 {
@@ -87,14 +109,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;
@@ -126,7 +148,7 @@ Sprite::draw_part(DrawingContext& context, const Vector& source,
   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
@@ -135,7 +157,7 @@ Sprite::draw_part(DrawingContext& context, const Vector& source,
 #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);