From 5a46f8c6b4ed113c9232cec8923e739f52731417 Mon Sep 17 00:00:00 2001 From: NathanSweet Date: Fri, 19 Apr 2013 09:14:01 +0200 Subject: [PATCH] isComplete for AnimationState. --- spine-c/include/spine/AnimationState.h | 2 ++ spine-c/src/spine/AnimationState.c | 4 ++++ spine-cocos2d-iphone/src/spine/spine-cocos2d-iphone.h | 1 + spine-cocos2d-iphone/src/spine/spine-cocos2d-iphone.m | 3 +++ spine-cocos2dx/example/Classes/ExampleLayer.cpp | 2 +- spine-cocos2dx/src/spine/spine-cocos2dx.cpp | 5 +++-- spine-cocos2dx/src/spine/spine-cocos2dx.h | 1 + spine-csharp/src/AnimationState.cs | 5 +++++ .../src/com/esotericsoftware/spine/AnimationState.java | 5 +++++ .../test/com/esotericsoftware/spine/SkeletonTest.java | 1 + spine-sfml/example/main.cpp | 2 +- 11 files changed, 27 insertions(+), 4 deletions(-) diff --git a/spine-c/include/spine/AnimationState.h b/spine-c/include/spine/AnimationState.h index 1992780ff..f904099cb 100644 --- a/spine-c/include/spine/AnimationState.h +++ b/spine-c/include/spine/AnimationState.h @@ -54,6 +54,8 @@ void AnimationState_setAnimationByName (AnimationState* self, const char* animat void AnimationState_setAnimation (AnimationState* self, Animation* animation, int/**/loop); void AnimationState_clearAnimation (AnimationState* self); +int/*bool*/AnimationState_isComplete (AnimationState* self); + #ifdef __cplusplus } } diff --git a/spine-c/src/spine/AnimationState.c b/spine-c/src/spine/AnimationState.c index f2a77bf7b..0ed90eda6 100644 --- a/spine-c/src/spine/AnimationState.c +++ b/spine-c/src/spine/AnimationState.c @@ -97,6 +97,10 @@ void AnimationState_clearAnimation (AnimationState* self) { CONST_CAST(Animation*, self->animation) = 0; } +int/*bool*/AnimationState_isComplete (AnimationState* self) { + return !self->animation || self->time >= self->animation->duration; +} + #ifdef __cplusplus } #endif diff --git a/spine-cocos2d-iphone/src/spine/spine-cocos2d-iphone.h b/spine-cocos2d-iphone/src/spine/spine-cocos2d-iphone.h index 65e7bc60d..e778d6470 100644 --- a/spine-cocos2d-iphone/src/spine/spine-cocos2d-iphone.h +++ b/spine-cocos2d-iphone/src/spine/spine-cocos2d-iphone.h @@ -60,6 +60,7 @@ - (void) setMix:(NSString*)fromName to:(NSString*)toName duration:(float)duration; - (void) setAnimation:(NSString*)animationName loop:(bool)loop; - (void) clearAnimation; +- (void) isComplete; - (void) updateWorldTransform; diff --git a/spine-cocos2d-iphone/src/spine/spine-cocos2d-iphone.m b/spine-cocos2d-iphone/src/spine/spine-cocos2d-iphone.m index 5b158c86f..6c628abc1 100644 --- a/spine-cocos2d-iphone/src/spine/spine-cocos2d-iphone.m +++ b/spine-cocos2d-iphone/src/spine/spine-cocos2d-iphone.m @@ -333,6 +333,9 @@ void RegionAttachment_updateQuad (RegionAttachment* self, Slot* slot, ccV3F_C4B_ - (void) clearAnimation { AnimationState_clearAnimation(state); } +- (void) isComplete { + return AnimationState_isComplete(state); +} - (void) updateWorldTransform { Skeleton_updateWorldTransform(skeleton); diff --git a/spine-cocos2dx/example/Classes/ExampleLayer.cpp b/spine-cocos2dx/example/Classes/ExampleLayer.cpp index 12d3792b9..22c0bdf73 100644 --- a/spine-cocos2dx/example/Classes/ExampleLayer.cpp +++ b/spine-cocos2dx/example/Classes/ExampleLayer.cpp @@ -63,7 +63,7 @@ bool ExampleLayer::init () { } void ExampleLayer::update (float deltaTime) { - if (strcmp(skeletonNode->state->animation->name, "walk") == 0) { + if (skeletonNode->state->loop) { if (skeletonNode->state->time > 2) skeletonNode->setAnimation("jump", false); } else { if (skeletonNode->state->time > 1) skeletonNode->setAnimation("walk", true); diff --git a/spine-cocos2dx/src/spine/spine-cocos2dx.cpp b/spine-cocos2dx/src/spine/spine-cocos2dx.cpp index 5944436c7..59d7780f2 100644 --- a/spine-cocos2dx/src/spine/spine-cocos2dx.cpp +++ b/spine-cocos2dx/src/spine/spine-cocos2dx.cpp @@ -294,14 +294,15 @@ CCRect CCSkeleton::boundingBox () { void CCSkeleton::setMix (const char* fromName, const char* toName, float duration) { AnimationStateData_setMixByName(state->data, fromName, toName, duration); } - void CCSkeleton::setAnimation (const char* animationName, bool loop) { AnimationState_setAnimationByName(state, animationName, loop); } - void CCSkeleton::clearAnimation () { AnimationState_clearAnimation(state); } +bool CCSkeleton::isComplete () const { + return AnimationState_isComplete(state) != 0; +} void CCSkeleton::updateWorldTransform () { Skeleton_updateWorldTransform(skeleton); diff --git a/spine-cocos2dx/src/spine/spine-cocos2dx.h b/spine-cocos2dx/src/spine/spine-cocos2dx.h index 766fb2e00..3eafd0d83 100644 --- a/spine-cocos2dx/src/spine/spine-cocos2dx.h +++ b/spine-cocos2dx/src/spine/spine-cocos2dx.h @@ -54,6 +54,7 @@ public: void setMix (const char* fromName, const char* toName, float duration); void setAnimation (const char* animationName, bool loop); void clearAnimation (); + bool isComplete () const; void updateWorldTransform (); diff --git a/spine-csharp/src/AnimationState.cs b/spine-csharp/src/AnimationState.cs index 75460fa64..8b6ef6b8e 100644 --- a/spine-csharp/src/AnimationState.cs +++ b/spine-csharp/src/AnimationState.cs @@ -89,6 +89,11 @@ namespace Spine { Animation = null; } + /** Returns true if no animation is set or if the current time is greater than the animation duration, regardless of looping. */ + public bool isComplete () { + return Animation == null || Time >= Animation.Duration; + } + override public String ToString () { return (Animation != null && Animation.Name != null) ? Animation.Name : base.ToString(); } diff --git a/spine-libgdx/src/com/esotericsoftware/spine/AnimationState.java b/spine-libgdx/src/com/esotericsoftware/spine/AnimationState.java index 3947b61d4..30db44760 100644 --- a/spine-libgdx/src/com/esotericsoftware/spine/AnimationState.java +++ b/spine-libgdx/src/com/esotericsoftware/spine/AnimationState.java @@ -104,6 +104,11 @@ public class AnimationState { currentTime = time; } + /** Returns true if no animation is set or if the current time is greater than the animation duration, regardless of looping. */ + public boolean isComplete () { + return current == null || currentTime >= current.getDuration(); + } + public AnimationStateData getData () { return data; } diff --git a/spine-libgdx/test/com/esotericsoftware/spine/SkeletonTest.java b/spine-libgdx/test/com/esotericsoftware/spine/SkeletonTest.java index d8b45f786..8561b5222 100644 --- a/spine-libgdx/test/com/esotericsoftware/spine/SkeletonTest.java +++ b/spine-libgdx/test/com/esotericsoftware/spine/SkeletonTest.java @@ -89,6 +89,7 @@ public class SkeletonTest extends ApplicationAdapter { skeleton = new Skeleton(skeletonData); if (name.equals("goblins")) skeleton.setSkin("goblin"); skeleton.setToBindPose(); + skeleton = new Skeleton(skeleton); Bone root = skeleton.getRootBone(); root.x = 50; diff --git a/spine-sfml/example/main.cpp b/spine-sfml/example/main.cpp index 819576397..7e4305a5b 100644 --- a/spine-sfml/example/main.cpp +++ b/spine-sfml/example/main.cpp @@ -69,7 +69,7 @@ void spineboy () { float delta = deltaClock.getElapsedTime().asSeconds(); deltaClock.restart(); - if (strcmp(drawable->state->animation->name, "walk") == 0) { + if (drawable->state->loop) { if (drawable->state->time > 2) AnimationState_setAnimationByName(drawable->state, "jump", false); } else { if (drawable->state->time > 1) AnimationState_setAnimationByName(drawable->state, "walk", true);