Added what I called of actions to Sprite.
[supertux.git] / lib / special / sprite.h
index 3e03ee2..e8b7937 100644 (file)
 
 #include <string>
 #include <vector>
-
-#include "utils/lispreader.h"
-#include "video/surface.h"
-#include "math/vector.h"
-
-class Sprite
-{
- private:
-  std::string name;
-
-  int x_hotspot;
-  int y_hotspot;
-
-  /** Frames per second */
-  float fps;
-
-  /** Number of seconds that a frame is displayed until it is switched
-      to the next frame */
-  float frame_delay;
-
-  float time;
-
-  std::vector<Surface*> surfaces;
-
-  void init_defaults();
- public:
-  /** cur has to be a pointer to data in the form of ((x-hotspot 5)
-      (y-hotspot 10) ...) */
-  Sprite(lisp_object_t* cur);
-  ~Sprite();
-  
-  void reset();
-
-  /** Update the sprite and process to the next frame */
-  void update(float delta);
-  void draw(DrawingContext& context, const Vector& pos, int layer,
-      Uint32 drawing_effect = NONE_EFFECT);
-  int get_current_frame() const;
-
-  float get_fps() { return fps; } ;
-  int get_frames() { return surfaces.size(); } ;
-
-  std::string get_name() const { return name; } 
-  int get_width() const;
-  int get_height() const;
-
-  Surface* get_frame(unsigned int frame)
-    {  if(frame < surfaces.size()) return surfaces[frame];
-       else return surfaces[0];  }
-};
+#include <map>
+
+#include "../utils/lispreader.h"
+#include "../video/surface.h"
+#include "../math/vector.h"
+
+namespace SuperTux
+  {
+
+  class Sprite
+    {
+    private:
+
+      struct Action
+        {
+        std::string name;
+
+        int x_hotspot;
+        int y_hotspot;
+
+        /** Frames per second */
+        float fps;
+
+        /** Number of seconds that a frame is displayed until it is switched
+            to the next frame */
+        float frame_delay;
+
+        std::vector<Surface*> surfaces;
+        };
+
+    public:
+      /** cur has to be a pointer to data in the form of ((x-hotspot 5)
+          (y-hotspot 10) ...) */
+      Sprite(lisp_object_t* cur);
+      ~Sprite();
+
+      void reset();
+
+      /** Update the sprite and process to the next frame */
+      void update(float delta);
+      void draw(DrawingContext& context, const Vector& pos, int layer,
+                Uint32 drawing_effect = NONE_EFFECT);
+      int get_current_frame() const;
+
+      /** Set action (or state) */
+      void set_action(std::string& act);
+
+      float get_fps()
+      {
+        return action->fps;
+      } ;
+      int get_frames()
+      {
+        return action->surfaces.size();
+      } ;
+
+      std::string get_name() const
+        {
+          return name;
+        }
+      int get_width() const;
+      int get_height() const;
+
+      Surface* get_frame(unsigned int frame)
+      {
+        if(frame < action->surfaces.size())
+          return action->surfaces[frame];
+        else
+          return action->surfaces[0];
+      }    
+    private:
+      void init_defaults(Action* act);
+      void parse_action(LispReader& lispreader);
+
+      std::string name;
+
+      float time;
+
+      typedef std::map <std::string, Action*> Actions;
+      Actions actions;
+
+      Action* action;
+    };
+
+} //namespace SuperTux
 
 #endif /*SUPERTUX_SPRITE_H*/