Пример #1
0
 public SpriteAnimation(SpriteAnimationDefinition definition, SpriteDefinition spriteDefinition)
 {
     Definition       = definition;
     SpriteDefinition = spriteDefinition;
     Paused           = definition.Frames.Length <= 1; // Pause the animation if there's only one frame.
     currentFrame     = 0;
     resetWaitTime();
 }
Пример #2
0
        public Sprite(Texture2D texture, SpriteDefinition spriteDefinition, string spritePath)
        {
            Texture2D = texture;
            SpriteDefinition = spriteDefinition;
            CurrentAnimationName = "idle";
            this.spritePath = spritePath;

            animation = new SpriteAnimation(SpriteDefinition.AnimationDefinitions[CurrentAnimationName], SpriteDefinition);
        }
Пример #3
0
        public Sprite(Texture2D texture, SpriteDefinition spriteDefinition, string spritePath)
        {
            Texture2D            = texture;
            SpriteDefinition     = spriteDefinition;
            CurrentAnimationName = "idle";
            this.spritePath      = spritePath;

            animation = new SpriteAnimation(SpriteDefinition.AnimationDefinitions[CurrentAnimationName], SpriteDefinition);
        }
Пример #4
0
        /// <summary>Reloads the texture and sprite definition from disk.</summary>
        public void Reload()
        {
            var currentAnimationFrame = animation.GetCurrentFrame();
            var currentAnimationName = animation.Definition.Name;
            var currentPlayOnce = animation.GetPlayOnce();

            var reloadedSprite = Sprite.LoadSprite(spritePath);
            Texture2D = reloadedSprite.Texture2D;
            SpriteDefinition = reloadedSprite.SpriteDefinition;
            var oldAnim = animation;
            animation = reloadedSprite.animation;
            animation.SetDefinition(SpriteDefinition.AnimationDefinitions[currentAnimationName], false);
            animation.SetFrame(currentAnimationFrame);
            animation.SetPlayOnce(currentPlayOnce);
            animation.currentWaitTime = oldAnim.currentWaitTime;
            animation.waitTimeTarget = oldAnim.waitTimeTarget;
            animation.animationDirection = oldAnim.animationDirection;
            animation.Paused = oldAnim.Paused;
            animation.lastAnimationName = oldAnim.lastAnimationName;
        }
Пример #5
0
        /// <summary>Reloads the texture and sprite definition from disk.</summary>
        public void Reload()
        {
            var currentAnimationFrame = animation.GetCurrentFrame();
            var currentAnimationName  = animation.Definition.Name;
            var currentPlayOnce       = animation.GetPlayOnce();

            var reloadedSprite = Sprite.LoadSprite(spritePath);

            Texture2D        = reloadedSprite.Texture2D;
            SpriteDefinition = reloadedSprite.SpriteDefinition;
            var oldAnim = animation;

            animation = reloadedSprite.animation;
            animation.SetDefinition(SpriteDefinition.AnimationDefinitions[currentAnimationName], false);
            animation.SetFrame(currentAnimationFrame);
            animation.SetPlayOnce(currentPlayOnce);
            animation.currentWaitTime    = oldAnim.currentWaitTime;
            animation.waitTimeTarget     = oldAnim.waitTimeTarget;
            animation.animationDirection = oldAnim.animationDirection;
            animation.Paused             = oldAnim.Paused;
            animation.lastAnimationName  = oldAnim.lastAnimationName;
        }
Пример #6
0
 public SpriteAnimation(SpriteAnimationDefinition definition, SpriteDefinition spriteDefinition)
 {
     Definition = definition;
     SpriteDefinition = spriteDefinition;
     Paused = definition.Frames.Length <= 1; // Pause the animation if there's only one frame.
     currentFrame = 0;
     resetWaitTime();
 }
Пример #7
0
        public static SpriteDefinition LoadSpriteDefinition(string spritePath)
        {
            spritePath = Utility.GetContentDir("sprites/" + spritePath);

            if (!File.Exists(spritePath))
                return null;

            var definition = new SpriteDefinition();
            string jsonDefinition = File.ReadAllText(spritePath);
            var jDefinition = JsonConvert.DeserializeObject<JToken>(Utility.JsonRemoveComments(jsonDefinition));

            definition.DefaultAnimationFPS = jDefinition["defaultFps"].Value<float>();
            definition.Scale = jDefinition["scale"].Value<float>();
            definition.AnimationDefinitions = new Dictionary<string, SpriteAnimationDefinition>();

            // Add animations
            var jAnimations = jDefinition["animations"].Value<JArray>();
            foreach (JObject jAnimation in jAnimations)
            {
                var animDefinition = new SpriteAnimationDefinition();

                animDefinition.Name = jAnimation["name"].Value<string>();
                animDefinition.FPS = jAnimation["fps"] != null ? jAnimation["fps"].Value<float>() : definition.DefaultAnimationFPS;

                var jType = jAnimation["type"];
                if (jType != null)
                    animDefinition.AnimationType = (SpriteAnimationType)Enum.Parse(typeof (SpriteAnimationType), jType.Value<string>(), true);

                var jOffsetArray = jAnimation["origin"] as JArray;
                if (jOffsetArray != null)
                {
                    if (jOffsetArray.Count != 2)
                        throw new InvalidOperationException("Expected 2 value array in animations' origin. (" + animDefinition.Name + ")");

                    animDefinition.Origin = new Vector2(jOffsetArray[0].Value<float>(), jOffsetArray[1].Value<float>());
                }

                var jFrames = jAnimation["frames"].Value<JArray>();
                animDefinition.Frames = new SpriteAnimFrame[jFrames.Count];

                for (int i = 0; i < jFrames.Count; i++)
                {
                    var jFrame = jFrames[i].Value<JArray>();
                    var animFrame = new SpriteAnimFrame();

                    int x = jFrame[0].Value<int>();
                    int y = jFrame[1].Value<int>();
                    int w = jFrame[2].Value<int>();
                    int h = jFrame[3].Value<int>();
                    animFrame.SubRectangle = new Rectangle(x, y, w, h);

                    if (jFrame.Count > 4)
                        animFrame.WaitTime = jFrame[4].Value<float>();

                    animDefinition.Frames[i] = animFrame;
                }

                if (animDefinition.Frames.Length == 0)
                    Console.Error.WriteLine("Warning: Sprite definition animation contains no frames! (" + spritePath + ", " + animDefinition.Name + ")");

                definition.AnimationDefinitions.Add(animDefinition.Name, animDefinition);
            }

            if (!definition.AnimationDefinitions.ContainsKey("idle"))
                throw new InvalidOperationException("Error: Sprite definition animation does not contain an idle frame!");

            return definition;
        }
Пример #8
0
        public static SpriteDefinition LoadSpriteDefinition(string spritePath)
        {
            spritePath = Utility.GetContentDir("sprites/" + spritePath);

            if (!File.Exists(spritePath))
            {
                return(null);
            }

            var    definition     = new SpriteDefinition();
            string jsonDefinition = File.ReadAllText(spritePath);
            var    jDefinition    = JsonConvert.DeserializeObject <JToken>(Utility.JsonRemoveComments(jsonDefinition));

            definition.DefaultAnimationFPS = jDefinition["defaultFps"].Value <float>();
            definition.Scale = jDefinition["scale"].Value <float>();
            definition.AnimationDefinitions = new Dictionary <string, SpriteAnimationDefinition>();

            // Add animations
            var jAnimations = jDefinition["animations"].Value <JArray>();

            foreach (JObject jAnimation in jAnimations)
            {
                var animDefinition = new SpriteAnimationDefinition();

                animDefinition.Name = jAnimation["name"].Value <string>();
                animDefinition.FPS  = jAnimation["fps"] != null ? jAnimation["fps"].Value <float>() : definition.DefaultAnimationFPS;

                var jType = jAnimation["type"];
                if (jType != null)
                {
                    animDefinition.AnimationType = (SpriteAnimationType)Enum.Parse(typeof(SpriteAnimationType), jType.Value <string>(), true);
                }

                var jOffsetArray = jAnimation["origin"] as JArray;
                if (jOffsetArray != null)
                {
                    if (jOffsetArray.Count != 2)
                    {
                        throw new InvalidOperationException("Expected 2 value array in animations' origin. (" + animDefinition.Name + ")");
                    }

                    animDefinition.Origin = new Vector2(jOffsetArray[0].Value <float>(), jOffsetArray[1].Value <float>());
                }

                var jFrames = jAnimation["frames"].Value <JArray>();
                animDefinition.Frames = new SpriteAnimFrame[jFrames.Count];

                for (int i = 0; i < jFrames.Count; i++)
                {
                    var jFrame    = jFrames[i].Value <JArray>();
                    var animFrame = new SpriteAnimFrame();

                    int x = jFrame[0].Value <int>();
                    int y = jFrame[1].Value <int>();
                    int w = jFrame[2].Value <int>();
                    int h = jFrame[3].Value <int>();
                    animFrame.SubRectangle = new Rectangle(x, y, w, h);

                    if (jFrame.Count > 4)
                    {
                        animFrame.WaitTime = jFrame[4].Value <float>();
                    }

                    animDefinition.Frames[i] = animFrame;
                }

                if (animDefinition.Frames.Length == 0)
                {
                    Console.Error.WriteLine("Warning: Sprite definition animation contains no frames! (" + spritePath + ", " + animDefinition.Name + ")");
                }

                definition.AnimationDefinitions.Add(animDefinition.Name, animDefinition);
            }

            if (!definition.AnimationDefinitions.ContainsKey("idle"))
            {
                throw new InvalidOperationException("Error: Sprite definition animation does not contain an idle frame!");
            }

            return(definition);
        }