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); }
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; }
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); }
/// <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; }
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); }
public AnimationFrame(AsepriteFrame frame, int duration) { Frame = frame; Duration = duration; }
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); }