Browse Source

Support setFlippedX/Y in Sprite

Andrey Fidrya 10 years ago
parent
commit
e36490f6b5
4 changed files with 71 additions and 3 deletions
  1. 12 0
      oxygine/src/AnimationFrame.cpp
  2. 3 1
      oxygine/src/AnimationFrame.h
  3. 47 1
      oxygine/src/Sprite.cpp
  4. 9 1
      oxygine/src/Sprite.h

+ 12 - 0
oxygine/src/AnimationFrame.cpp

@@ -67,4 +67,16 @@ namespace oxygine
 
         return f;
     }
+    
+    void AnimationFrame::flipX()
+    {
+        _srcRect.setX(_srcRect.getRight());
+        _srcRect.setWidth(-_srcRect.getWidth());
+    }
+    
+    void AnimationFrame::flipY()
+    {
+        _srcRect.setY(_srcRect.getBottom());
+        _srcRect.setHeight(-_srcRect.getHeight());
+    }
 }

+ 3 - 1
oxygine/src/AnimationFrame.h

@@ -61,7 +61,9 @@ namespace oxygine
         void            setDiffuse(const Diffuse& d) { _diffuse = d; }
         void            setSize(const Vector2& size) {_frameSize = size;}
         void            setHitTestData(const HitTestData& ad) { _hittest = ad; }
-
+        
+        void            flipX();
+        void            flipY();
 
     private:
         enum flags

+ 47 - 1
oxygine/src/Sprite.cpp

@@ -108,6 +108,47 @@ namespace oxygine
         }
         return false;
     }
+    
+    void Sprite::setFlippedX(bool flippedX)
+    {
+        if (flippedX != isFlippedX())
+        {
+            _frame.flipX();
+            _flags ^= flag_flipX;
+            animFrameChanged(_frame);
+        }
+    }
+    
+    void Sprite::setFlippedY(bool flippedY)
+    {
+        if (flippedY != isFlippedY())
+        {
+            _frame.flipY();
+            _flags ^= flag_flipY;
+            animFrameChanged(_frame);
+        }
+    }
+
+    void Sprite::setFlipped(bool flippedX, bool flippedY)
+    {
+        bool fx = flippedX != isFlippedX();
+        bool fy = flippedY != isFlippedY();
+
+        if (fx)
+        {
+            _frame.flipX();
+            _flags ^= flag_flipX;
+        }
+        
+        if (fy)
+        {
+            _frame.flipY();
+            _flags ^= flag_flipY;
+        }
+        
+        if (fx || fy)
+            animFrameChanged(_frame);
+    }
 
     void Sprite::setColumn(int column, int row)
     {
@@ -157,7 +198,12 @@ namespace oxygine
                 rs->getAtlas()->load();
         }
 
-        _frame = frame;
+        bool flipX = (_flags & flag_flipX) != 0;
+        bool flipY = (_flags & flag_flipY) != 0;
+        if (flipX || flipY)
+            _frame = frame.getFlipped(flipY, flipX);
+        else
+            _frame = frame;
         setSize(_frame.getSize());
 
         animFrameChanged(_frame);

+ 9 - 1
oxygine/src/Sprite.h

@@ -41,6 +41,12 @@ namespace oxygine
         void                    setColumn(int column, int row = -1);
 
         bool                    isOn(const Vector2& localPosition);
+        
+        bool                    isFlippedX() const {return _flags & flag_flipX;}
+        bool                    isFlippedY() const {return _flags & flag_flipY;}
+        void                    setFlippedX(bool flippedX);
+        void                    setFlippedY(bool flippedY);
+        void                    setFlipped(bool flippedX, bool flippedY);
 
         void serialize(serializedata* data);
         void deserialize(const deserializedata* data);
@@ -52,7 +58,9 @@ namespace oxygine
     protected:
         enum
         {
-            flag_manageResAnim = flag_last << 1
+            flag_manageResAnim = flag_last << 1,
+            flag_flipX = flag_last << 2,
+            flag_flipY = flag_last << 3
         };
         virtual void changeAnimFrame(const AnimationFrame& f);
         virtual void animFrameChanged(const AnimationFrame& f);