diff --git a/spine-starling/spine-starling-example/src/GoblinsExample.as b/spine-starling/spine-starling-example/src/GoblinsExample.as
index 52762ca7d..34b386c43 100644
--- a/spine-starling/spine-starling-example/src/GoblinsExample.as
+++ b/spine-starling/spine-starling-example/src/GoblinsExample.as
@@ -1,14 +1,13 @@
package {
-import spine.Event;
import spine.SkeletonData;
import spine.SkeletonJson;
-import spine.animation.AnimationStateData;
import spine.atlas.Atlas;
import spine.attachments.AtlasAttachmentLoader;
-import spine.starling.StarlingTextureLoader;
+import spine.attachments.AttachmentLoader;
import spine.starling.SkeletonAnimation;
import spine.starling.StarlingAtlasAttachmentLoader;
+import spine.starling.StarlingTextureLoader;
import starling.core.Starling;
import starling.display.Sprite;
@@ -19,21 +18,37 @@ import starling.textures.Texture;
import starling.textures.TextureAtlas;
public class GoblinsExample extends Sprite {
- [Embed(source = "goblins-ffd.atlas", mimeType = "application/octet-stream")]
- static public const SpineboyAtlasFile:Class;
-
- [Embed(source = "goblins-ffd.png")]
- static public const SpineboyAtlasTexture:Class;
-
[Embed(source = "goblins-ffd.json", mimeType = "application/octet-stream")]
- static public const SpineboyJson:Class;
+ static public const GoblinsJson:Class;
+
+ [Embed(source = "goblins-ffd.atlas", mimeType = "application/octet-stream")]
+ static public const GoblinsAtlas:Class;
+
+ [Embed(source = "goblins-ffd.png")]
+ static public const GoblinsAtlasTexture:Class;
+
+ [Embed(source = "goblins-ffd-starling.xml", mimeType = "application/octet-stream")]
+ static public const GoblinsStarlingAtlas:Class;
+
+ [Embed(source = "goblins-ffd-starling.png")]
+ static public const GoblinsStarlingAtlasTexture:Class;
private var skeleton:SkeletonAnimation;
public function GoblinsExample () {
- var atlas:Atlas = new Atlas(new SpineboyAtlasFile(), new StarlingTextureLoader(new SpineboyAtlasTexture()));
- var json:SkeletonJson = new SkeletonJson(new AtlasAttachmentLoader(atlas));
- var skeletonData:SkeletonData = json.readSkeletonData(new SpineboyJson());
+ var attachmentLoader:AttachmentLoader;
+ if (Main.useStarlingAtlas) {
+ var texture:Texture = Texture.fromBitmap(new GoblinsStarlingAtlasTexture());
+ var xml:XML = XML(new GoblinsStarlingAtlas());
+ var starlingAtlas:TextureAtlas = new TextureAtlas(texture, xml);
+ attachmentLoader = new StarlingAtlasAttachmentLoader(starlingAtlas);
+ } else {
+ var spineAtlas:Atlas = new Atlas(new GoblinsAtlas(), new StarlingTextureLoader(new GoblinsAtlasTexture()));
+ attachmentLoader = new AtlasAttachmentLoader(spineAtlas);
+ }
+
+ var json:SkeletonJson = new SkeletonJson(attachmentLoader);
+ var skeletonData:SkeletonData = json.readSkeletonData(new GoblinsJson());
skeleton = new SkeletonAnimation(skeletonData, true);
skeleton.x = 320;
diff --git a/spine-starling/spine-starling-example/src/Main.as b/spine-starling/spine-starling-example/src/Main.as
index e9266053d..cdd007183 100644
--- a/spine-starling/spine-starling-example/src/Main.as
+++ b/spine-starling/spine-starling-example/src/Main.as
@@ -8,12 +8,13 @@ import starling.core.Starling;
[SWF(width = "640", height = "480", frameRate = "60", backgroundColor = "#dddddd")]
public class Main extends Sprite {
private var _starling:Starling;
+ static public var useStarlingAtlas:Boolean;
public function Main () {
var example:Class;
- //example = AtlasExample;
- //example = StarlingAtlasExample;
+ //example = SpineboyExample;
example = GoblinsExample;
+ useStarlingAtlas = true;
_starling = new Starling(example, stage);
_starling.enableErrorChecking = true;
diff --git a/spine-starling/spine-starling-example/src/AtlasExample.as b/spine-starling/spine-starling-example/src/SpineboyExample.as
similarity index 64%
rename from spine-starling/spine-starling-example/src/AtlasExample.as
rename to spine-starling/spine-starling-example/src/SpineboyExample.as
index af0aaa342..514f45e2e 100644
--- a/spine-starling/spine-starling-example/src/AtlasExample.as
+++ b/spine-starling/spine-starling-example/src/SpineboyExample.as
@@ -1,14 +1,14 @@
package {
-import flash.display.Bitmap;
-
import spine.Event;
import spine.SkeletonData;
import spine.SkeletonJson;
import spine.animation.AnimationStateData;
import spine.atlas.Atlas;
import spine.attachments.AtlasAttachmentLoader;
+import spine.attachments.AttachmentLoader;
import spine.starling.SkeletonAnimation;
+import spine.starling.StarlingAtlasAttachmentLoader;
import spine.starling.StarlingTextureLoader;
import starling.core.Starling;
@@ -17,28 +17,46 @@ import starling.events.Touch;
import starling.events.TouchEvent;
import starling.events.TouchPhase;
import starling.textures.Texture;
+import starling.textures.TextureAtlas;
+
+public class SpineboyExample extends Sprite {
+ [Embed(source = "spineboy.json", mimeType = "application/octet-stream")]
+ static public const SpineboyJson:Class;
-public class AtlasExample extends Sprite {
[Embed(source = "spineboy.atlas", mimeType = "application/octet-stream")]
- static public const SpineboyAtlasFile:Class;
+ static public const SpineboyAtlas:Class;
[Embed(source = "spineboy.png")]
static public const SpineboyAtlasTexture:Class;
- [Embed(source = "spineboy.json", mimeType = "application/octet-stream")]
- static public const SpineboyJson:Class;
+ [Embed(source = "spineboy-starling.xml", mimeType = "application/octet-stream")]
+ static public const SpineboyStarlingAtlas:Class;
+
+ [Embed(source = "spineboy-starling.png")]
+ static public const SpineboyStarlingAtlasTexture:Class;
private var skeleton:SkeletonAnimation;
- public function AtlasExample () {
- var atlas:Atlas = new Atlas(new SpineboyAtlasFile(), new StarlingTextureLoader(new SpineboyAtlasTexture()));
- var json:SkeletonJson = new SkeletonJson(new AtlasAttachmentLoader(atlas));
+ public function SpineboyExample () {
+ var attachmentLoader:AttachmentLoader;
+ if (Main.useStarlingAtlas) {
+ var texture:Texture = Texture.fromBitmap(new SpineboyAtlasTexture());
+ var xml:XML = XML(new SpineboyStarlingAtlas());
+ var starlingAtlas:TextureAtlas = new TextureAtlas(texture, xml);
+ attachmentLoader = new StarlingAtlasAttachmentLoader(starlingAtlas);
+ } else {
+ var spineAtlas:Atlas = new Atlas(new SpineboyAtlas(), new StarlingTextureLoader(new SpineboyAtlasTexture()));
+ attachmentLoader = new AtlasAttachmentLoader(spineAtlas);
+ }
+
+ var json:SkeletonJson = new SkeletonJson(attachmentLoader);
json.scale = 0.6;
var skeletonData:SkeletonData = json.readSkeletonData(new SpineboyJson());
var stateData:AnimationStateData = new AnimationStateData(skeletonData);
- stateData.defaultMix = 0.2;
- stateData.setMixByName("jump", "run", 0.3);
+ stateData.setMixByName("run", "jump", 0.2);
+ stateData.setMixByName("jump", "run", 0.4);
+ stateData.setMixByName("jump", "jump", 0.2);
skeleton = new SkeletonAnimation(skeletonData, false, stateData);
skeleton.x = 320;
@@ -58,7 +76,7 @@ public class AtlasExample extends Sprite {
+ event.data.name + ": " + event.intValue + ", " + event.floatValue + ", " + event.stringValue);
});
- skeleton.state.setAnimationByName(0, "walk", true);
+ skeleton.state.setAnimationByName(0, "run", true);
skeleton.state.addAnimationByName(0, "jump", false, 3);
skeleton.state.addAnimationByName(0, "run", true, 0);
diff --git a/spine-starling/spine-starling-example/src/StarlingAtlasExample.as b/spine-starling/spine-starling-example/src/StarlingAtlasExample.as
deleted file mode 100644
index 41d7a4505..000000000
--- a/spine-starling/spine-starling-example/src/StarlingAtlasExample.as
+++ /dev/null
@@ -1,79 +0,0 @@
-package {
-
-import spine.Event;
-import spine.SkeletonData;
-import spine.SkeletonJson;
-import spine.animation.AnimationStateData;
-import spine.starling.SkeletonAnimation;
-import spine.starling.StarlingAtlasAttachmentLoader;
-
-import starling.core.Starling;
-import starling.display.Sprite;
-import starling.events.Touch;
-import starling.events.TouchEvent;
-import starling.events.TouchPhase;
-import starling.textures.Texture;
-import starling.textures.TextureAtlas;
-
-public class StarlingAtlasExample extends Sprite {
- [Embed(source = "spineboy-starling.xml", mimeType = "application/octet-stream")]
- static public const SpineboyAtlasXml:Class;
-
- [Embed(source = "spineboy-starling.png")]
- static public const SpineboyAtlasTexture:Class;
-
- [Embed(source = "spineboy-starling.json", mimeType = "application/octet-stream")]
- static public const SpineboyJson:Class;
-
- private var skeleton:SkeletonAnimation;
-
- public function StarlingAtlasExample () {
- var texture:Texture = Texture.fromBitmap(new SpineboyAtlasTexture());
- var xml:XML = XML(new SpineboyAtlasXml());
- var atlas:TextureAtlas = new TextureAtlas(texture, xml);
-
- var json:SkeletonJson = new SkeletonJson(new StarlingAtlasAttachmentLoader(atlas));
- var skeletonData:SkeletonData = json.readSkeletonData(new SpineboyJson());
-
- var stateData:AnimationStateData = new AnimationStateData(skeletonData);
- stateData.setMixByName("walk", "jump", 0.2);
- stateData.setMixByName("jump", "walk", 0.4);
- stateData.setMixByName("jump", "jump", 0.2);
-
- skeleton = new SkeletonAnimation(skeletonData, false, stateData);
- skeleton.x = 320;
- skeleton.y = 420;
-
- skeleton.state.onStart.add(function (trackIndex:int) : void {
- trace(trackIndex + " start: " + skeleton.state.getCurrent(trackIndex));
- });
- skeleton.state.onEnd.add(function (trackIndex:int) : void {
- trace(trackIndex + " end: " + skeleton.state.getCurrent(trackIndex));
- });
- skeleton.state.onComplete.add(function (trackIndex:int, count:int) : void {
- trace(trackIndex + " complete: " + skeleton.state.getCurrent(trackIndex) + ", " + count);
- });
- skeleton.state.onEvent.add(function (trackIndex:int, event:Event) : void {
- trace(trackIndex + " event: " + skeleton.state.getCurrent(trackIndex) + ", "
- + event.data.name + ": " + event.intValue + ", " + event.floatValue + ", " + event.stringValue);
- });
-
- skeleton.state.setAnimationByName(0, "walk", true);
- skeleton.state.addAnimationByName(0, "jump", false, 3);
- skeleton.state.addAnimationByName(0, "walk", true, 0);
-
- addChild(skeleton);
- Starling.juggler.add(skeleton);
-
- addEventListener(TouchEvent.TOUCH, onClick);
- }
-
- private function onClick (event:TouchEvent) : void {
- var touch:Touch = event.getTouch(this);
- if (touch && touch.phase == TouchPhase.BEGAN) {
- skeleton.state.setAnimationByName(0, "jump", false);
- skeleton.state.addAnimationByName(0, "walk", true, 0);
- }
- }
-}
-}
diff --git a/spine-starling/spine-starling-example/src/goblins-ffd-starling.png b/spine-starling/spine-starling-example/src/goblins-ffd-starling.png
new file mode 100644
index 000000000..d2e037f46
Binary files /dev/null and b/spine-starling/spine-starling-example/src/goblins-ffd-starling.png differ
diff --git a/spine-starling/spine-starling-example/src/goblins-ffd-starling.xml b/spine-starling/spine-starling-example/src/goblins-ffd-starling.xml
new file mode 100644
index 000000000..1d3f676a0
--- /dev/null
+++ b/spine-starling/spine-starling-example/src/goblins-ffd-starling.xml
@@ -0,0 +1,46 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/spine-starling/spine-starling-example/src/spineboy-starling.xml b/spine-starling/spine-starling-example/src/spineboy-starling.xml
index ce9a1ae12..3025fa60c 100644
--- a/spine-starling/spine-starling-example/src/spineboy-starling.xml
+++ b/spine-starling/spine-starling-example/src/spineboy-starling.xml
@@ -1,28 +1,32 @@
-
-
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/spine-starling/spine-starling-example/src/spineboy.png b/spine-starling/spine-starling-example/src/spineboy.png
index dce2fe3e2..6c17e1786 100644
Binary files a/spine-starling/spine-starling-example/src/spineboy.png and b/spine-starling/spine-starling-example/src/spineboy.png differ
diff --git a/spine-starling/spine-starling/src/spine/starling/StarlingAtlasAttachmentLoader.as b/spine-starling/spine-starling/src/spine/starling/StarlingAtlasAttachmentLoader.as
index ebfbc3e51..33e0bb6ff 100644
--- a/spine-starling/spine-starling/src/spine/starling/StarlingAtlasAttachmentLoader.as
+++ b/spine-starling/spine-starling/src/spine/starling/StarlingAtlasAttachmentLoader.as
@@ -66,9 +66,24 @@ public class StarlingAtlasAttachmentLoader implements AttachmentLoader {
attachment.regionHeight = texture.height;
attachment.regionOriginalWidth = frame ? frame.width : texture.width;
attachment.regionOriginalHeight = frame ? frame.height : texture.height;
+ var subTexture:SubTexture = texture as SubTexture;
+ if (subTexture) {
+ var root:Texture = subTexture.root;
+ var rectRegion:Rectangle = atlas.getRegion(path);
+ attachment.regionU = rectRegion.x / root.width;
+ attachment.regionV = rectRegion.y / root.height;
+ attachment.regionU2 = (rectRegion.x + subTexture.width) / root.width;
+ attachment.regionV2 = (rectRegion.y + subTexture.height) / root.height;
+ attachment.setUVs(attachment.regionU, attachment.regionV, attachment.regionU2, attachment.regionV2, atlas.getRotation(path));
+ } else {
+ attachment.regionU = 0;
+ attachment.regionV = 1;
+ attachment.regionU2 = 1;
+ attachment.regionV2 = 0;
+ }
return attachment;
}
-
+
public function newMeshAttachment (skin:Skin, name:String, path:String) : MeshAttachment {
var texture:Texture = atlas.getTexture(path);
if (texture == null)
@@ -77,12 +92,12 @@ public class StarlingAtlasAttachmentLoader implements AttachmentLoader {
attachment.rendererObject = new SkeletonImage(Texture.fromTexture(texture)); // Discard frame.
var subTexture:SubTexture = texture as SubTexture;
if (subTexture) {
- var matrix:Matrix = subTexture.transformationMatrix;
var root:Texture = subTexture.root;
- attachment.regionU = matrix.tx / root.width;
- attachment.regionV = matrix.ty / root.height;
- attachment.regionU2 = (matrix.tx + subTexture.width) / root.width;
- attachment.regionV2 = (matrix.tx + subTexture.height) / root.height;
+ var rectRegion:Rectangle = atlas.getRegion(path);
+ attachment.regionU = rectRegion.x / root.width;
+ attachment.regionV = rectRegion.y / root.height;
+ attachment.regionU2 = (rectRegion.x + subTexture.width) / root.width;
+ attachment.regionV2 = (rectRegion.y + subTexture.height) / root.height;
} else {
attachment.regionU = 0;
attachment.regionV = 1;
@@ -107,12 +122,12 @@ public class StarlingAtlasAttachmentLoader implements AttachmentLoader {
attachment.rendererObject = new SkeletonImage(Texture.fromTexture(texture)); // Discard frame.
var subTexture:SubTexture = texture as SubTexture;
if (subTexture) {
- var matrix:Matrix = subTexture.transformationMatrix;
var root:Texture = subTexture.root;
- attachment.regionU = matrix.tx / root.width;
- attachment.regionV = matrix.ty / root.height;
- attachment.regionU2 = (matrix.tx + subTexture.width) / root.width;
- attachment.regionV2 = (matrix.tx + subTexture.height) / root.height;
+ var rectRegion:Rectangle = atlas.getRegion(path);
+ attachment.regionU = rectRegion.x / root.width;
+ attachment.regionV = rectRegion.y / root.height;
+ attachment.regionU2 = (rectRegion.x + subTexture.width) / root.width;
+ attachment.regionV2 = (rectRegion.y + subTexture.height) / root.height;
} else {
attachment.regionU = 0;
attachment.regionV = 1;