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;