Browse Source

Add flip and color to AnimatedSprite2D

Aster@中国上海 11 years ago
parent
commit
171609dad9

+ 10 - 0
Source/Engine/LuaScript/pkgs/Urho2D/AnimatedSprite2D.pkg

@@ -5,6 +5,10 @@ class AnimatedSprite2D : Drawable
     void SetLayer(int layer);
     void SetOrderInLayer(int orderInLayer);
     void SetBlendMode(BlendMode mode);
+    void SetFlip(bool flipX, bool flipY);
+    void SetFlipX(bool flipX);
+    void SetFlipY(bool flipY);
+    void SetColor(const Color& color);
     void SetSpeed(float speed);
     void SetAnimation(const String name);
     void SetAnimation(AnimationSet2D* animationSet, const String name);
@@ -13,6 +17,9 @@ class AnimatedSprite2D : Drawable
     int GetLayer() const;
     int GetOrderInLayer() const;
     BlendMode GetBlendMode() const;
+    bool GetFlipX() const;
+    bool GetFlipY() const;
+    const Color& GetColor() const;
     float GetSpeed() const;
     AnimationSet2D* GetAnimationSet() const;
     const String GetAnimation() const;
@@ -20,6 +27,9 @@ class AnimatedSprite2D : Drawable
     tolua_property__get_set int layer;
     tolua_property__get_set int orderInLayer;
     tolua_property__get_set BlendMode blendMode;
+    tolua_property__get_set bool flipX;
+    tolua_property__get_set bool flipY;
+    tolua_property__get_set Color& color;
     tolua_property__get_set float speed;
     tolua_property__get_set AnimationSet2D* animationSet;
     tolua_property__get_set String animation;

+ 7 - 0
Source/Engine/Script/Urho2DAPI.cpp

@@ -148,6 +148,13 @@ static void RegisterAnimatedSprite2D(asIScriptEngine* engine)
     engine->RegisterObjectMethod("AnimatedSprite2D", "int get_orderInLayer() const", asMETHOD(AnimatedSprite2D, GetOrderInLayer), asCALL_THISCALL);
     engine->RegisterObjectMethod("AnimatedSprite2D", "void set_blendMode(BlendMode)", asMETHOD(AnimatedSprite2D, SetBlendMode), asCALL_THISCALL);
     engine->RegisterObjectMethod("AnimatedSprite2D", "BlendMode get_blendMode() const", asMETHOD(AnimatedSprite2D, GetBlendMode), asCALL_THISCALL);
+    engine->RegisterObjectMethod("AnimatedSprite2D", "void SetFlip(bool, bool)", asMETHOD(AnimatedSprite2D, SetFlip), asCALL_THISCALL);
+    engine->RegisterObjectMethod("AnimatedSprite2D", "void set_flipX(bool)", asMETHOD(AnimatedSprite2D, SetFlipX), asCALL_THISCALL);
+    engine->RegisterObjectMethod("AnimatedSprite2D", "bool get_flipX() const", asMETHOD(AnimatedSprite2D, GetFlipX), asCALL_THISCALL);
+    engine->RegisterObjectMethod("AnimatedSprite2D", "void set_flipY(bool)", asMETHOD(AnimatedSprite2D, SetFlipY), asCALL_THISCALL);
+    engine->RegisterObjectMethod("AnimatedSprite2D", "bool get_flipY() const", asMETHOD(AnimatedSprite2D, GetFlipY), asCALL_THISCALL);
+    engine->RegisterObjectMethod("AnimatedSprite2D", "void set_color(const Color&in)", asMETHOD(AnimatedSprite2D, SetColor), asCALL_THISCALL);
+    engine->RegisterObjectMethod("AnimatedSprite2D", "const Color& get_color() const", asMETHOD(AnimatedSprite2D, GetColor), asCALL_THISCALL);
     engine->RegisterObjectMethod("AnimatedSprite2D", "void set_speed(float)", asMETHOD(AnimatedSprite2D, SetSpeed), asCALL_THISCALL);
     engine->RegisterObjectMethod("AnimatedSprite2D", "float get_speed() const", asMETHOD(AnimatedSprite2D, GetSpeed), asCALL_THISCALL);
     engine->RegisterObjectMethod("AnimatedSprite2D", "void SetAnimation(AnimationSet2D@+, const String&)", asMETHODPR(AnimatedSprite2D, SetAnimation, (AnimationSet2D*, const String&), void), asCALL_THISCALL);

+ 57 - 4
Source/Engine/Urho2D/AnimatedSprite2D.cpp

@@ -44,6 +44,9 @@ AnimatedSprite2D::AnimatedSprite2D(Context* context) :
     layer_(0),
     orderInLayer_(0),
     blendMode_(BLEND_ALPHA),
+    flipX_(false),
+    flipY_(false),
+    color_(Color::WHITE),
     speed_(1.0f),
     currentTime_(0.0f)
 {
@@ -59,6 +62,9 @@ void AnimatedSprite2D::RegisterObject(Context* context)
     ACCESSOR_ATTRIBUTE(AnimatedSprite2D, VAR_INT, "Layer", GetLayer, SetLayer, int, 0, AM_DEFAULT);
     ACCESSOR_ATTRIBUTE(AnimatedSprite2D, VAR_INT, "Order in Layer", GetOrderInLayer, SetOrderInLayer, int, 0, AM_DEFAULT);
     ENUM_ACCESSOR_ATTRIBUTE(AnimatedSprite2D, "Blend Mode", GetBlendMode, SetBlendMode, BlendMode, blendModeNames, BLEND_ALPHA, AM_DEFAULT);
+    ACCESSOR_ATTRIBUTE(AnimatedSprite2D, VAR_BOOL, "Flip X", GetFlipX, SetFlipX, bool, false, AM_DEFAULT);
+    ACCESSOR_ATTRIBUTE(AnimatedSprite2D, VAR_BOOL, "Flip Y", GetFlipY, SetFlipY, bool, false, AM_DEFAULT);
+    REF_ACCESSOR_ATTRIBUTE(AnimatedSprite2D, VAR_COLOR, "Color", GetColor, SetColor, Color, Color::WHITE, AM_DEFAULT);
     ACCESSOR_ATTRIBUTE(AnimatedSprite2D, VAR_FLOAT, "Speed", GetSpeed, SetSpeed, float, 1.0f, AM_DEFAULT);
     ACCESSOR_ATTRIBUTE(AnimatedSprite2D, VAR_RESOURCEREF, "Animation Set", GetAnimationSetAttr, SetAnimationSetAttr, ResourceRef, ResourceRef(AnimatedSprite2D::GetTypeStatic()), AM_DEFAULT);
     REF_ACCESSOR_ATTRIBUTE(AnimatedSprite2D, VAR_STRING, "Animation", GetAnimation, SetAnimation, String, String::EMPTY, AM_DEFAULT);
@@ -118,6 +124,42 @@ void AnimatedSprite2D::SetBlendMode(BlendMode blendMode)
     }
 }
 
+void AnimatedSprite2D::SetFlip(bool flipX, bool flipY)
+{
+    if (flipX_ == flipX && flipY_ == flipY)
+        return;
+
+    flipX_ = flipX;
+    flipY_ = flipY;
+
+    for (unsigned i = 0; i < timelineNodes_.Size(); ++i)
+    {
+        if (!timelineNodes_[i])
+            continue;
+
+        StaticSprite2D* staticSprite = timelineNodes_[i]->GetComponent<StaticSprite2D>();
+        staticSprite->SetFlip(flipX_, flipY_);
+    }
+
+    MarkNetworkUpdate();
+}
+
+void AnimatedSprite2D::SetFlipX(bool flipX)
+{
+    SetFlip(flipX, flipY_);
+}
+
+void AnimatedSprite2D::SetFlipY(bool flipY)
+{
+    SetFlip(flipX_, flipY);
+}
+
+void AnimatedSprite2D::SetColor(const Color& color)
+{
+    color_ = color;
+    MarkNetworkUpdate();
+}
+
 void AnimatedSprite2D::SetSpeed(float speed)
 {
     speed_ = speed;
@@ -243,6 +285,7 @@ void AnimatedSprite2D::SetAnimation(Animation2D* animation)
             StaticSprite2D* staticSprite = timelineNode->CreateComponent<StaticSprite2D>();
             staticSprite->SetLayer(layer_);
             staticSprite->SetBlendMode(blendMode_);
+            staticSprite->SetFlip(flipX_, flipY_);
             staticSprite->SetUseHotSpot(true);
 
             timelineNodes_[i] = timelineNode;
@@ -299,8 +342,8 @@ void AnimatedSprite2D::UpdateAnimation(float timeStep)
                     StaticSprite2D* staticSprite = timelineNode->GetComponent<StaticSprite2D>();
                     staticSprite->SetSprite(currKey.sprite_);
                     staticSprite->SetHotSpot(currKey.hotSpot_.Lerp(nextKey.hotSpot_, t));
-                    float alpha_ = Lerp(currKey.alpha_, nextKey.alpha_, t);
-                    staticSprite->SetColor(Color(1.0f, 1.0f, 1.0f, alpha_));
+                    float alpha = Lerp(currKey.alpha_, nextKey.alpha_, t);
+                    staticSprite->SetColor(Color(color_.r_, color_.g_, color_.b_, color_.a_ * alpha));
                 }
 
                 break;
@@ -349,9 +392,19 @@ void AnimatedSprite2D::UpdateAnimation(float timeStep)
 
             // Update node's transform
             const Transform2D& transform = timelineTransformInfos_[i].transform_;
+            Vector2 position = transform.position_;
+            if (flipX_)
+                position.x_ = -position.x_;
+            if (flipY_)
+                position.y_ = -position.y_;
+            timelineNode->SetPosition(position);
+
+            float angle = transform.angle_;
+            if (flipX_ != flipY_)
+                angle = -angle;
+            timelineNode->SetRotation(angle);
+
             timelineNode->SetScale(transform.scale_);
-            timelineNode->SetRotation(transform.angle_);
-            timelineNode->SetPosition(transform.position_);
 
             // Update sprite's z order
             StaticSprite2D* staticSprite = timelineNode->GetComponent<StaticSprite2D>();

+ 20 - 0
Source/Engine/Urho2D/AnimatedSprite2D.h

@@ -52,6 +52,14 @@ public:
     void SetOrderInLayer(int orderInLayer);
     /// Set blend mode.
     void SetBlendMode(BlendMode mode);
+    /// Set flip.
+    void SetFlip(bool flipX, bool flipY);
+    /// Set flip X.
+    void SetFlipX(bool flipX);
+    /// Set flip Y.
+    void SetFlipY(bool flipY);
+    /// Set color.
+    void SetColor(const Color& color);
     /// Set speed.
     void SetSpeed(float speed);
     /// Set animation by animation set and name.
@@ -67,6 +75,12 @@ public:
     int GetOrderInLayer() const { return orderInLayer_; }
     /// Return blend mode.
     BlendMode GetBlendMode() const { return blendMode_; }
+    /// Return flip X.
+    bool GetFlipX() const { return flipX_; }
+    /// Return flip Y.
+    bool GetFlipY() const { return flipY_; }
+    /// Return color.
+    const Color& GetColor() const { return color_; }
     /// Return speed.
     float GetSpeed() const { return speed_; }
     /// Return animation.
@@ -99,6 +113,12 @@ protected:
     int orderInLayer_;
     /// Blend mode.
     BlendMode blendMode_;
+    /// Flip X.
+    bool flipX_;
+    /// Flip Y.
+    bool flipY_;
+    /// Color.
+    Color color_;
     /// Speed.
     float speed_;
     /// Animation set.