Calculate foremost layer correctly (previous implementation didn't work at all)
[supertux.git] / src / sprite / sprite.hpp
index b2ec201..2c36b0d 100644 (file)
@@ -18,6 +18,7 @@
 #define HEADER_SUPERTUX_SPRITE_SPRITE_HPP
 
 #include "sprite/sprite_data.hpp"
+#include "sprite/sprite_ptr.hpp"
 #include "video/drawing_context.hpp"
 
 class Surface;
@@ -28,11 +29,13 @@ class Sprite
 {
 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);
@@ -47,9 +50,6 @@ public:
   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; }
@@ -59,7 +59,7 @@ public:
   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
@@ -97,34 +97,44 @@ public:
   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();
   }
-  Surface* get_frame(unsigned int frame_)
+  SurfacePtr get_frame(unsigned int frame_)
   {
     assert(frame_ < action->surfaces.size());
     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&);
 };