/// <summary> /// Function to build up an animation for the torus. /// </summary> private void BuildAnimation() { var builder = new GorgonAnimationBuilder(); IGorgonTrackKeyBuilder <GorgonKeyTexture2D> track = builder.Edit2DTexture(); float time = 0; int frameCount = 0; for (int y = 0; y < _torusTexture.Height && frameCount < 60; y += 64) { for (int x = 0; x < _torusTexture.Width && frameCount < 60; x += 64, frameCount++) { DX.RectangleF texCoords = _torusTexture.ToTexel(new DX.Rectangle(x, y, 64, 64)); track.SetKey(new GorgonKeyTexture2D(time, _torusTexture, texCoords, 0)); // 30 FPS. time += 1 / 30.0f; } } track.EndEdit(); _torusAnim = builder.Build("Torus Animation"); _torusAnim.IsLooped = true; _controllerLeft = new GorgonSpriteAnimationController(); _controllerRight = new GorgonSpriteAnimationController(); _controllerLeft.Play(_torusLeft, _torusAnim); _controllerRight.Play(_torusRight, _torusAnim); _controllerRight.Pause(); }
// ReSharper disable once InconsistentNaming /// <summary> /// Function to build our animation... like an 80's music video... this is going to be ugly. /// </summary> private static void MakeAn80sMusicVideo() { var animBuilder = new GorgonAnimationBuilder(); animBuilder.PositionInterpolationMode(TrackInterpolationMode.Spline) .ScaleInterpolationMode(TrackInterpolationMode.Spline) .RotationInterpolationMode(TrackInterpolationMode.Spline) .ColorInterpolationMode(TrackInterpolationMode.Spline) // Set up some scaling... .EditScale() .SetKey(new GorgonKeyVector3(0, new DX.Vector2(1, 1))) .SetKey(new GorgonKeyVector3(2, new DX.Vector2(0.5f, 0.5f))) .SetKey(new GorgonKeyVector3(4, new DX.Vector2(4.0f, 4.0f))) .SetKey(new GorgonKeyVector3(6, new DX.Vector2(1, 1))) .EndEdit() // Set up some positions... .EditPositions() .SetKey(new GorgonKeyVector3(0, new DX.Vector2(_screen.Width / 2.0f, _screen.Height / 2.0f))) .SetKey(new GorgonKeyVector3(2, new DX.Vector2(200, 220))) .SetKey(new GorgonKeyVector3(3, new DX.Vector2(_screen.Width - 2, 130))) .SetKey(new GorgonKeyVector3(4, new DX.Vector2(255, _screen.Height - _metal.Height))) .SetKey(new GorgonKeyVector3(5, new DX.Vector2(200, 180))) .SetKey(new GorgonKeyVector3(6, new DX.Vector2(180, 160))) .SetKey(new GorgonKeyVector3(7, new DX.Vector2(150, 180))) .SetKey(new GorgonKeyVector3(8, new DX.Vector2(150, 160))) .SetKey(new GorgonKeyVector3(9, new DX.Vector2(_screen.Width / 2, _screen.Height / 2))) .EndEdit() // Set up some colors...By changing the alpha, we can simulate a motion blur effect. .EditColors() .SetKey(new GorgonKeyGorgonColor(0, GorgonColor.Black)) .SetKey(new GorgonKeyGorgonColor(2, new GorgonColor(GorgonColor.RedPure, 0.25f))) .SetKey(new GorgonKeyGorgonColor(4, new GorgonColor(GorgonColor.GreenPure, 0.5f))) .SetKey(new GorgonKeyGorgonColor(6, new GorgonColor(GorgonColor.BluePure, 0.25f))) .SetKey(new GorgonKeyGorgonColor(8, new GorgonColor(GorgonColor.LightCyan, 0.25f))) .SetKey(new GorgonKeyGorgonColor(10, new GorgonColor(GorgonColor.Black, 1.0f))) .EndEdit() // And finally, some MuchMusic/MTV style rotation... because. .EditRotation() .SetKey(new GorgonKeyVector3(0, new DX.Vector3(0, 0, 0))) .SetKey(new GorgonKeyVector3(2, new DX.Vector3(0, 0, 180))) .SetKey(new GorgonKeyVector3(4, new DX.Vector3(0, 0, 270.0f))) .SetKey(new GorgonKeyVector3(6, new DX.Vector3(0, 0, 0))) .EndEdit(); IGorgonTrackKeyBuilder <GorgonKeyTexture2D> trackBuilder = animBuilder.Edit2DTexture(); float time = 0; // Now, add the animation frames from our GIF. for (int i = 0; i < _metal.ArrayCount; ++i) { trackBuilder.SetKey(new GorgonKeyTexture2D(time, _metal, new DX.RectangleF(0, 0, 1, 1), i)); time += _frameDelays[i]; } float delay = (10.0f - time).Max(0) / 15.0f; // Now add in a texture switch with coordinate update... because. trackBuilder.SetKey(new GorgonKeyTexture2D(time, _trooper, new DX.RectangleF(0.25f, 0.25f, 0.5f, 0.5f), 0)); time += delay; trackBuilder.SetKey(new GorgonKeyTexture2D(time, _trooper, new DX.RectangleF(0.125f, 0.125f, 0.75f, 0.75f), 0)); time += delay; trackBuilder.SetKey(new GorgonKeyTexture2D(time, _trooper, new DX.RectangleF(0, 0, 1, 1), 0)); time += delay; trackBuilder.SetKey(new GorgonKeyTexture2D(time, _trooper, new DX.RectangleF(0.125f, 0.125f, 0.75f, 0.75f), 0)); time += delay; trackBuilder.SetKey(new GorgonKeyTexture2D(time, _trooper, new DX.RectangleF(0.25f, 0.25f, 0.5f, 0.5f), 0)); time += delay; trackBuilder.SetKey(new GorgonKeyTexture2D(time, _trooper, new DX.RectangleF(0.125f, 0.125f, 0.75f, 0.75f), 0)); time += delay; trackBuilder.SetKey(new GorgonKeyTexture2D(time, _trooper, new DX.RectangleF(0, 0, 1, 1), 0)); time += delay; trackBuilder.SetKey(new GorgonKeyTexture2D(time, _trooper, new DX.RectangleF(0.125f, 0.125f, 0.75f, 0.75f), 0)); time += delay; trackBuilder.SetKey(new GorgonKeyTexture2D(time, _trooper, new DX.RectangleF(0.25f, 0.25f, 0.5f, 0.5f), 0)); time += delay; trackBuilder.SetKey(new GorgonKeyTexture2D(time, _trooper, new DX.RectangleF(0.125f, 0.125f, 0.75f, 0.75f), 0)); time += delay; trackBuilder.SetKey(new GorgonKeyTexture2D(time, _trooper, new DX.RectangleF(0, 0, 1, 1), 0)); time += delay; trackBuilder.SetKey(new GorgonKeyTexture2D(time, _trooper, new DX.RectangleF(0.125f, 0.125f, 0.75f, 0.75f), 0)); time += delay; trackBuilder.SetKey(new GorgonKeyTexture2D(time, _trooper, new DX.RectangleF(0.25f, 0.25f, 0.5f, 0.5f), 0)); time += delay; trackBuilder.SetKey(new GorgonKeyTexture2D(time, _trooper, new DX.RectangleF(0.125f, 0.125f, 0.75f, 0.75f), 0)); time += delay; trackBuilder.SetKey(new GorgonKeyTexture2D(time, _trooper, new DX.RectangleF(0, 0, 1, 1), 0)); trackBuilder.EndEdit(); _animation = animBuilder.Build(@"\m/"); _animation.IsLooped = true; _animController = new GorgonSpriteAnimationController(); }
/// <summary> /// Function to build the animations. /// </summary> /// <param name="sprites">The list of sprites loaded from the file system.</param> private static void BuildAnimations(IReadOnlyDictionary <string, GorgonSprite> sprites) { var animBuilder = new GorgonAnimationBuilder(); // Extract the sprites that have the animation frames. // We'll use the name of the sprite to determine the type of animation and ordering. // If we had an animation editor in the editor application, this would be a lot easier, but for now we'll have to do this. // If I create an editor, I'll try to replace this code with the animations in the editor file system. GorgonSprite[] upFrames = sprites.OrderBy(item => item.Key) .Where(item => item.Key.StartsWith("Guy_Up_", StringComparison.OrdinalIgnoreCase)) .Select(item => item.Value) .ToArray(); IEnumerable <GorgonSprite> turnFrames = sprites.OrderBy(item => item.Key) .Where(item => item.Key.StartsWith("Guy_Turn_", StringComparison.OrdinalIgnoreCase)) .Select(item => item.Value); GorgonSprite[] walkLeftFrames = sprites.OrderBy(item => item.Key) .Where(item => item.Key.StartsWith("Guy_Left_", StringComparison.OrdinalIgnoreCase)) .Select(item => item.Value) .ToArray(); float time = 0; // Build animation for walking up. for (int i = 0; i < upFrames.Length; ++i) { GorgonSprite sprite = upFrames[i]; animBuilder.Edit2DTexture() .SetKey(new GorgonKeyTexture2D(time, sprite.Texture, sprite.TextureRegion, 0)) .EndEdit(); time += 0.15f; } // Reverse the animation so we don't get popping as it loops. for (int i = upFrames.Length - 2; i >= 1; --i) { GorgonSprite sprite = upFrames[i]; animBuilder.Edit2DTexture() .SetKey(new GorgonKeyTexture2D(time, sprite.Texture, sprite.TextureRegion, 0)) .EndEdit(); time += 0.15f; } _animations[AnimationName.WalkUp] = animBuilder.Build("Walk Up"); _animations[AnimationName.WalkUp].IsLooped = true; // Build animation for turning left. time = 0; animBuilder.Clear(); foreach (GorgonSprite sprite in turnFrames) { animBuilder.Edit2DTexture() .SetKey(new GorgonKeyTexture2D(time, sprite.Texture, sprite.TextureRegion, 0)) .EndEdit(); time += 0.20f; } _animations[AnimationName.Turn] = animBuilder.Build("Turn Left"); // Build animation for walking left. time = 0; animBuilder.Clear(); for (int i = 0; i < walkLeftFrames.Length; ++i) { GorgonSprite sprite = walkLeftFrames[i]; animBuilder.Edit2DTexture() .SetKey(new GorgonKeyTexture2D(time, sprite.Texture, sprite.TextureRegion, 0)) .EndEdit(); time += 0.15f; } _animations[AnimationName.WalkLeft] = animBuilder.Build("Walk Left"); _animations[AnimationName.WalkLeft].IsLooped = true; // Finally, we'll need a controller to play and update the animations over time. _controller = new GorgonSpriteAnimationController(); }