Пример #1
0
        public void LoadContent(List <Rectangle> sources, Rectangle destinationRectangle, int width, int height, float?randomness = null)
        {
            isActive      = true;
            frames        = new List <AnimationFrame>();
            frameDuration = 100;
            elapsedTime   = 0;

            foreach (Rectangle source in sources)
            {
                AsepriteFrame  aseFrame = new AsepriteFrame(source.X, source.Y, source.Width, source.Height);
                AnimationFrame frame    = new AnimationFrame(aseFrame, 100);
                frames.Add(frame);
            }
            currentFrame = 0;
            this.destinationRectangle = destinationRectangle;
            sourceRectangle           = new Rectangle(frames[currentFrame].Frame.X, frames[currentFrame].Frame.Y, width, height);

            if (randomness.HasValue)
            {
                isAnimating     = false;
                this.randomness = randomness.Value;
            }
            else
            {
                isAnimating = true;
            }
        }
        public SpriteMetaData[] GetSpriteSheet(SpriteAlignment spriteAlignment, float customX, float customY)
        {
            SpriteMetaData[] metaData = new SpriteMetaData[frames.Count];

            for (int i = 0; i < frames.Count; i++)
            {
                AsepriteFrame  frame  = frames[i];
                SpriteMetaData sprite = new SpriteMetaData();

                // sprite alignment
                sprite.alignment = (int)spriteAlignment;
                if (spriteAlignment == SpriteAlignment.Custom)
                {
                    sprite.pivot.x = customX;
                    sprite.pivot.y = customY;
                }

                sprite.name = frame.filename.Replace(".ase", "");
                sprite.rect = new Rect(frame.x, frame.y, frame.width, frame.height);

                metaData[i] = sprite;
            }

            return(metaData);
        }
Пример #3
0
    public void PlayAnim(int animIndex)
    {
        //Check that the current anim isn't already playing. If it is, do nothing. This will prevent the anim from jamming when using if/else statements to set animation states.
        AsepriteAnim desiredAnim = asepriteAnim.meta.frameTags[animIndex];

        if (desiredAnim != CurrentAnim)
        {
            CurrentAnim  = desiredAnim;
            CurrentFrame = asepriteAnim.frames[CurrentAnim.from];
            isPlaying    = true;
        }
        return;
    }
Пример #4
0
    public void PlayAnim(string animName)
    {
        //Check that the current anim isn't already playing. If it is, do nothing. This will prevent the anim from jamming when using if/else statements to set animation states.
        AsepriteAnim desiredAnim = asepriteAnim.meta.frameTags.Where(ft => ft.name == animName).FirstOrDefault();

        if (desiredAnim != CurrentAnim)
        {
            CurrentAnim  = desiredAnim;
            CurrentFrame = asepriteAnim.frames[CurrentAnim.from];
            isPlaying    = true;
        }
        return;
    }
        // ================================================================================
        //  public static methods
        // --------------------------------------------------------------------------------

        public static AsepriteAnimationInfo GetAnimationInfo(JSONObject root)
        {
            AsepriteAnimationInfo importedInfos = new AsepriteAnimationInfo();

            // meta animations

            var meta = root["meta"].Obj;

            var size = meta["size"].Obj;

            importedInfos.width  = (int)size["w"].Number;
            importedInfos.height = (int)size["h"].Number;

            var frameTags = meta["frameTags"].Array;

            foreach (var item in frameTags)
            {
                JSONObject        frameTag = item.Obj;
                AsepriteAnimation anim     = new AsepriteAnimation();
                anim.name = frameTag["name"].Str;
                anim.from = (int)(frameTag["from"].Number);
                anim.to   = (int)(frameTag["to"].Number);

                importedInfos.animations.Add(anim);
            }

            // sprites

            var list = root["frames"].Array;

            foreach (var item in list)
            {
                AsepriteFrame frame = new AsepriteFrame();
                frame.filename = item.Obj["filename"].Str;

                var frameValues = item.Obj["frame"].Obj;
                frame.width  = (int)frameValues["w"].Number;
                frame.height = (int)frameValues["h"].Number;
                frame.x      = (int)frameValues["x"].Number;
                frame.y      = importedInfos.height - (int)frameValues["y"].Number - frame.height;            // unity has a different coord system

                frame.duration = (int)item.Obj["duration"].Number;

                importedInfos.frames.Add(frame);
            }

            importedInfos.CalculateTimings();

            return(importedInfos);
        }
Пример #6
0
        /// <summary>
        ///     Given an <see cref="AsepriteFrame"/> instance, combines all Cels
        ///     of the frame into a single array of packed color values representing
        ///     all pixels within the frame.
        /// </summary>
        /// <param name="frame">
        ///     The <see cref="AsepriteFrame"/> instance to flatten.
        /// </param>
        /// <param name="onlyVisibleLayers">
        ///     A value indicating if only visible layers should be processed.
        /// </param>
        /// <returns></returns>
        private uint[] FlattenFrame(AsepriteFrame frame)
        {
            uint[] framePixels = new uint[_document.Header.Width * _document.Header.Height];

            for (int c = 0; c < frame.Cels.Count; c++)
            {
                AsepriteCelChunk cel = frame.Cels[c];

                if (cel.LinkedCel != null)
                {
                    cel = cel.LinkedCel;
                }

                AsepriteLayerChunk layer = _document.Layers[cel.LayerIndex];

                if ((layer.Flags & AsepriteLayerFlags.Visible) != 0 || !Options.OnlyVisibleLayers)
                {
                    byte opacity = Combine32.MUL_UN8(cel.Opacity, layer.Opacity);

                    for (int p = 0; p < cel.Pixels.Length; p++)
                    {
                        int x     = (p % cel.Width) + cel.X;
                        int y     = (p / cel.Width) + cel.Y;
                        int index = y * _document.Header.Width + x;

                        //  Sometimes a cell can have a negative x and/or y value. This is caused
                        //  by selecting an area within aseprite and then moving a portion of the
                        //  selected pixels outside the canvas.  We don't care about these pixels
                        //  so if the index is outside the range of the array to store them in
                        //  then we'll just ignore them.
                        if (index < 0 || index >= framePixels.Length)
                        {
                            continue;
                        }

                        uint backdrop = framePixels[index];
                        uint src      = cel.Pixels[p];

                        Func <uint, uint, int, uint> blender = Utils.GetBlendFunction(layer.BlendMode);
                        uint blendedColor = blender.Invoke(backdrop, src, opacity);

                        framePixels[index] = blendedColor;
                    }
                }
            }

            return(framePixels);
        }
		// ================================================================================
		//  public static methods
		// --------------------------------------------------------------------------------

		public static AsepriteAnimationInfo GetAnimationInfo(JSONObject root)
		{
			AsepriteAnimationInfo importedInfos = new AsepriteAnimationInfo();

			// meta animations

			var meta = root["meta"].Obj;

			var size = meta["size"].Obj;
			importedInfos.width = (int)size["w"].Number;
			importedInfos.height = (int)size["h"].Number;

			var frameTags = meta["frameTags"].Array;
			foreach (var item in frameTags)
			{
				JSONObject frameTag = item.Obj;
				AsepriteAnimation anim = new AsepriteAnimation();
				anim.name = frameTag["name"].Str;
				anim.from = (int)(frameTag["from"].Number);
				anim.to = (int)(frameTag["to"].Number);

				importedInfos.animations.Add(anim);
			}

			// sprites

			var list = root["frames"].Array;
			foreach (var item in list)
			{
				AsepriteFrame frame = new AsepriteFrame();
				frame.filename = item.Obj["filename"].Str;

				var frameValues = item.Obj["frame"].Obj;
				frame.width = (int)frameValues["w"].Number;
				frame.height = (int)frameValues["h"].Number;
				frame.x = (int)frameValues["x"].Number;
				frame.y = importedInfos.height - (int)frameValues["y"].Number - frame.height; // unity has a different coord system

				frame.duration = (int)item.Obj["duration"].Number;

				importedInfos.frames.Add(frame);
			}

			importedInfos.CalculateTimings();

			return importedInfos;
		}
Пример #8
0
    void IncrementCurrentAnimFrame()
    {
        //Get current frame index and increment it
        int currentFrameIndex = GetCurrentFrameIndex();

        currentFrameIndex++;

        //Wrap around current animation frames
        if (currentFrameIndex > CurrentAnim.to)
        {
            currentFrameIndex = CurrentAnim.from;
        }

        //Set current frame of animation
        CurrentFrame = asepriteAnim.frames[currentFrameIndex];
        SetSpriteFromFrame(CurrentFrame);
    }
Пример #9
0
 public AnimationFrame(AsepriteFrame frame, int duration)
 {
     Frame    = frame;
     Duration = duration;
 }
Пример #10
0
 void SetSpriteFromFrame(AsepriteFrame frame)
 {
     // TODO: Bonus points if you refactor this to cache the sprites so it isn't regenerating them,
     //       and have them in a static dictionary so i.e. all enemies share one set of objects.
     spriteRenderer.sprite = Sprite.Create(SpriteSheet, new Rect(frame.frame.x, frame.frame.y, frame.frame.w, frame.frame.h), Vector2.zero, 32);
 }