~~NOTOC~~
====== SpriterAS ======
---- dataentry extension ----
author_mail : support@treefortress.com Shawn
description : Highly optimized playback of Spriter Animations (SCML) # enter a short description of the extension
lastupdate_dt : 2013-04-12 # the date you created the extension
compatible : v1.3 # the Starling version you tested the extension with
depends : AS3 Signals # if the ext. depends on others, list them here
tags : Spriter, Skeleton, Bones, Animation
homepage_url : https://github.com/treefortress/SpriterAS
download_url : https://github.com/treefortress/SpriterAS/archive/master.zip
----
===== Overview =====
Library for playing back Spriter Animation Files (SCML).
Spriter is a Skeletal animation based tool that was [[http://www.kickstarter.com/projects/539087245/spriter|funded on Kickstarter]] in 2012. It allows you to create smooth 60fps animations, with a very small texture memory footprint.
SpriterAS is a highly optimized plugin for Starling, it can render close to 80 animations on low performance devices such as iPad 1 and iPhone 4, and much higher than that on more powerful devices. Each animations typically consist of 6-8 individual sprites.
On top of standard playback, we've also added a few helper API's to ease your daily development. For more detailed code examples, check out this blog post:
* http://treefortress.com/introducing-spriteras-play-spriter-animations-scml-with-starling/
Or, you can check out some of the online code Example's:
* https://github.com/treefortress/SpriterAS/tree/master/demo/src
====== Dependancies ======
SpriterAS includes the following dependancies:
* AS3 Signals (https://github.com/robertpenner/as3-signals)
====== Basic Usage ======
//Load SCML File that you saved from Spriter
loader = new SpriterLoader();
loader.completed.addOnce(onLoadComplete);
loader.load(["assets/spriter/brawler/brawler.scml"]);
//Playback Animation
function onLoadComplete(loader:SpriterLoader):void {
//Once the file is loader, ask loader for a "SpriterClip"
var brawler:SpriterClip = loader.getSpriterClip("brawler");
brawler.x = 100;
//User SpriterClip to playback your animation!
brawler.play("run");
addChild(brawler);
Starling.juggler.add(brawler);
}
====== Texture Packer Support ======
SpriterAS is built to work with Texture Packer as well. Simply create a standard Starling Atlas, and pass it in to SpriterClip:
var atlas:TextureAtlas = new TextureAtlas(atlasTexture, atlasXml);
//Create AnimationSet.
//We must pass the TexturePacker prefix so the animation can find its textures.
var animation:AnimationSet = new AnimationSet(XML(new OrcScml()), 1, "orc");
//Create the SpriterClip and inject the Atlas.
var orc:SpriterClip = new SpriterClip(animation, atlas);
The various loading techniques are shown here:
https://github.com/treefortress/SpriterAS/blob/master/demo/src/ExampleLoading.as
====== Dynamically Adjust Playback Speed ======
You can easily tweak the playback speed of your animations in realtime:
brawler.playbackSpeed = .5;
====== Add callback's for specific events ======
You can manually add a callback for a specific time in the animation, this will respect the current playback speed.
//Add callback @ 400ms
archer.addCallback(onArrowFired, 400)
====== Swap Body Parts ======
You can manually swap the pieces for any body-part. This lets you easily manipulate your animations while they're running. For example, you can make someone blink, or degrade their armor as they get damaged.
//Blink!
brawler.swapPiece("eyes_open", "eyes_closed");
setTimeout(function(){
brawler.unswapPiece("eyes_open");
}, 50)
//If we fall below 50% health, swap our head sprite for one with damage. It will continue to animate as normal.
if(brawler.health < .5){
brawler.swapPiece("face", "face_hurt");
} else {
brawler.unswapPiece("face");
}
====== Tint entire sprite ======
//Flash Red
brawler.setColor(0xFF0000);
====== Isolate Body Parts and control externally ======
//Decapitation!
var image:Image = brawler.getImage("brawler_head");
brawler.excludePiece(image);
//Position this anywhere we like, it will no longer be animated.
image.x = 100;
image.y = 100;
//Return it to the animation
brawler.includePiece(image);
====== Map External Sprites to Specific Body Parts ======
//Create a standard Starling Particle Emitter
emitterFront = new PDParticleSystem(particleXml, particleTex);
addChild(emitterFront);
//Each frame, update the particle emitter so it appears to follow the character's hand
public function tick(time:Number):void {
var frontHand:Image = mage.getImage("mage_0000_handfront");
emitterFront.emitterX = mage.x + frontHand.x;
emitterFront.emitterY = mage.y + frontHand.y;
}
===== Changelog =====
* //2013/04/12 16:55//: First public version
===== Complete Example =====
Below is a full example showing basic Animations and Touch interaction.
This is part of the DEMO project found here:
https://github.com/treefortress/SpriterAS/blob/master/demo/src/
package
{
import starling.core.Starling;
import starling.display.Sprite;
import starling.events.Touch;
import starling.events.TouchEvent;
import starling.events.TouchPhase;
import treefortress.spriter.SpriterClip;
import treefortress.spriter.SpriterLoader;
public class ExampleBasic extends Sprite
{
protected var brawler:SpriterClip;
protected var spriterLoader:SpriterLoader;
protected var orc:SpriterClip;
public function ExampleBasic(){
//We can scale the PNG's to any size we like, allowing you to start with Hi-Res assets, and scale down to lower powered devices.
//In this case, the source sprites are Retina-Size, so we will downscale them by 50%
var textureScale:Number = .5;
//Use the SpriterLoader class to load individual SCML files, generate a TextureAtlas, and create AnimationSets, all at once.
spriterLoader = new SpriterLoader();
spriterLoader.completed.addOnce(onSpriterLoaderComplete);
spriterLoader.load(["assets/spriter/orc/orc.scml", "assets/spriter/brawler/brawler.scml"], textureScale);
}
protected function onSpriterLoaderComplete(loader:SpriterLoader):void {
//Add Orc 1
orc = spriterLoader.getSpriterClip("orc");
orc.play("run", 0);
orc.scaleX = -1;
orc.y = 50;
orc.x = 300;
orc.playbackSpeed = .5;
addChild(orc);
//For performance reasons, SpriterClips will not update themselves, they must externally ticked each frame.
//The Starling Juggler is a simple way to do that.
Starling.juggler.add(orc);
//Add a "Brawler"
brawler = spriterLoader.getSpriterClip("brawler");
brawler.setPosition(500, 50);
brawler.play("idle");
addChild(brawler);
Starling.juggler.add(brawler);
//Add Touch Support to each Sprite
orc.touchable = true;
orc.addEventListener(TouchEvent.TOUCH, onCharacterTouched);
brawler.touchable = true;
brawler.addEventListener(TouchEvent.TOUCH, onCharacterTouched);
}
protected function onCharacterTouched(event:TouchEvent):void {
var touch:Touch = event.touches[0];
if(touch.phase == TouchPhase.ENDED){
(event.currentTarget as SpriterClip).play("attack");
(event.currentTarget as SpriterClip).animationComplete.addOnce(function(clip:SpriterClip){
clip.play((clip == brawler)? "idle" : "run");
});
}
}
}
}
===== User Comments =====
//Feel free to edit this part of the page!//