public override void Reset() { base.Reset(); if (state_Boss == null) { return; } gameEnd = false; StopAllCoroutines(); state_Boss.SetEmptyAnimation(0, 0); var tarck = state_Boss.AddAnimation(0, enterTalking, false, 0); tarck.TimeScale = 0; bossElectricity.Power = 0; bossFireProjectile.Stop(); missileLauncher.Reset(); obj_WarningUI.SetActive(false); DOTween.Complete(spine_Boss.transform); spine_Boss.transform.position = bossStartPos; AudioController.StopCategory("Boss00"); AudioController.SetCategoryVolume("Boss00", 1f); AudioController.SetCategoryVolume("Sfx", 1f); Time.timeScale = 1f; }
protected override void LoadContent() { skeletonRenderer = new SkeletonRenderer(GraphicsDevice); String name = "spineboy"; // "goblins"; Atlas atlas = new Atlas("data/" + name + ".atlas", new XnaTextureLoader(GraphicsDevice)); SkeletonJson json = new SkeletonJson(atlas); skeleton = new Skeleton(json.ReadSkeletonData("data/" + name + ".json")); if (name == "goblins") { skeleton.SetSkin("goblingirl"); } skeleton.SetSlotsToBindPose(); // Without this the skin attachments won't be attached. See SetSkin. // Define mixing between animations. AnimationStateData stateData = new AnimationStateData(skeleton.Data); if (name == "spineboy") { stateData.SetMix("walk", "jump", 0.2f); stateData.SetMix("jump", "walk", 0.4f); } state = new AnimationState(stateData); state.SetAnimation("walk", false); state.AddAnimation("jump", false); state.AddAnimation("walk", true); skeleton.RootBone.X = 320; skeleton.RootBone.Y = 440; skeleton.UpdateWorldTransform(); }
public override void Reset() { if (state_Boss == null) { return; } gameEnd = false; //LogManager.Log("Go = Restart"); spine_Boss.gameObject.SetActive(true); spine_BossAttack.gameObject.SetActive(false); spine_BossDamage.gameObject.SetActive(false); spine_BossDie.gameObject.SetActive(false); state_Boss.SetEmptyAnimation(0, 0); var tarck = state_Boss.AddAnimation(0, enterTalk, false, 0); tarck.TimeScale = 0; obj_electricity.SetActive(false); bossFireProjectile.Stop(); missileLauncher.Reset(); DOTween.Complete(spine_Boss.transform); spine_Boss.transform.position = bossStartPos; }
public SpineboyScreen(Example game) : base(game) { atlas = new Atlas("data/spineboy.atlas", new XnaTextureLoader(game.GraphicsDevice)); SkeletonBinary binary = new SkeletonBinary(atlas); binary.Scale = 0.5f; SkeletonData skeletonData = binary.ReadSkeletonData("data/spineboy-pro.skel"); skeleton = new Skeleton(skeletonData); AnimationStateData stateData = new AnimationStateData(skeleton.Data); state = new AnimationState(stateData); skeleton.X = game.GraphicsDevice.Viewport.Width / 2; skeleton.Y = game.GraphicsDevice.Viewport.Height; // We want 0.2 seconds of mixing time when transitioning from // any animation to any other animation. stateData.DefaultMix = 0.2f; // Set the "walk" animation on track one and let it loop forever state.SetAnimation(0, "walk", true); // Queue another animation after 2 seconds to let Spineboy jump state.AddAnimation(0, "jump", false, 2); // After the jump is complete, let Spineboy walk state.AddAnimation(0, "run", true, 0); }
IEnumerator DoDemoRoutine() { while (true) { animationState.SetAnimation(0, walkAnimation, true); yield return(new WaitForSeconds(runDuration)); animationState.SetAnimation(0, runAnimation, true); yield return(new WaitForSeconds(runDuration)); animationState.SetAnimation(0, runToIdleAnimation, false); animationState.AddAnimation(0, idleAnimation, false, 0); yield return(new WaitForSeconds(1f)); skeletonAnimation.skeleton.flipX = true; animationState.SetAnimation(0, idleTurnAnimation, false); animationState.AddAnimation(0, idleAnimation, false, 0); yield return(new WaitForSeconds(0.5f)); animationState.SetAnimation(0, idleTurnAnimation, false); animationState.AddAnimation(0, idleAnimation, false, 0); skeletonAnimation.skeleton.flipX = false; yield return(new WaitForSeconds(0.5f)); } }
public void AddToTrack(int trackIndex, string animationName, bool loop, float delay) { if (!AnimationExists(animationName)) { return; } Spine.TrackEntry animationEntry = _animState.AddAnimation(trackIndex, animationName, loop, delay); }
protected override void LoadContent() { skeletonRenderer = new SkeletonMeshRenderer(GraphicsDevice); skeletonRenderer.PremultipliedAlpha = true; // String name = "spineboy"; String name = "goblins-ffd"; Atlas atlas = new Atlas(assetsFolder + name + ".atlas", new XnaTextureLoader(GraphicsDevice)); SkeletonJson json = new SkeletonJson(atlas); if (name == "spineboy") { json.Scale = 0.6f; } skeleton = new Skeleton(json.ReadSkeletonData(assetsFolder + name + ".json")); if (name == "goblins-ffd") { skeleton.SetSkin("goblin"); } // Define mixing between animations. AnimationStateData stateData = new AnimationStateData(skeleton.Data); state = new AnimationState(stateData); if (name == "spineboy") { stateData.SetMix("run", "jump", 0.2f); stateData.SetMix("jump", "run", 0.4f); // Event handling for all animations. state.Start += Start; state.End += End; state.Complete += Complete; state.Event += Event; state.SetAnimation(0, "test", false); TrackEntry entry = state.AddAnimation(0, "jump", false, 0); entry.End += End; // Event handling for queued animations. state.AddAnimation(0, "run", true, 0); } else { state.SetAnimation(0, "walk", true); } skeleton.X = 400; skeleton.Y = 590; skeleton.UpdateWorldTransform(); headSlot = skeleton.FindSlot("head"); }
protected override void LoadContent() { skeletonRenderer = new SkeletonRenderer(GraphicsDevice); skeletonRenderer.PremultipliedAlpha = true; String name = "spineboy"; // "goblins"; Atlas atlas = new Atlas("data/" + name + ".atlas", new XnaTextureLoader(GraphicsDevice)); SkeletonJson json = new SkeletonJson(atlas); skeleton = new Skeleton(json.ReadSkeletonData("data/" + name + ".json")); if (name == "goblins") { skeleton.SetSkin("goblingirl"); } skeleton.SetSlotsToSetupPose(); // Without this the skin attachments won't be attached. See SetSkin. // Define mixing between animations. AnimationStateData stateData = new AnimationStateData(skeleton.Data); if (name == "spineboy") { stateData.SetMix("walk", "jump", 0.2f); stateData.SetMix("jump", "walk", 0.4f); } state = new AnimationState(stateData); if (true) { // Event handling for all animations. state.Start += Start; state.End += End; state.Complete += Complete; state.Event += Event; state.SetAnimation(0, "drawOrder", true); } else { state.SetAnimation(0, "walk", false); TrackEntry entry = state.AddAnimation(0, "jump", false, 0); entry.End += End; // Event handling for queued animations. state.AddAnimation(0, "walk", true, 0); } skeleton.X = 320; skeleton.Y = 440; skeleton.UpdateWorldTransform(); headSlot = skeleton.FindSlot("head"); }
// add the animation to the queue public void Queue(string name, bool loop = true, float delay = 0.0f) { if (DoesContainAnimation(name)) { animation.AddAnimation(name, loop, delay); } }
override public void OnStateEnter(Animator animator, AnimatorStateInfo stateInfo, int layerIndex) { if (state == null) { Initialize(animator); } float timeScale = stateInfo.speed; TrackEntry current = state.GetCurrent(layerIndex); bool transitionPlayed = false; if (current != null && fromTransitions.Count > 0) { transitionPlayed = SetTransition(animator, current, timeScale, layerIndex); } if (!transitionPlayed && DefaultTransition) { var transitionEntry = state.SetAnimation(layerIndex, DefaultTransition, false); transitionEntry.TimeScale = timeScale; transitionPlayed = true; } if (transitionPlayed) { trackEntry = state.AddAnimation(layerIndex, GetAnimmationAsset(animator).Animation, bIsLoop, 0); } else { trackEntry = state.SetAnimation(layerIndex, GetAnimmationAsset(animator).Animation, bIsLoop); } trackEntry.TimeScale = timeScale; }
public void AddAnimation(string name, bool isLoop) { if (!string.IsNullOrEmpty(name)) { state.AddAnimation(0, name, isLoop, 0); Update(0); } }
void doAttack() { attackEndTime = Time.time + attackDuration; doingAttack = true; spineAnimationState.SetAnimation(0, attackName, false); spineAnimationState.AddAnimation(0, idleName, true, 0); //skeletonAnimation }
public virtual IEnumerator IEChangeModelAnim(string animName, bool IsLoop) { //var track = skeletonAnimation.state.SetAnimation(0, animName, IsLoop); //var empty = skeletonAnimation.state.AddEmptyAnimation(1, 0.5f, 0.1f); yield return(new WaitForSeconds(current_anim_time)); if (!IsLoop) { spineAnimationState.AddAnimation(0, anim_idle, true, 0); yield return(new WaitForSeconds(0.5f)); } }
public override void Fire() { animInProgress = true; AnimationStateData stateData = new AnimationStateData(rockAnim.skeletonDataAsset.GetSkeletonData(false)); Spine.AnimationState newState = new Spine.AnimationState(stateData); newState.SetAnimation(0, rockDescendAnim, false); newState.AddAnimation(0, rockFinishedAnim, true, 0); rockAnim.state = newState; rockAnim.timeScale = rockDescendSpeedMultiplier; rockAnim.state.Complete += OnAnimEnd; deltaYPerSecond = gateTransform.lossyScale.y / duration; audioSource.Play(); Invoke("AudioEnd", duration - 1); }
public void Queue(AudioSource audioSource, Spine.AnimationState state, int trackIndex, bool loop, float delay = -0.0f, AnimationEventSubscriptions subscriptions = null) { TryPlayStartSound(audioSource, state); var track = state.AddAnimation(trackIndex, Animation, loop, delay); StopSoundOnInterrupt(audioSource, track); if (subscriptions != null) { subscriptions.Subscribe(track); } if (Events.Length > 0) { track.Event += (s, i, ev) => TryPlaySound(ev, audioSource); } }
override public void OnStateEnter(Animator animator, AnimatorStateInfo stateInfo, int layerIndex) { if (state == null) { Initialize(animator); } float timeScale = stateInfo.speed; var current = state.GetCurrent(layerIndex); bool transitionPlayed = false; if (current != null && fromTransitions.Count > 0) { foreach (var t in fromTransitions) { if (t.from.Animation == current.Animation) { var transitionEntry = state.SetAnimation(layerIndex, t.transition.Animation, false); transitionEntry.TimeScale = timeScale; transitionPlayed = true; break; } } } TrackEntry trackEntry; if (transitionPlayed) { trackEntry = state.AddAnimation(layerIndex, animation.Animation, stateInfo.loop, 0); } else { trackEntry = state.SetAnimation(layerIndex, animation.Animation, stateInfo.loop); } trackEntry.TimeScale = timeScale; }
static int AddAnimation(IntPtr L) { try { int count = LuaDLL.lua_gettop(L); if (count == 5 && TypeChecker.CheckTypes(L, 1, typeof(Spine.AnimationState), typeof(int), typeof(Spine.Animation), typeof(bool), typeof(float))) { Spine.AnimationState obj = (Spine.AnimationState)ToLua.ToObject(L, 1); int arg0 = (int)LuaDLL.lua_tonumber(L, 2); Spine.Animation arg1 = (Spine.Animation)ToLua.ToObject(L, 3); bool arg2 = LuaDLL.lua_toboolean(L, 4); float arg3 = (float)LuaDLL.lua_tonumber(L, 5); Spine.TrackEntry o = obj.AddAnimation(arg0, arg1, arg2, arg3); ToLua.PushObject(L, o); return(1); } else if (count == 5 && TypeChecker.CheckTypes(L, 1, typeof(Spine.AnimationState), typeof(int), typeof(string), typeof(bool), typeof(float))) { Spine.AnimationState obj = (Spine.AnimationState)ToLua.ToObject(L, 1); int arg0 = (int)LuaDLL.lua_tonumber(L, 2); string arg1 = ToLua.ToString(L, 3); bool arg2 = LuaDLL.lua_toboolean(L, 4); float arg3 = (float)LuaDLL.lua_tonumber(L, 5); Spine.TrackEntry o = obj.AddAnimation(arg0, arg1, arg2, arg3); ToLua.PushObject(L, o); return(1); } else { return(LuaDLL.luaL_throw(L, "invalid arguments to method: Spine.AnimationState.AddAnimation")); } } catch (Exception e) { return(LuaDLL.toluaL_exception(L, e)); } }
protected override void LoadContent() { // Two color tint effect, comment line 80 to disable var spineEffect = Content.Load <Effect>("spine-xna-example-content\\SpineEffect"); spineEffect.Parameters["World"].SetValue(Matrix.Identity); spineEffect.Parameters["View"].SetValue(Matrix.CreateLookAt(new Vector3(0.0f, 0.0f, 1.0f), Vector3.Zero, Vector3.Up)); skeletonRenderer = new SkeletonRenderer(GraphicsDevice); skeletonRenderer.PremultipliedAlpha = false; skeletonRenderer.Effect = spineEffect; skeletonDebugRenderer = new SkeletonDebugRenderer(GraphicsDevice); skeletonDebugRenderer.DisableAll(); skeletonDebugRenderer.DrawClipping = true; // String name = "spineboy-ess"; // String name = "goblins-pro"; // String name = "raptor-pro"; // String name = "tank-pro"; String name = "coin-pro"; String atlasName = name.Replace("-pro", "").Replace("-ess", ""); if (name == "goblins-pro") { atlasName = "goblins-mesh"; } bool binaryData = false; Atlas atlas = new Atlas(assetsFolder + atlasName + ".atlas", new XnaTextureLoader(GraphicsDevice)); float scale = 1; if (name == "spineboy-ess") { scale = 0.6f; } if (name == "raptor-pro") { scale = 0.5f; } if (name == "tank-pro") { scale = 0.3f; } if (name == "coin-pro") { scale = 1; } SkeletonData skeletonData; if (binaryData) { SkeletonBinary binary = new SkeletonBinary(atlas); binary.Scale = scale; skeletonData = binary.ReadSkeletonData(assetsFolder + name + ".skel"); } else { SkeletonJson json = new SkeletonJson(atlas); json.Scale = scale; skeletonData = json.ReadSkeletonData(assetsFolder + name + ".json"); } skeleton = new Skeleton(skeletonData); if (name == "goblins-pro") { skeleton.SetSkin("goblin"); } // Define mixing between animations. AnimationStateData stateData = new AnimationStateData(skeleton.Data); state = new AnimationState(stateData); if (name == "spineboy-ess") { skeleton.SetAttachment("head-bb", "head"); stateData.SetMix("run", "jump", 0.2f); stateData.SetMix("jump", "run", 0.4f); // Event handling for all animations. state.Start += Start; state.End += End; state.Complete += Complete; state.Event += Event; state.SetAnimation(0, "run", true); TrackEntry entry = state.AddAnimation(0, "jump", false, 0); entry.End += End; // Event handling for queued animations. state.AddAnimation(0, "run", true, 0); } else if (name == "raptor-pro") { state.SetAnimation(0, "walk", true); state.AddAnimation(1, "gun-grab", false, 2); } else if (name == "coin-pro") { state.SetAnimation(0, "animation", true); } else if (name == "tank-pro") { skeleton.X += 300; state.SetAnimation(0, "drive", true); } else { state.SetAnimation(0, "walk", true); } skeleton.X += 400; skeleton.Y += GraphicsDevice.Viewport.Height; skeleton.UpdateWorldTransform(); headSlot = skeleton.FindSlot("head"); }
protected override void LoadContent() { // Two color tint effect, comment line 76 to disable var spineEffect = Content.Load <Effect>("Content\\SpineEffect"); spineEffect.Parameters["World"].SetValue(Matrix.Identity); spineEffect.Parameters["View"].SetValue(Matrix.CreateLookAt(new Vector3(0.0f, 0.0f, 1.0f), Vector3.Zero, Vector3.Up)); skeletonRenderer = new SkeletonRenderer(GraphicsDevice); skeletonRenderer.PremultipliedAlpha = true; skeletonRenderer.Effect = spineEffect; // String name = "spineboy"; // String name = "goblins-mesh"; // String name = "raptor"; // String name = "tank"; // String name = "coin"; String name = "TwoColorTest"; bool binaryData = true; Atlas atlas = new Atlas(assetsFolder + name + ".atlas", new XnaTextureLoader(GraphicsDevice)); float scale = 1; if (name == "spineboy") { scale = 0.6f; } if (name == "raptor") { scale = 0.5f; } if (name == "tank") { scale = 0.3f; } if (name == "TwoColorTest") { scale = 0.5f; } SkeletonData skeletonData; if (binaryData) { SkeletonBinary binary = new SkeletonBinary(atlas); binary.Scale = scale; skeletonData = binary.ReadSkeletonData(assetsFolder + name + ".skel"); } else { SkeletonJson json = new SkeletonJson(atlas); json.Scale = scale; skeletonData = json.ReadSkeletonData(assetsFolder + name + ".json"); } skeleton = new Skeleton(skeletonData); if (name == "goblins-mesh") { skeleton.SetSkin("goblin"); } // Define mixing between animations. AnimationStateData stateData = new AnimationStateData(skeleton.Data); state = new AnimationState(stateData); if (name == "spineboy") { stateData.SetMix("run", "jump", 0.2f); stateData.SetMix("jump", "run", 0.4f); // Event handling for all animations. state.Start += Start; state.End += End; state.Complete += Complete; state.Event += Event; state.SetAnimation(0, "test", false); TrackEntry entry = state.AddAnimation(0, "jump", false, 0); entry.End += End; // Event handling for queued animations. state.AddAnimation(0, "run", true, 0); } else if (name == "raptor") { state.SetAnimation(0, "walk", true); state.AddAnimation(1, "gungrab", false, 2); } else if (name == "coin") { state.SetAnimation(0, "rotate", true); } else if (name == "tank") { state.SetAnimation(0, "drive", true); } else if (name == "TwoColorTest") { state.SetAnimation(0, "animation", true); } else { state.SetAnimation(0, "walk", true); } skeleton.X = 400 + (name == "tank" ? 300: 0); skeleton.Y = 580 + (name == "TwoColorTest" ? -300 : 0); skeleton.UpdateWorldTransform(); headSlot = skeleton.FindSlot("head"); }
protected override void LoadContent() { skeletonRenderer = new SkeletonRenderer(GraphicsDevice); String name = "spineboy"; // "goblins"; Atlas atlas = new Atlas("data/" + name + ".atlas", new XnaTextureLoader(GraphicsDevice)); SkeletonJson json = new SkeletonJson(atlas); skeleton = new Skeleton(json.ReadSkeletonData("data/" + name + ".json")); if (name == "goblins") skeleton.SetSkin("goblingirl"); skeleton.SetSlotsToSetupPose(); // Without this the skin attachments won't be attached. See SetSkin. // Define mixing between animations. AnimationStateData stateData = new AnimationStateData(skeleton.Data); if (name == "spineboy") { stateData.SetMix("walk", "jump", 0.2f); stateData.SetMix("jump", "walk", 0.4f); } state = new AnimationState(stateData); if (true) { // Event handling for all animations. state.Start += new EventHandler(Start); state.End += new EventHandler(End); state.Complete += new EventHandler<CompleteArgs>(Complete); state.Event += new EventHandler<EventTriggeredArgs>(Event); state.SetAnimation("drawOrder", true); } else { state.SetAnimation("walk", false); QueueEntry entry = state.AddAnimation("jump", false); entry.End += new EventHandler(End); // Event handling for queued animations. state.AddAnimation("walk", true); } skeleton.X = 320; skeleton.Y = 440; skeleton.UpdateWorldTransform(); headSlot = skeleton.FindSlot("head"); }
protected override void LoadContent() { skeletonRenderer = new SkeletonRenderer(GraphicsDevice); String name = "spineboy"; // "goblins"; Atlas atlas = new Atlas("data/" + name + ".atlas", new XnaTextureLoader(GraphicsDevice)); SkeletonJson json = new SkeletonJson(atlas); skeleton = new Skeleton(json.ReadSkeletonData("data/" + name + ".json")); if (name == "goblins") skeleton.SetSkin("goblingirl"); skeleton.SetSlotsToBindPose(); // Without this the skin attachments won't be attached. See SetSkin. // Define mixing between animations. AnimationStateData stateData = new AnimationStateData(skeleton.Data); if (name == "spineboy") { stateData.SetMix("walk", "jump", 0.2f); stateData.SetMix("jump", "walk", 0.4f); } state = new AnimationState(stateData); state.SetAnimation("walk", false); state.AddAnimation("jump", false); state.AddAnimation("walk", true); skeleton.RootBone.X = 320; skeleton.RootBone.Y = 440; skeleton.UpdateWorldTransform(); }
protected override void LoadContent () { skeletonRenderer = new SkeletonMeshRenderer(GraphicsDevice); skeletonRenderer.PremultipliedAlpha = true; // String name = "spineboy"; // String name = "goblins-mesh"; String name = "raptor"; bool binaryData = true; Atlas atlas = new Atlas(assetsFolder + name + ".atlas", new XnaTextureLoader(GraphicsDevice)); float scale = 1; if (name == "spineboy") scale = 0.6f; if (name == "raptor") scale = 0.5f; SkeletonData skeletonData; if (binaryData) { SkeletonBinary binary = new SkeletonBinary(atlas); binary.Scale = scale; skeletonData = binary.ReadSkeletonData(assetsFolder + name + ".skel"); } else { SkeletonJson json = new SkeletonJson(atlas); json.Scale = scale; skeletonData = json.ReadSkeletonData(assetsFolder + name + ".json"); } skeleton = new Skeleton(skeletonData); if (name == "goblins-mesh") skeleton.SetSkin("goblin"); // Define mixing between animations. AnimationStateData stateData = new AnimationStateData(skeleton.Data); state = new AnimationState(stateData); if (name == "spineboy") { stateData.SetMix("run", "jump", 0.2f); stateData.SetMix("jump", "run", 0.4f); // Event handling for all animations. state.Start += Start; state.End += End; state.Complete += Complete; state.Event += Event; state.SetAnimation(0, "test", false); TrackEntry entry = state.AddAnimation(0, "jump", false, 0); entry.End += End; // Event handling for queued animations. state.AddAnimation(0, "run", true, 0); } else if (name == "raptor") { state.SetAnimation(0, "walk", true); state.SetAnimation(1, "empty", false); state.AddAnimation(1, "gungrab", false, 2); } else { state.SetAnimation(0, "walk", true); } skeleton.X = 400; skeleton.Y = 590; skeleton.UpdateWorldTransform(); headSlot = skeleton.FindSlot("head"); }
protected override void LoadContent() { skeletonRenderer = new SkeletonMeshRenderer(GraphicsDevice); skeletonRenderer.PremultipliedAlpha = true; // String name = "spineboy"; // String name = "goblins-mesh"; // String name = "raptor"; String name = "tank"; // String name = "star"; bool binaryData = true; Atlas atlas = new Atlas(assetsFolder + name + ".atlas", new XnaTextureLoader(GraphicsDevice)); float scale = 1; if (name == "spineboy") { scale = 0.6f; } if (name == "raptor") { scale = 0.5f; } if (name == "tank") { scale = 0.3f; } SkeletonData skeletonData; if (binaryData) { SkeletonBinary binary = new SkeletonBinary(atlas); binary.Scale = scale; skeletonData = binary.ReadSkeletonData(assetsFolder + name + ".skel"); } else { SkeletonJson json = new SkeletonJson(atlas); json.Scale = scale; skeletonData = json.ReadSkeletonData(assetsFolder + name + ".json"); } skeleton = new Skeleton(skeletonData); if (name == "goblins-mesh") { skeleton.SetSkin("goblin"); } // Define mixing between animations. AnimationStateData stateData = new AnimationStateData(skeleton.Data); state = new AnimationState(stateData); if (name == "spineboy") { stateData.SetMix("run", "jump", 0.2f); stateData.SetMix("jump", "run", 0.4f); // Event handling for all animations. state.Start += Start; state.End += End; state.Complete += Complete; state.Event += Event; state.SetAnimation(0, "test", false); TrackEntry entry = state.AddAnimation(0, "jump", false, 0); entry.End += End; // Event handling for queued animations. state.AddAnimation(0, "run", true, 0); } else if (name == "raptor") { state.SetAnimation(0, "walk", true); state.AddAnimation(1, "gungrab", false, 2); } else if (name == "star") { // no animation in star } else if (name == "tank") { state.SetAnimation(0, "drive", true); } else { state.SetAnimation(0, "walk", true); } skeleton.X = 400 + (name == "tank" ? 300: 0); skeleton.Y = 580; skeleton.UpdateWorldTransform(); headSlot = skeleton.FindSlot("head"); }
public static void Animate_gerakKiri() { spineAnimationState.SetAnimation(0, mulaiKiriAnimationName, false); spineAnimationState.AddAnimation(0, kiriAnimationName, true, 0.25f); }
protected override void LoadContent() { bool useNormalmapShader = false; Effect spineEffect; if (!useNormalmapShader) { // Two color tint effect. Note that you can also use the default BasicEffect instead. spineEffect = Content.Load <Effect>("spine-xna-example-content\\SpineEffect"); } else { spineEffect = Content.Load <Effect>("spine-xna-example-content\\SpineEffectNormalmap"); spineEffect.Parameters["Light0_Direction"].SetValue(new Vector3(-0.5265408f, 0.5735765f, -0.6275069f)); spineEffect.Parameters["Light0_Diffuse"].SetValue(new Vector3(1, 0.9607844f, 0.8078432f)); spineEffect.Parameters["Light0_Specular"].SetValue(new Vector3(1, 0.9607844f, 0.8078432f)); spineEffect.Parameters["Light0_SpecularExponent"].SetValue(2.0f); } spineEffect.Parameters["World"].SetValue(Matrix.Identity); spineEffect.Parameters["View"].SetValue(Matrix.CreateLookAt(new Vector3(0.0f, 0.0f, 1.0f), Vector3.Zero, Vector3.Up)); skeletonRenderer = new SkeletonRenderer(GraphicsDevice); skeletonRenderer.PremultipliedAlpha = false; skeletonRenderer.Effect = spineEffect; skeletonDebugRenderer = new SkeletonDebugRenderer(GraphicsDevice); skeletonDebugRenderer.DisableAll(); skeletonDebugRenderer.DrawClipping = true; // String name = "spineboy-pro"; String name = "raptor-pro"; // String name = "tank-pro"; //String name = "coin-pro"; if (useNormalmapShader) { name = "raptor-pro"; // we only have normalmaps for raptor } String atlasName = name.Replace("-pro", "").Replace("-ess", ""); bool binaryData = false; Atlas atlas; if (!useNormalmapShader) { atlas = new Atlas(assetsFolder + atlasName + ".atlas", new XnaTextureLoader(GraphicsDevice)); } else { atlas = new Atlas(assetsFolder + atlasName + ".atlas", new XnaTextureLoader(GraphicsDevice, loadMultipleTextureLayers: true, textureSuffixes: new string[] { "", "_normals" })); } float scale = 1; if (name == "spineboy-pro") { scale = 0.6f; } if (name == "raptor-pro") { scale = 0.5f; } if (name == "tank-pro") { scale = 0.3f; } if (name == "coin-pro") { scale = 1; } SkeletonData skeletonData; if (binaryData) { SkeletonBinary binary = new SkeletonBinary(atlas); binary.Scale = scale; skeletonData = binary.ReadSkeletonData(assetsFolder + name + ".skel"); } else { SkeletonJson json = new SkeletonJson(atlas); json.Scale = scale; skeletonData = json.ReadSkeletonData(assetsFolder + name + ".json"); } skeleton = new Skeleton(skeletonData); if (name == "goblins-pro") { skeleton.SetSkin("goblin"); } // Define mixing between animations. AnimationStateData stateData = new AnimationStateData(skeleton.Data); state = new AnimationState(stateData); if (name == "spineboy-pro") { skeleton.SetAttachment("head-bb", "head"); stateData.SetMix("run", "jump", 0.2f); stateData.SetMix("jump", "run", 0.4f); // Event handling for all animations. state.Start += Start; state.End += End; state.Complete += Complete; state.Event += Event; state.SetAnimation(0, "run", true); TrackEntry entry = state.AddAnimation(0, "jump", false, 0); entry.End += End; // Event handling for queued animations. state.AddAnimation(0, "run", true, 0); } else if (name == "raptor-pro") { state.SetAnimation(0, "walk", true); state.AddAnimation(1, "gun-grab", false, 2); } else if (name == "coin-pro") { state.SetAnimation(0, "animation", true); } else if (name == "tank-pro") { skeleton.X += 300; state.SetAnimation(0, "drive", true); } else { state.SetAnimation(0, "walk", true); } skeleton.X += 400; skeleton.Y += GraphicsDevice.Viewport.Height; skeleton.UpdateWorldTransform(); headSlot = skeleton.FindSlot("head"); }
AnimationStateTests(string testJsonFilePath) { skeletonData = json.ReadSkeletonData(testJsonFilePath); TrackEntry entry; Setup("0.1 time step", // 1 Expect(0, "start", 0, 0), // Expect(0, "event 0", 0, 0), // Expect(0, "event 14", 0.5f, 0.5f), // Expect(0, "event 30", 1, 1), // Expect(0, "complete", 1, 1), // Expect(0, "end", 1, 1.1f), // Expect(0, "dispose", 1, 1.1f) // ); state.SetAnimation(0, "events0", false).TrackEnd = 1; Run(0.1f, 1000, null); Setup("1/60 time step, dispose queued", // 2 Expect(0, "start", 0, 0), // Expect(0, "interrupt", 0, 0), // Expect(0, "end", 0, 0), // Expect(0, "dispose", 0, 0), // Expect(1, "dispose", 0, 0), // Expect(0, "dispose", 0, 0), // Expect(1, "dispose", 0, 0), // Note("First 2 set/addAnimation calls are done."), Expect(0, "start", 0, 0), // Expect(0, "event 0", 0, 0), // Expect(0, "event 14", 0.483f, 0.483f), // Expect(0, "event 30", 1, 1), // Expect(0, "complete", 1, 1), // Expect(0, "end", 1, 1.017f), // Expect(0, "dispose", 1, 1.017f) // ); state.SetAnimation(0, "events0", false); state.AddAnimation(0, "events1", false, 0); state.AddAnimation(0, "events0", false, 0); state.AddAnimation(0, "events1", false, 0); state.SetAnimation(0, "events0", false).TrackEnd = 1; Run(1 / 60f, 1000, null); Setup("30 time step", // 3 Expect(0, "start", 0, 0), // Expect(0, "event 0", 0, 0), // Expect(0, "event 14", 30, 30), // Expect(0, "event 30", 30, 30), // Expect(0, "complete", 30, 30), // Expect(0, "end", 30, 60), // Expect(0, "dispose", 30, 60) // ); state.SetAnimation(0, "events0", false).TrackEnd = 1; Run(30, 1000, null); Setup("1 time step", // 4 Expect(0, "start", 0, 0), // Expect(0, "event 0", 0, 0), // Expect(0, "event 14", 1, 1), // Expect(0, "event 30", 1, 1), // Expect(0, "complete", 1, 1), // Expect(0, "end", 1, 2), // Expect(0, "dispose", 1, 2) // ); state.SetAnimation(0, "events0", false).TrackEnd = 1; Run(1, 1.01f, null); Setup("interrupt", // 5 Expect(0, "start", 0, 0), // Expect(0, "event 0", 0, 0), // Expect(0, "event 14", 0.5f, 0.5f), // Expect(0, "event 30", 1, 1), // Expect(0, "complete", 1, 1), // Expect(0, "interrupt", 1.1f, 1.1f), // Expect(1, "start", 0.1f, 1.1f), // Expect(1, "event 0", 0.1f, 1.1f), // Expect(0, "end", 1.1f, 1.2f), // Expect(0, "dispose", 1.1f, 1.2f), // Expect(1, "event 14", 0.5f, 1.5f), // Expect(1, "event 30", 1, 2), // Expect(1, "complete", 1, 2), // Expect(1, "interrupt", 1.1f, 2.1f), // Expect(0, "start", 0.1f, 2.1f), // Expect(0, "event 0", 0.1f, 2.1f), // Expect(1, "end", 1.1f, 2.2f), // Expect(1, "dispose", 1.1f, 2.2f), // Expect(0, "event 14", 0.5f, 2.5f), // Expect(0, "event 30", 1, 3), // Expect(0, "complete", 1, 3), // Expect(0, "end", 1, 3.1f), // Expect(0, "dispose", 1, 3.1f) // ); state.SetAnimation(0, "events0", false); state.AddAnimation(0, "events1", false, 0); state.AddAnimation(0, "events0", false, 0).TrackEnd = 1; Run(0.1f, 4f, null); Setup("interrupt with delay", // 6 Expect(0, "start", 0, 0), // Expect(0, "event 0", 0, 0), // Expect(0, "event 14", 0.5f, 0.5f), // Expect(0, "interrupt", 0.6f, 0.6f), // Expect(1, "start", 0.1f, 0.6f), // Expect(1, "event 0", 0.1f, 0.6f), // Expect(0, "end", 0.6f, 0.7f), // Expect(0, "dispose", 0.6f, 0.7f), // Expect(1, "event 14", 0.5f, 1.0f), // Expect(1, "event 30", 1, 1.5f), // Expect(1, "complete", 1, 1.5f), // Expect(1, "end", 1, 1.6f), // Expect(1, "dispose", 1, 1.6f) // ); state.SetAnimation(0, "events0", false); state.AddAnimation(0, "events1", false, 0.5f).TrackEnd = 1; Run(0.1f, 1000, null); Setup("interrupt with delay and mix time", // 7 Expect(0, "start", 0, 0), // Expect(0, "event 0", 0, 0), // Expect(0, "event 14", 0.5f, 0.5f), // Expect(0, "interrupt", 1, 1), // Expect(1, "start", 0.1f, 1), // Expect(0, "complete", 1, 1), // Expect(1, "event 0", 0.1f, 1), // Expect(1, "event 14", 0.5f, 1.4f), // Expect(0, "end", 1.6f, 1.7f), // Expect(0, "dispose", 1.6f, 1.7f), // Expect(1, "event 30", 1, 1.9f), // Expect(1, "complete", 1, 1.9f), // Expect(1, "end", 1, 2), // Expect(1, "dispose", 1, 2) // ); stateData.SetMix("events0", "events1", 0.7f); state.SetAnimation(0, "events0", true); state.AddAnimation(0, "events1", false, 0.9f).TrackEnd = 1; Run(0.1f, 1000, null); Setup("animation 0 events do not fire during mix", // 8 Expect(0, "start", 0, 0), // Expect(0, "event 0", 0, 0), // Expect(0, "interrupt", 0.5f, 0.5f), // Expect(1, "start", 0.1f, 0.5f), // Expect(1, "event 0", 0.1f, 0.5f), // Expect(1, "event 14", 0.5f, 0.9f), // Expect(0, "complete", 1, 1), // Expect(0, "end", 1.1f, 1.2f), // Expect(0, "dispose", 1.1f, 1.2f), // Expect(1, "event 30", 1, 1.4f), // Expect(1, "complete", 1, 1.4f), // Expect(1, "end", 1, 1.5f), // Expect(1, "dispose", 1, 1.5f) // ); stateData.DefaultMix = 0.7f; state.SetAnimation(0, "events0", false); state.AddAnimation(0, "events1", false, 0.4f).TrackEnd = 1; Run(0.1f, 1000, null); Setup("event threshold, some animation 0 events fire during mix", // 9 Expect(0, "start", 0, 0), // Expect(0, "event 0", 0, 0), // Expect(0, "interrupt", 0.5f, 0.5f), // Expect(1, "start", 0.1f, 0.5f), // Expect(0, "event 14", 0.5f, 0.5f), // Expect(1, "event 0", 0.1f, 0.5f), // Expect(1, "event 14", 0.5f, 0.9f), // Expect(0, "complete", 1, 1), // Expect(0, "end", 1.1f, 1.2f), // Expect(0, "dispose", 1.1f, 1.2f), // Expect(1, "event 30", 1, 1.4f), // Expect(1, "complete", 1, 1.4f), // Expect(1, "end", 1, 1.5f), // Expect(1, "dispose", 1, 1.5f) // ); stateData.SetMix("events0", "events1", 0.7f); state.SetAnimation(0, "events0", false).EventThreshold = 0.5f; state.AddAnimation(0, "events1", false, 0.4f).TrackEnd = 1; Run(0.1f, 1000, null); Setup("event threshold, all animation 0 events fire during mix", // 10 Expect(0, "start", 0, 0), // Expect(0, "event 0", 0, 0), // Expect(0, "event 14", 0.5f, 0.5f), // Expect(0, "interrupt", 0.9f, 0.9f), // Expect(1, "start", 0.1f, 0.9f), // Expect(1, "event 0", 0.1f, 0.9f), // Expect(0, "event 30", 1, 1), // Expect(0, "complete", 1, 1), // Expect(0, "event 0", 1, 1), // Expect(1, "event 14", 0.5f, 1.3f), // Expect(0, "end", 1.5f, 1.6f), // Expect(0, "dispose", 1.5f, 1.6f), // Expect(1, "event 30", 1, 1.8f), // Expect(1, "complete", 1, 1.8f), // Expect(1, "end", 1, 1.9f), // Expect(1, "dispose", 1, 1.9f) // ); state.SetAnimation(0, "events0", true).EventThreshold = 1; entry = state.AddAnimation(0, "events1", false, 0.8f); entry.MixDuration = 0.7f; entry.TrackEnd = 1; Run(0.1f, 1000, null); Setup("looping", // 11 Expect(0, "start", 0, 0), // Expect(0, "event 0", 0, 0), // Expect(0, "event 14", 0.5f, 0.5f), // Expect(0, "event 30", 1, 1), // Expect(0, "complete", 1, 1), // Expect(0, "event 0", 1, 1), // Expect(0, "event 14", 1.5f, 1.5f), // Expect(0, "event 30", 2, 2), // Expect(0, "complete", 2, 2), // Expect(0, "event 0", 2, 2), // Expect(0, "event 14", 2.5f, 2.5f), // Expect(0, "event 30", 3, 3), // Expect(0, "complete", 3, 3), // Expect(0, "event 0", 3, 3), // Expect(0, "event 14", 3.5f, 3.5f), // Expect(0, "event 30", 4, 4), // Expect(0, "complete", 4, 4), // Expect(0, "event 0", 4, 4), // Expect(0, "end", 4.1f, 4.1f), // Expect(0, "dispose", 4.1f, 4.1f) // ); state.SetAnimation(0, "events0", true); Run(0.1f, 4, null); Setup("not looping, track end past animation 0 duration", // 12 Expect(0, "start", 0, 0), // Expect(0, "event 0", 0, 0), // Expect(0, "event 14", 0.5f, 0.5f), // Expect(0, "event 30", 1, 1), // Expect(0, "complete", 1, 1), // Expect(0, "interrupt", 2.1f, 2.1f), // Expect(1, "start", 0.1f, 2.1f), // Expect(1, "event 0", 0.1f, 2.1f), // Expect(0, "end", 2.1f, 2.2f), // Expect(0, "dispose", 2.1f, 2.2f), // Expect(1, "event 14", 0.5f, 2.5f), // Expect(1, "event 30", 1, 3), // Expect(1, "complete", 1, 3), // Expect(1, "end", 1, 3.1f), // Expect(1, "dispose", 1, 3.1f) // ); state.SetAnimation(0, "events0", false); state.AddAnimation(0, "events1", false, 2).TrackEnd = 1; Run(0.1f, 4f, null); Setup("interrupt animation after first loop complete", // 13 Expect(0, "start", 0, 0), // Expect(0, "event 0", 0, 0), // Expect(0, "event 14", 0.5f, 0.5f), // Expect(0, "event 30", 1, 1), // Expect(0, "complete", 1, 1), // Expect(0, "event 0", 1, 1), // Expect(0, "event 14", 1.5f, 1.5f), // Expect(0, "event 30", 2, 2), // Expect(0, "complete", 2, 2), // Expect(0, "event 0", 2, 2), // Expect(0, "interrupt", 2.1f, 2.1f), // Expect(1, "start", 0.1f, 2.1f), // Expect(1, "event 0", 0.1f, 2.1f), // Expect(0, "end", 2.1f, 2.2f), // Expect(0, "dispose", 2.1f, 2.2f), // Expect(1, "event 14", 0.5f, 2.5f), // Expect(1, "event 30", 1, 3), // Expect(1, "complete", 1, 3), // Expect(1, "end", 1, 3.1f), // Expect(1, "dispose", 1, 3.1f) // ); state.SetAnimation(0, "events0", true); Run(0.1f, 6, new TestListener( (time) => { if (IsEqual(time, 1.4f)) { state.AddAnimation(0, "events1", false, 0).TrackEnd = 1; } })); Setup("add animation on empty track", // 14 Expect(0, "start", 0, 0), // Expect(0, "event 0", 0, 0), // Expect(0, "event 14", 0.5f, 0.5f), // Expect(0, "event 30", 1, 1), // Expect(0, "complete", 1, 1), // Expect(0, "end", 1, 1.1f), // Expect(0, "dispose", 1, 1.1f) // ); state.AddAnimation(0, "events0", false, 0).TrackEnd = 1; Run(0.1f, 1.9f, null); Setup("end time beyond non-looping animation duration", // 15 Expect(0, "start", 0, 0), // Expect(0, "event 0", 0, 0), // Expect(0, "event 14", 0.5f, 0.5f), // Expect(0, "event 30", 1, 1), // Expect(0, "complete", 1, 1), // Expect(0, "end", 9f, 9.1f), // Expect(0, "dispose", 9f, 9.1f) // ); state.SetAnimation(0, "events0", false).TrackEnd = 9; Run(0.1f, 10, null); Setup("looping with animation start", // 16 Expect(0, "start", 0, 0), // Expect(0, "event 30", 0.4f, 0.4f), // Expect(0, "complete", 0.4f, 0.4f), // Expect(0, "event 30", 0.8f, 0.8f), // Expect(0, "complete", 0.8f, 0.8f), // Expect(0, "event 30", 1.2f, 1.2f), // Expect(0, "complete", 1.2f, 1.2f), // Expect(0, "end", 1.4f, 1.4f), // Expect(0, "dispose", 1.4f, 1.4f) // ); entry = state.SetAnimation(0, "events0", true); entry.AnimationLast = 0.6f; entry.AnimationStart = 0.6f; Run(0.1f, 1.4f, null); Setup("looping with animation start and end", // 17 Expect(0, "start", 0, 0), // Expect(0, "event 14", 0.3f, 0.3f), // Expect(0, "complete", 0.6f, 0.6f), // Expect(0, "event 14", 0.9f, 0.9f), // Expect(0, "complete", 1.2f, 1.2f), // Expect(0, "event 14", 1.5f, 1.5f), // Expect(0, "end", 1.8f, 1.8f), // Expect(0, "dispose", 1.8f, 1.8f) // ); entry = state.SetAnimation(0, "events0", true); entry.AnimationStart = 0.2f; entry.AnimationLast = 0.2f; entry.AnimationEnd = 0.8f; Run(0.1f, 1.8f, null); Setup("non-looping with animation start and end", // 18 Expect(0, "start", 0, 0), // Expect(0, "event 14", 0.3f, 0.3f), // Expect(0, "complete", 0.6f, 0.6f), // Expect(0, "end", 1, 1.1f), // Expect(0, "dispose", 1, 1.1f) // ); entry = state.SetAnimation(0, "events0", false); entry.AnimationStart = 0.2f; entry.AnimationLast = 0.2f; entry.AnimationEnd = 0.8f; entry.TrackEnd = 1; Run(0.1f, 1.8f, null); Setup("mix out looping with animation start and end", // 19 Expect(0, "start", 0, 0), // Expect(0, "event 14", 0.3f, 0.3f), // Expect(0, "complete", 0.6f, 0.6f), // Expect(0, "interrupt", 0.8f, 0.8f), // Expect(1, "start", 0.1f, 0.8f), // Expect(1, "event 0", 0.1f, 0.8f), // Expect(0, "event 14", 0.9f, 0.9f), // Expect(0, "complete", 1.2f, 1.2f), // Expect(1, "event 14", 0.5f, 1.2f), // Expect(0, "end", 1.4f, 1.5f), // Expect(0, "dispose", 1.4f, 1.5f), // Expect(1, "event 30", 1, 1.7f), // Expect(1, "complete", 1, 1.7f), // Expect(1, "end", 1, 1.8f), // Expect(1, "dispose", 1, 1.8f) // ); entry = state.SetAnimation(0, "events0", true); entry.AnimationStart = (0.2f); entry.AnimationLast = (0.2f); entry.AnimationEnd = (0.8f); entry.EventThreshold = 1; entry = state.AddAnimation(0, "events1", false, 0.7f); entry.MixDuration = (0.7f); entry.TrackEnd = 1; Run(0.1f, 20, null); Setup("setAnimation with track entry mix", // 20 Expect(0, "start", 0, 0), // Expect(0, "event 0", 0, 0), // Expect(0, "event 14", 0.5f, 0.5f), // Expect(0, "event 30", 1, 1), // Expect(0, "complete", 1, 1), // Expect(0, "event 0", 1, 1), // Expect(0, "interrupt", 1, 1), // Expect(1, "start", 0, 1), // Expect(1, "event 0", 0.1f, 1.1f), // Expect(1, "event 14", 0.5f, 1.5f), // Expect(0, "end", 1.7f, 1.8f), // Expect(0, "dispose", 1.7f, 1.8f), // Expect(1, "event 30", 1, 2), // Expect(1, "complete", 1, 2), // Expect(1, "end", 1, 2.1f), // Expect(1, "dispose", 1, 2.1f) // ); state.SetAnimation(0, "events0", true); Run(0.1f, 1000, new TestListener( (time) => { if (IsEqual(time, 1f)) { TrackEntry ent = state.SetAnimation(0, "events1", false); ent.MixDuration = (0.7f); ent.TrackEnd = 1; } })); Setup("setAnimation twice", // 21 Expect(0, "start", 0, 0), // Expect(0, "interrupt", 0, 0), // Expect(0, "end", 0, 0), // Expect(0, "dispose", 0, 0), // Expect(1, "start", 0, 0), // Expect(1, "event 0", 0, 0), // Expect(1, "event 14", 0.5f, 0.5f), // Note("First 2 setAnimation calls are done."), Expect(1, "interrupt", 0.8f, 0.8f), // Expect(0, "start", 0, 0.8f), // Expect(0, "interrupt", 0, 0.8f), // Expect(0, "end", 0, 0.8f), // Expect(0, "dispose", 0, 0.8f), // Expect(2, "start", 0, 0.8f), // Expect(2, "event 0", 0.1f, 0.9f), // Expect(1, "end", 0.9f, 1), // Expect(1, "dispose", 0.9f, 1), // Expect(2, "event 14", 0.5f, 1.3f), // Expect(2, "event 30", 1, 1.8f), // Expect(2, "complete", 1, 1.8f), // Expect(2, "end", 1, 1.9f), // Expect(2, "dispose", 1, 1.9f) // ); state.SetAnimation(0, "events0", false); // First should be ignored. state.SetAnimation(0, "events1", false); Run(0.1f, 1000, new TestListener( (time) => { if (IsEqual(time, 0.8f)) { state.SetAnimation(0, "events0", false); // First should be ignored. state.SetAnimation(0, "events2", false).TrackEnd = 1; } })); Setup("setAnimation twice with multiple mixing", // 22 Expect(0, "start", 0, 0), // Expect(0, "interrupt", 0, 0), // Expect(0, "end", 0, 0), // Expect(0, "dispose", 0, 0), // Expect(1, "start", 0, 0), // Expect(1, "event 0", 0, 0), // Note("First 2 setAnimation calls are done."), Expect(1, "interrupt", 0.2f, 0.2f), // Expect(0, "start", 0, 0.2f), // Expect(0, "interrupt", 0, 0.2f), // Expect(0, "end", 0, 0.2f), // Expect(0, "dispose", 0, 0.2f), // Expect(2, "start", 0, 0.2f), // Expect(2, "event 0", 0.1f, 0.3f), // Note("Second 2 setAnimation calls are done."), Expect(2, "interrupt", 0.2f, 0.4f), // Expect(1, "start", 0, 0.4f), // Expect(1, "interrupt", 0, 0.4f), // Expect(1, "end", 0, 0.4f), // Expect(1, "dispose", 0, 0.4f), // Expect(0, "start", 0, 0.4f), // Expect(0, "event 0", 0.1f, 0.5f), // Expect(1, "end", 0.8f, 0.9f), // Expect(1, "dispose", 0.8f, 0.9f), // Expect(0, "event 14", 0.5f, 0.9f), // Expect(2, "end", 0.8f, 1.1f), // Expect(2, "dispose", 0.8f, 1.1f), // Expect(0, "event 30", 1, 1.4f), // Expect(0, "complete", 1, 1.4f), // Expect(0, "end", 1, 1.5f), // Expect(0, "dispose", 1, 1.5f) // ); stateData.DefaultMix = 0.6f; state.SetAnimation(0, "events0", false); // First should be ignored. state.SetAnimation(0, "events1", false); Run(0.1f, 1000, new TestListener( (time) => { if (IsEqual(time, 0.2f)) { state.SetAnimation(0, "events0", false); // First should be ignored. state.SetAnimation(0, "events2", false); } if (IsEqual(time, 0.4f)) { state.SetAnimation(0, "events1", false); // First should be ignored. state.SetAnimation(0, "events0", false).TrackEnd = 1; } })); Setup("addAnimation with delay on empty track", // 23 Expect(0, "start", 0, 0), // Expect(0, "event 0", 0, 5), // Expect(0, "event 14", 0.5f, 5.5f), // Expect(0, "event 30", 1, 6), // Expect(0, "complete", 1, 6), // Expect(0, "end", 1, 6.1f), // Expect(0, "dispose", 1, 6.1f) // ); state.AddAnimation(0, "events0", false, 5).TrackEnd = 1; Run(0.1f, 10, null); Setup("setAnimation during AnimationStateListener"); // 24 state.Start += (trackEntry) => { if (trackEntry.Animation.Name.Equals("events0")) { state.SetAnimation(1, "events1", false); } }; state.Interrupt += (trackEntry) => { state.AddAnimation(3, "events1", false, 0); }; state.End += (trackEntry) => { if (trackEntry.Animation.Name.Equals("events0")) { state.SetAnimation(0, "events1", false); } }; state.Dispose += (trackEntry) => { if (trackEntry.Animation.Name.Equals("events0")) { state.SetAnimation(1, "events1", false); } }; state.Complete += (trackEntry) => { if (trackEntry.Animation.Name.Equals("events0")) { state.SetAnimation(1, "events1", false); } }; state.Event += (trackEntry, ev) => { if (trackEntry.TrackIndex != 2) { state.SetAnimation(2, "events1", false); } }; state.AddAnimation(0, "events0", false, 0); state.AddAnimation(0, "events1", false, 0); state.SetAnimation(1, "events1", false).TrackEnd = 1; Run(0.1f, 10, null); Setup("clearTrack", // 25 Expect(0, "start", 0, 0), // Expect(0, "event 0", 0, 0), // Expect(0, "event 14", 0.5f, 0.5f), // Expect(0, "end", 0.7f, 0.7f), // Expect(0, "dispose", 0.7f, 0.7f) // ); state.AddAnimation(0, "events0", false, 0).TrackEnd = 1; Run(0.1f, 10, new TestListener( (time) => { if (IsEqual(time, 0.7f)) { state.ClearTrack(0); } })); Setup("setEmptyAnimation", // 26 Expect(0, "start", 0, 0), // Expect(0, "event 0", 0, 0), // Expect(0, "event 14", 0.5f, 0.5f), // Expect(0, "interrupt", 0.7f, 0.7f), // Expect(-1, "start", 0, 0.7f), // Expect(-1, "complete", 0.1f, 0.8f), // Expect(0, "end", 0.8f, 0.9f), // Expect(0, "dispose", 0.8f, 0.9f), // Expect(-1, "end", 0.2f, 1), // Expect(-1, "dispose", 0.2f, 1) // ); state.AddAnimation(0, "events0", false, 0).TrackEnd = 1; Run(0.1f, 10, new TestListener( (time) => { if (IsEqual(time, 0.7f)) { state.SetEmptyAnimation(0, 0); } })); Setup("TrackEntry listener"); // 27 int counter = 0; entry = state.AddAnimation(0, "events0", false, 0); entry.Start += (trackEntry) => { Interlocked.Add(ref counter, 1 << 1); }; entry.Interrupt += (trackEntry) => { Interlocked.Add(ref counter, 1 << 5); }; entry.End += (trackEntry) => { Interlocked.Add(ref counter, 1 << 9); }; entry.Dispose += (trackEntry) => { Interlocked.Add(ref counter, 1 << 13); }; entry.Complete += (trackEntry) => { Interlocked.Add(ref counter, 1 << 17); }; entry.Event += (trackEntry, ev) => { Interlocked.Add(ref counter, 1 << 21); }; state.AddAnimation(0, "events0", false, 0); state.AddAnimation(0, "events1", false, 0); state.SetAnimation(1, "events1", false).TrackEnd = 1; Run(0.1f, 10, null); if (counter != 15082016) { string message = "TEST 27 FAILED! " + counter; Log(message); FailTestRun(message); } #if RUN_ADDITIONAL_FORUM_RELATED_TEST Setup("0.1 time step, start and add", // 2 Expect(0, "start", 0, 0), // Expect(0, "event 0", 0, 0), // Expect(0, "event 14", 0.5f, 0.5f), // Expect(0, "event 30", 1, 1), // Expect(0, "complete", 1, 1), // Expect(0, "interrupt", 1.1f, 1.1f), // Expect(1, "start", 0.1f, 1.1f), // Expect(1, "event 0", 0.1f, 1.1f), // Expect(0, "end", 1.3f, 1.4f), // Expect(0, "dispose", 1.3f, 1.4f), // Expect(1, "event 14", 0.5f, 1.5f), // Expect(1, "event 30", 1, 2), // Expect(1, "complete", 1, 2), // Expect(1, "end", 1, 2.1f), // Expect(1, "dispose", 1, 2.1f) // ); state.SetAnimation(0, "events0", false); var entry1 = state.AddAnimation(0, "events1", false, 0); entry1.MixDuration = 0.25f; entry1.TrackEnd = 1.0f; Run(0.1f, 1000, null); #endif // RUN_ADDITIONAL_FORUM_RELATED_TEST Log("AnimationState tests passed."); }
public void AddAnim(string name, bool isLoop) { state.AddAnimation(0, name, isLoop, 0); }