diff --git a/spine-as3/spine-as3-example/lib/spine-as3.swc b/spine-as3/spine-as3-example/lib/spine-as3.swc index e2ab7d151..e8347dd96 100644 Binary files a/spine-as3/spine-as3-example/lib/spine-as3.swc and b/spine-as3/spine-as3-example/lib/spine-as3.swc differ diff --git a/spine-as3/spine-as3/src/spine/SkeletonJson.as b/spine-as3/spine-as3/src/spine/SkeletonJson.as index 49128bd18..d3c887479 100644 --- a/spine-as3/spine-as3/src/spine/SkeletonJson.as +++ b/spine-as3/spine-as3/src/spine/SkeletonJson.as @@ -254,9 +254,9 @@ package spine { } } - if (skinMap["transform"]) { + if (skinMap["transform"]) { for (ii = 0; ii < skinMap["transform"].length; ii++) { - var constraint : ConstraintData = skeletonData.findIkConstraint(skinMap["transform"][ii]); + var constraint : ConstraintData = skeletonData.findTransformConstraint(skinMap["transform"][ii]); if (constraint == null) throw new Error("Skin transform constraint not found: " + skinMap["transform"][ii]); skin.constraints.push(constraint); } @@ -264,7 +264,7 @@ package spine { if (skinMap["path"]) { for (ii = 0; ii < skinMap["path"].length; ii++) { - var constraint : ConstraintData = skeletonData.findIkConstraint(skinMap["path"][ii]); + var constraint : ConstraintData = skeletonData.findPathConstraint(skinMap["path"][ii]); if (constraint == null) throw new Error("Skin path constraint not found: " + skinMap["path"][ii]); skin.constraints.push(constraint); } diff --git a/spine-starling/spine-starling-example/lib/spine-as3.swc b/spine-starling/spine-starling-example/lib/spine-as3.swc index e2ab7d151..7d56d4277 100644 Binary files a/spine-starling/spine-starling-example/lib/spine-as3.swc and b/spine-starling/spine-starling-example/lib/spine-as3.swc differ diff --git a/spine-starling/spine-starling-example/src/spine/examples/CoinExample.as b/spine-starling/spine-starling-example/src/spine/examples/CoinExample.as index a10a96f01..1c815dbff 100644 --- a/spine-starling/spine-starling-example/src/spine/examples/CoinExample.as +++ b/spine-starling/spine-starling-example/src/spine/examples/CoinExample.as @@ -89,7 +89,7 @@ package spine.examples { if (touch && touch.phase == TouchPhase.BEGAN) { var parent : DisplayObjectContainer = this.parent; this.removeFromParent(true); - parent.addChild(new SpineboyExample()); + parent.addChild(new MixAndMatchExample()); } } } diff --git a/spine-starling/spine-starling-example/src/spine/examples/Main.as b/spine-starling/spine-starling-example/src/spine/examples/Main.as index ac7a3a5d0..04b68f553 100644 --- a/spine-starling/spine-starling-example/src/spine/examples/Main.as +++ b/spine-starling/spine-starling-example/src/spine/examples/Main.as @@ -37,7 +37,7 @@ package spine.examples { private var _starling : Starling; public function Main() { - _starling = new Starling(GoblinsExample, stage); + _starling = new Starling(MixAndMatchExample, stage); _starling.enableErrorChecking = true; _starling.showStats = true; _starling.skipUnchangedFrames = false; diff --git a/spine-starling/spine-starling-example/src/spine/examples/MixAndMatchExample.as b/spine-starling/spine-starling-example/src/spine/examples/MixAndMatchExample.as new file mode 100644 index 000000000..71d83e8dc --- /dev/null +++ b/spine-starling/spine-starling-example/src/spine/examples/MixAndMatchExample.as @@ -0,0 +1,110 @@ +/****************************************************************************** + * Spine Runtimes License Agreement + * Last updated May 1, 2019. Replaces all prior versions. + * + * Copyright (c) 2013-2019, Esoteric Software LLC + * + * Integration of the Spine Runtimes into software or otherwise creating + * derivative works of the Spine Runtimes is permitted under the terms and + * conditions of Section 2 of the Spine Editor License Agreement: + * http://esotericsoftware.com/spine-editor-license + * + * Otherwise, it is permitted to integrate the Spine Runtimes into software + * or otherwise create derivative works of the Spine Runtimes (collectively, + * "Products"), provided that each user of the Products must obtain their own + * Spine Editor license and redistribution of the Products in any form must + * include this license and copyright notice. + * + * THIS SOFTWARE IS PROVIDED BY ESOTERIC SOFTWARE LLC "AS IS" AND ANY EXPRESS + * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN + * NO EVENT SHALL ESOTERIC SOFTWARE LLC BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, BUSINESS + * INTERRUPTION, OR LOSS OF USE, DATA, OR PROFITS) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, + * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + *****************************************************************************/ + +package spine.examples { + import spine.Skin; + import starling.display.DisplayObjectContainer; + import starling.events.Touch; + import starling.events.TouchPhase; + import starling.core.Starling; + import starling.events.TouchEvent; + import starling.display.Sprite; + + import spine.SkeletonData; + import spine.SkeletonJson; + import spine.attachments.AtlasAttachmentLoader; + import spine.starling.StarlingTextureLoader; + import spine.atlas.Atlas; + import spine.attachments.AttachmentLoader; + import spine.starling.SkeletonAnimation; + + public class MixAndMatchExample extends Sprite { + [Embed(source = "/mix-and-match-pro.json", mimeType = "application/octet-stream")] + static public const MixAndMatchJson : Class; + + [Embed(source = "/mix-and-match.atlas", mimeType = "application/octet-stream")] + static public const MixAndMatchAtlas : Class; + + [Embed(source = "/mix-and-match.png")] + static public const MixAndMatchAtlasTexture : Class; + private var skeleton : SkeletonAnimation; + + public function MixAndMatchExample() { + var attachmentLoader : AttachmentLoader; + var spineAtlas : Atlas = new Atlas(new MixAndMatchAtlas(), new StarlingTextureLoader(new MixAndMatchAtlasTexture())); + attachmentLoader = new AtlasAttachmentLoader(spineAtlas); + + var json : SkeletonJson = new SkeletonJson(attachmentLoader); + json.scale = 0.5; + var skeletonData : SkeletonData = json.readSkeletonData(new MixAndMatchJson()); + + this.x = 400; + this.y = 500; + + skeleton = new SkeletonAnimation(skeletonData); + skeleton.state.setAnimationByName(0, "dance", true); + + // enable two color tinting, which breaks batching between this skeleton + // and other Starling objects. + skeleton.twoColorTint = true; + + // Create a new skin, by mixing and matching other skins + // that fit together. Items making up the girl are individual + // skins. Using the skin API, a new skin is created which is + // a combination of all these individual item skins. + var mixAndMatchSkin : Skin = new Skin("custom-girl"); + mixAndMatchSkin.addSkin(skeletonData.findSkin("skin-base")); + mixAndMatchSkin.addSkin(skeletonData.findSkin("nose/short")); + mixAndMatchSkin.addSkin(skeletonData.findSkin("eyes/eyelids-girly")); + mixAndMatchSkin.addSkin(skeletonData.findSkin("eyes/violet")); + mixAndMatchSkin.addSkin(skeletonData.findSkin("hair/brown")); + mixAndMatchSkin.addSkin(skeletonData.findSkin("clothes/hoodie-orange")); + mixAndMatchSkin.addSkin(skeletonData.findSkin("legs/pants-jeans")); + mixAndMatchSkin.addSkin(skeletonData.findSkin("accessories/bag")); + mixAndMatchSkin.addSkin(skeletonData.findSkin("accessories/hat-red-yellow")); + skeleton.skeleton.skin = mixAndMatchSkin; + + skeleton.skeleton.updateWorldTransform(); + + 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) { + var parent : DisplayObjectContainer = this.parent; + this.removeFromParent(true); + parent.addChild(new SpineboyExample()); + } + } + } +} diff --git a/spine-starling/spine-starling/lib/spine-as3.swc b/spine-starling/spine-starling/lib/spine-as3.swc index e2ab7d151..7d56d4277 100644 Binary files a/spine-starling/spine-starling/lib/spine-as3.swc and b/spine-starling/spine-starling/lib/spine-as3.swc differ diff --git a/spine-ts/webgl/tests/test-mix-and-match.html b/spine-ts/webgl/tests/test-mix-and-match.html new file mode 100644 index 000000000..4ed5822d4 --- /dev/null +++ b/spine-ts/webgl/tests/test-mix-and-match.html @@ -0,0 +1,118 @@ + + + + +
+ + + + +