Finite sprite animations now stop at last frame, not first.
authorChristoph Sommer <mail@christoph-sommer.de>
Fri, 3 Mar 2006 22:23:29 +0000 (22:23 +0000)
committerChristoph Sommer <mail@christoph-sommer.de>
Fri, 3 Mar 2006 22:23:29 +0000 (22:23 +0000)
Sprite::set_frame(int) crops frame numbers that are out of range.
Sprite::check_animation() renamed to Sprite::animation_done().

SVN-Revision: 3069

src/sprite/sprite.cpp
src/sprite/sprite.hpp
src/trigger/door.cpp
src/trigger/hatch.cpp

index 78972c9..9fe4765 100644 (file)
@@ -67,7 +67,7 @@ Sprite::set_action(const std::string& name, int loops)
 }
 
 bool
-Sprite::check_animation()
+Sprite::animation_done()
 {
   return animation_loops == 0;
 }
@@ -75,7 +75,7 @@ Sprite::check_animation()
 void
 Sprite::update()
 {
-  if(animation_loops == 0)
+  if(animation_done())
     return;
 
   Uint32 ticks = SDL_GetTicks();
@@ -85,11 +85,11 @@ Sprite::update()
   frame += frame_inc;
 
   if(frame >= get_frames()) {
-    frame = fmodf(frame+get_frames(), get_frames());
-    
+    frame = fmodf(frame, get_frames());
+      
     animation_loops--;
-    if(animation_loops == 0)
-      frame = 0;
+    if(animation_done())
+      frame = get_frames()-1;
   }
 }
 
index cf5e603..0bcc4e7 100644 (file)
@@ -53,7 +53,7 @@ public:
   void stop_animation()
   { animation_loops = 0; }
   /** Check if animation is stopped or not */
-  bool check_animation();
+  bool animation_done();
 
   float get_fps() const
   { return action->fps; }
@@ -74,8 +74,10 @@ public:
   int get_frame() const
   { return (int)frame; }
   /** Set current frame */
-  void set_frame(int frame_)
-  { if(frame_ > get_frames()) frame = 0; else frame = frame_; }
+  void set_frame(int frame)
+  { 
+    this->frame = (frame % get_frames()); 
+  }
   Surface* get_frame(unsigned int frame)
   {
     assert(frame < action->surfaces.size());
index cdb05ff..a7eaf55 100644 (file)
@@ -75,7 +75,7 @@ void
 Door::update(float )
 {
   //Check if door animation is complete
-  if(sprite->check_animation()) {
+  if(sprite->animation_done()) {
     sprite->set_action("normal");
     GameSession::current()->respawn(target_sector, target_spawnpoint);
   }
index 26286e2..f2e11a3 100644 (file)
@@ -75,7 +75,7 @@ void
 Hatch::update(float )
 {
   //Check if hatch animation is complete
-  if(sprite->check_animation()) {
+  if(sprite->animation_done()) {
     sprite->set_action("normal");
     GameSession::current()->respawn(target_sector, target_spawnpoint);
   }