diff --git a/spine-corona/examples/dragon.lua b/spine-corona/examples/dragon.lua index 0e2c468fe..e5eec84a8 100644 --- a/spine-corona/examples/dragon.lua +++ b/spine-corona/examples/dragon.lua @@ -38,4 +38,3 @@ Runtime:addEventListener("enterFrame", function (event) state:apply(skeleton) skeleton:updateWorldTransform() end) - diff --git a/spine-corona/examples/dragon/dragon.atlas b/spine-corona/examples/dragon/dragon.atlas deleted file mode 100644 index 089eba72e..000000000 --- a/spine-corona/examples/dragon/dragon.atlas +++ /dev/null @@ -1,290 +0,0 @@ - -dragon.png -format: RGBA4444 -filter: Nearest,Nearest -repeat: none -L_rear_thigh - rotate: false - xy: 895, 20 - size: 91, 148 - orig: 91, 149 - offset: 0, 0 - index: -1 -L_wing01 - rotate: false - xy: 814, 672 - size: 191, 256 - orig: 191, 256 - offset: 0, 0 - index: -1 -L_wing02 - rotate: false - xy: 714, 189 - size: 179, 269 - orig: 179, 269 - offset: 0, 0 - index: -1 -L_wing03 - rotate: false - xy: 785, 463 - size: 186, 207 - orig: 186, 207 - offset: 0, 0 - index: -1 -L_wing05 - rotate: true - xy: 2, 9 - size: 218, 213 - orig: 218, 213 - offset: 0, 0 - index: -1 -L_wing06 - rotate: false - xy: 2, 229 - size: 192, 331 - orig: 192, 331 - offset: 0, 0 - index: -1 -R_wing01 - rotate: true - xy: 502, 709 - size: 219, 310 - orig: 219, 310 - offset: 0, 0 - index: -1 -R_wing02 - rotate: true - xy: 204, 463 - size: 203, 305 - orig: 203, 305 - offset: 0, 0 - index: -1 -R_wing03 - rotate: false - xy: 511, 460 - size: 272, 247 - orig: 272, 247 - offset: 0, 0 - index: -1 -R_wing05 - rotate: false - xy: 196, 232 - size: 251, 229 - orig: 251, 229 - offset: 0, 0 - index: -1 -R_wing06 - rotate: false - xy: 2, 562 - size: 200, 366 - orig: 200, 366 - offset: 0, 0 - index: -1 -R_wing07 - rotate: true - xy: 449, 258 - size: 200, 263 - orig: 200, 263 - offset: 0, 0 - index: -1 -R_wing08 - rotate: false - xy: 467, 2 - size: 234, 254 - orig: 234, 254 - offset: 0, 0 - index: -1 -R_wing09 - rotate: false - xy: 217, 26 - size: 248, 204 - orig: 248, 204 - offset: 0, 0 - index: -1 -back - rotate: false - xy: 703, 2 - size: 190, 185 - orig: 190, 185 - offset: 0, 0 - index: -1 -chest - rotate: true - xy: 895, 170 - size: 136, 122 - orig: 136, 122 - offset: 0, 0 - index: -1 -front_toeA - rotate: false - xy: 976, 972 - size: 29, 50 - orig: 29, 50 - offset: 0, 0 - index: -1 -head - rotate: false - xy: 204, 668 - size: 296, 260 - orig: 296, 260 - offset: 0, 0 - index: -1 -logo - rotate: false - xy: 2, 930 - size: 897, 92 - orig: 897, 92 - offset: 0, 0 - index: -1 -tail01 - rotate: false - xy: 895, 308 - size: 120, 153 - orig: 120, 153 - offset: 0, 0 - index: -1 -tail03 - rotate: false - xy: 901, 930 - size: 73, 92 - orig: 73, 92 - offset: 0, 0 - index: -1 - -dragon2.png -format: RGBA4444 -filter: Nearest,Nearest -repeat: none -L_front_leg - rotate: true - xy: 391, 141 - size: 84, 57 - orig: 84, 57 - offset: 0, 0 - index: -1 -L_front_thigh - rotate: false - xy: 446, 269 - size: 84, 72 - orig: 84, 72 - offset: 0, 0 - index: -1 -L_rear_leg - rotate: true - xy: 888, 342 - size: 168, 132 - orig: 206, 177 - offset: 19, 20 - index: -1 -L_wing04 - rotate: false - xy: 256, 227 - size: 188, 135 - orig: 188, 135 - offset: 0, 0 - index: -1 -L_wing07 - rotate: false - xy: 2, 109 - size: 159, 255 - orig: 159, 255 - offset: 0, 0 - index: -1 -L_wing08 - rotate: true - xy: 705, 346 - size: 164, 181 - orig: 164, 181 - offset: 0, 0 - index: -1 -L_wing09 - rotate: false - xy: 499, 343 - size: 204, 167 - orig: 204, 167 - offset: 0, 0 - index: -1 -R_front_leg - rotate: false - xy: 273, 34 - size: 101, 89 - orig: 101, 89 - offset: 0, 0 - index: -1 -R_front_thigh - rotate: false - xy: 163, 106 - size: 108, 108 - orig: 108, 108 - offset: 0, 0 - index: -1 -R_rear_leg - rotate: false - xy: 273, 125 - size: 116, 100 - orig: 116, 100 - offset: 0, 0 - index: -1 -R_rear_thigh - rotate: false - xy: 163, 216 - size: 91, 148 - orig: 91, 149 - offset: 0, 0 - index: -1 -R_wing04 - rotate: false - xy: 2, 366 - size: 279, 144 - orig: 279, 144 - offset: 0, 0 - index: -1 -chin - rotate: false - xy: 283, 364 - size: 214, 146 - orig: 214, 146 - offset: 0, 0 - index: -1 -front_toeB - rotate: false - xy: 590, 284 - size: 56, 57 - orig: 56, 57 - offset: 0, 0 - index: -1 -rear-toe - rotate: true - xy: 2, 2 - size: 105, 77 - orig: 109, 77 - offset: 0, 0 - index: -1 -tail02 - rotate: true - xy: 151, 9 - size: 95, 120 - orig: 95, 120 - offset: 0, 0 - index: -1 -tail04 - rotate: false - xy: 532, 270 - size: 56, 71 - orig: 56, 71 - offset: 0, 0 - index: -1 -tail05 - rotate: false - xy: 648, 282 - size: 52, 59 - orig: 52, 59 - offset: 0, 0 - index: -1 -tail06 - rotate: true - xy: 81, 12 - size: 95, 68 - orig: 95, 68 - offset: 0, 0 - index: -1 diff --git a/spine-corona/examples/hero.lua b/spine-corona/examples/hero.lua new file mode 100644 index 000000000..1eeaec864 --- /dev/null +++ b/spine-corona/examples/hero.lua @@ -0,0 +1,39 @@ + +-- This skeleton uses IK for the feet. + +local spine = require "spine-corona.spine" + +local json = spine.SkeletonJson.new() +local skeletonData = json:readSkeletonDataFile("examples/hero/hero.json") + +local skeleton = spine.Skeleton.new(skeletonData) +function skeleton:createImage (attachment) + return display.newImage("examples/hero/images/" .. attachment.name .. ".png") +end +skeleton.group.x = 195 +skeleton.group.y = 385 +skeleton.flipX = false +skeleton.flipY = false +skeleton.debug = true -- Omit or set to false to not draw debug lines on top of the images. +skeleton:setToSetupPose() + +-- AnimationStateData defines crossfade durations between animations. +local stateData = spine.AnimationStateData.new(skeletonData) +-- AnimationState has a queue of animations and can apply them with crossfading. +local state = spine.AnimationState.new(stateData) +--state:setAnimationByName(0, "Idle", true, 0) +state:setAnimationByName(0, "Walk", true, 0) + +local lastTime = 0 +local animationTime = 0 +Runtime:addEventListener("enterFrame", function (event) + -- Compute time in seconds since last frame. + local currentTime = event.time / 1000 + local delta = currentTime - lastTime + lastTime = currentTime + + -- Update the state with the delta time, apply it, and update the world transforms. + state:update(delta) + state:apply(skeleton) + skeleton:updateWorldTransform() +end) diff --git a/spine-corona/examples/hero/hero.json b/spine-corona/examples/hero/hero.json new file mode 100644 index 000000000..f7e5237d5 --- /dev/null +++ b/spine-corona/examples/hero/hero.json @@ -0,0 +1,5 @@ +{"skeleton":{"hash":"/c595Zn6OYuZT0GEQ7y1piry/xk","spine":"Dev","width":319.29,"height":337.01},"bones":[{"name":"root"},{"name":"Hip","parent":"root","y":94.88},{"name":"L_Ground","parent":"root","x":-31.28,"y":0.26},{"name":"LookTarget","parent":"root","x":112.83,"y":218.2},{"name":"R_Ground","parent":"root","x":28.11,"y":0.26},{"name":"L_Ankle","parent":"L_Ground","x":0.26,"y":33.05},{"name":"LookConstraintGoal","parent":"LookTarget","y":-43.82},{"name":"R_Ankle","parent":"R_Ground","y":31.79},{"name":"body","parent":"Hip","length":60.79,"x":4.09,"y":3.17,"rotation":96.39},{"name":"thigh1","parent":"Hip","length":23.94,"x":-17.51,"y":-5.22,"rotation":-107.07},{"name":"thigh2","parent":"Hip","length":23.65,"x":21.85,"y":-5.86,"rotation":-85.46},{"name":"head","parent":"body","length":24.35,"x":74.55,"y":-4.84,"rotation":-92.69},{"name":"mantles","parent":"body","x":48.47,"y":-9,"rotation":-2.25},{"name":"shin1","parent":"thigh1","length":28.23,"x":29.76,"y":-0.91,"rotation":10.26},{"name":"shin2","parent":"thigh2","length":25.35,"x":31.99,"y":2.96,"rotation":-2.25},{"name":"upperarm1","parent":"body","length":19.35,"x":52.49,"y":41.84,"rotation":130.11},{"name":"upperarm2","parent":"body","length":25.98,"x":57.94,"y":-38.93,"rotation":-178.95},{"name":"foot1","parent":"shin1","length":27.07,"x":28.17,"y":-0.48,"rotation":-90.96,"inheritRotation":false},{"name":"foot2","parent":"shin2","length":22.28,"x":25.54,"y":0.27,"rotation":-90.42,"inheritRotation":false},{"name":"forearm1","parent":"upperarm1","length":22.06,"x":23.97,"y":5.16,"rotation":30.56},{"name":"forearm2","parent":"upperarm2","length":15.3,"x":28.74,"y":-0.9,"rotation":6.79},{"name":"hand1","parent":"forearm1","length":28.01,"x":27.54,"y":0.44,"rotation":16.24},{"name":"hand2","parent":"forearm2","length":23.76,"x":22.8,"y":-0.21,"rotation":1.35},{"name":"weapon","parent":"hand2","length":157.4,"x":15.97,"y":1.43,"rotation":77.9}],"ik":[{"name":"L_Leg","bones":["thigh1","shin1"],"target":"L_Ankle","bendPositive":false},{"name":"R_Leg","bones":["thigh2","shin2"],"target":"R_Ankle","bendPositive":false},{"name":"LookConstraint","bones":["head"],"target":"LookConstraintGoal","mix":0}],"slots":[{"name":"upperarm2","bone":"upperarm2","attachment":"upperarm2"},{"name":"sword","bone":"root"},{"name":"hand2","bone":"hand2","attachment":"hand2"},{"name":"weapon","bone":"weapon","attachment":"sword"},{"name":"fingers","bone":"hand2","attachment":"fingers"},{"name":"forearm2","bone":"forearm2","attachment":"forearm2"},{"name":"thigh2","bone":"thigh2","attachment":"thigh2"},{"name":"foot2","bone":"foot2","attachment":"foot2"},{"name":"shin2","bone":"shin2","attachment":"shin2"},{"name":"thigh1","bone":"thigh1","attachment":"thigh1"},{"name":"foot1","bone":"foot1","attachment":"foot1"},{"name":"body","bone":"body","attachment":"body"},{"name":"shin1","bone":"shin1","attachment":"shin1"},{"name":"upperarm1","bone":"upperarm1","attachment":"upperarm1"},{"name":"mantles","bone":"mantles","attachment":"mantles"},{"name":"head","bone":"head","attachment":"head"},{"name":"mouth","bone":"head","attachment":"mouth"},{"name":"eyes","bone":"head","attachment":"eyes"},{"name":"forearm1","bone":"forearm1","attachment":"forearm1"},{"name":"hand1","bone":"hand1","attachment":"hand1"}],"skins":{"default":{"body":{"body":{"x":33.81,"y":2.59,"rotation":-92.7,"width":97,"height":95}},"eyes":{"eyes":{"x":6.48,"y":50.75,"rotation":0.12,"width":82,"height":31}},"fingers":{"fingers":{"x":16.21,"y":1.37,"rotation":82.36,"width":31,"height":33}},"foot1":{"foot1":{"x":12.55,"y":0.12,"rotation":90.96,"width":50,"height":42}},"foot2":{"foot2":{"x":8.83,"y":2.92,"rotation":90.42,"width":53,"height":38}},"forearm1":{"forearm1":{"x":11.88,"y":-5.04,"rotation":106.61,"width":41,"height":49}},"forearm2":{"forearm2":{"x":13.08,"y":-0.63,"rotation":83.71,"width":31,"height":32}},"hand1":{"hand1":{"x":11.92,"y":-0.7,"rotation":90.37,"width":37,"height":48}},"hand2":{"hand2":{"x":14.23,"y":1.64,"rotation":82.36,"width":31,"height":37}},"head":{"head":{"x":7.79,"y":71.87,"rotation":0.12,"width":172,"height":173}},"mantles":{"mantles":{"x":15.57,"y":11.76,"rotation":-90.45,"width":136,"height":55}},"mouth":{"mouth":{"x":12.07,"y":10.76,"rotation":0.12,"width":61,"height":13}},"shin1":{"shin1":{"x":8.95,"y":0.67,"rotation":96.8,"width":53,"height":57}},"shin2":{"shin2":{"x":2.25,"y":-2.94,"rotation":87.71,"width":51,"height":54}},"thigh1":{"thigh1":{"x":11.98,"y":-1.01,"rotation":107.07,"width":60,"height":63}},"thigh2":{"thigh2":{"x":15.7,"y":-4.61,"rotation":85.46,"width":57,"height":64}},"upperarm1":{"upperarm1":{"x":6.6,"y":0.05,"rotation":137.18,"width":50,"height":56}},"upperarm2":{"upperarm2":{"x":13.32,"y":-2.21,"rotation":90.45,"width":39,"height":59}},"weapon":{"sword":{"x":71.38,"y":0.2,"rotation":0.19,"width":216,"height":69}}}},"events":{"Footstep":{}},"animations":{"Attack":{"bones":{"root":{"rotate":[{"time":0,"angle":0,"curve":"stepped"},{"time":0.4,"angle":0}],"translate":[{"time":0,"x":0,"y":0,"curve":"stepped"},{"time":0.4,"x":0,"y":0}]},"Hip":{"rotate":[{"time":0,"angle":0,"curve":"stepped"},{"time":0.4,"angle":0}],"translate":[{"time":0,"x":-12.6,"y":-11.34},{"time":0.0666,"x":-20.75,"y":-23.08},{"time":0.1333,"x":-15.51,"y":-16.91},{"time":0.2,"x":-5.88,"y":-21.85},{"time":0.2666,"x":-7.08,"y":-25.29},{"time":0.4,"x":-12.6,"y":-11.34}]},"L_Ground":{"rotate":[{"time":0,"angle":0,"curve":"stepped"},{"time":0.4,"angle":0}],"translate":[{"time":0,"x":51.94,"y":0,"curve":"stepped"},{"time":0.4,"x":51.94,"y":0}]},"R_Ground":{"rotate":[{"time":0,"angle":0,"curve":"stepped"},{"time":0.4,"angle":0}],"translate":[{"time":0,"x":-67.98,"y":0,"curve":"stepped"},{"time":0.4,"x":-67.98,"y":0}]},"L_Ankle":{"rotate":[{"time":0,"angle":0,"curve":"stepped"},{"time":0.4,"angle":0}],"translate":[{"time":0,"x":0,"y":0,"curve":"stepped"},{"time":0.4,"x":0,"y":0}]},"R_Ankle":{"rotate":[{"time":0,"angle":0,"curve":"stepped"},{"time":0.4,"angle":0}],"translate":[{"time":0,"x":0,"y":0,"curve":"stepped"},{"time":0.4,"x":0,"y":0}]},"body":{"rotate":[{"time":0,"angle":2.2},{"time":0.0666,"angle":13.21},{"time":0.1333,"angle":-9.58},{"time":0.2,"angle":-23.58},{"time":0.2666,"angle":-32.14},{"time":0.4,"angle":2.2}],"translate":[{"time":0,"x":-0.76,"y":-1.89},{"time":0.1333,"x":4.86,"y":-0.24},{"time":0.2,"x":8.05,"y":-2.43},{"time":0.4,"x":-0.76,"y":-1.89}]},"thigh1":{"rotate":[{"time":0,"angle":0,"curve":"stepped"},{"time":0.4,"angle":0}],"translate":[{"time":0,"x":14.5,"y":-3.78,"curve":"stepped"},{"time":0.4,"x":14.5,"y":-3.78}]},"thigh2":{"rotate":[{"time":0,"angle":0,"curve":"stepped"},{"time":0.4,"angle":0}],"translate":[{"time":0,"x":-22.57,"y":1.51},{"time":0.2,"x":-13.26,"y":-2.4},{"time":0.4,"x":-22.57,"y":1.51}]},"head":{"rotate":[{"time":0,"angle":-19.21},{"time":0.0666,"angle":-19.17},{"time":0.1333,"angle":4.76},{"time":0.2,"angle":12.46},{"time":0.2666,"angle":12.57},{"time":0.4,"angle":-19.21}],"translate":[{"time":0,"x":0,"y":0},{"time":0.0666,"x":3.47,"y":5.7},{"time":0.2,"x":-4.55,"y":-12.27},{"time":0.4,"x":0,"y":0}]},"mantles":{"rotate":[{"time":0,"angle":-8.27},{"time":0.0666,"angle":5.32},{"time":0.1333,"angle":4.8},{"time":0.2,"angle":-2.43},{"time":0.2666,"angle":-12.35},{"time":0.4,"angle":-8.27}],"translate":[{"time":0,"x":0,"y":0},{"time":0.0666,"x":5.51,"y":-5.45},{"time":0.1333,"x":1.53,"y":-5.87},{"time":0.2,"x":0.46,"y":-6.11},{"time":0.2666,"x":-6.55,"y":-4.72},{"time":0.4,"x":0,"y":0}]},"shin1":{"rotate":[{"time":0,"angle":0,"curve":"stepped"},{"time":0.4,"angle":0}],"translate":[{"time":0,"x":0,"y":0,"curve":"stepped"},{"time":0.4,"x":0,"y":0}]},"shin2":{"rotate":[{"time":0,"angle":0,"curve":"stepped"},{"time":0.4,"angle":0}],"translate":[{"time":0,"x":0,"y":0,"curve":"stepped"},{"time":0.4,"x":0,"y":0}]},"upperarm1":{"rotate":[{"time":0,"angle":-4.05},{"time":0.0666,"angle":33.65},{"time":0.1333,"angle":-3.75},{"time":0.2666,"angle":-49.64},{"time":0.3333,"angle":-42.31},{"time":0.4,"angle":-4.05}],"translate":[{"time":0,"x":0,"y":0},{"time":0.2,"x":-2.5,"y":-6.51},{"time":0.4,"x":0,"y":0}]},"upperarm2":{"rotate":[{"time":0,"angle":324.46},{"time":0.0666,"angle":101.05},{"time":0.1333,"angle":49.05},{"time":0.2,"angle":15.11},{"time":0.2666,"angle":313.18},{"time":0.4,"angle":324.46}],"translate":[{"time":0,"x":0,"y":0},{"time":0.1333,"x":-2.1,"y":-8.13},{"time":0.2,"x":-10.56,"y":1.25},{"time":0.4,"x":0,"y":0}]},"foot1":{"rotate":[{"time":0,"angle":8.9,"curve":"stepped"},{"time":0.4,"angle":8.9}],"translate":[{"time":0,"x":0,"y":0,"curve":"stepped"},{"time":0.4,"x":0,"y":0}]},"foot2":{"rotate":[{"time":0,"angle":-13.11,"curve":"stepped"},{"time":0.4,"angle":-13.11}],"translate":[{"time":0,"x":0,"y":0,"curve":"stepped"},{"time":0.4,"x":0,"y":0}]},"forearm1":{"rotate":[{"time":0,"angle":7.93},{"time":0.0666,"angle":42.3},{"time":0.1333,"angle":21.87},{"time":0.3333,"angle":43.27},{"time":0.4,"angle":7.93}],"translate":[{"time":0,"x":0,"y":0,"curve":"stepped"},{"time":0.4,"x":0,"y":0}]},"forearm2":{"rotate":[{"time":0,"angle":56.31},{"time":0.0666,"angle":87.62},{"time":0.1333,"angle":6.51},{"time":0.2,"angle":1},{"time":0.2666,"angle":45.14},{"time":0.4,"angle":56.31}],"translate":[{"time":0,"x":0,"y":0,"curve":"stepped"},{"time":0.4,"x":0,"y":0}]},"hand1":{"rotate":[{"time":0,"angle":0},{"time":0.1333,"angle":-8.94},{"time":0.2666,"angle":-20.79},{"time":0.4,"angle":0}],"translate":[{"time":0,"x":0,"y":0,"curve":"stepped"},{"time":0.4,"x":0,"y":0}]},"hand2":{"rotate":[{"time":0,"angle":17.89},{"time":0.0666,"angle":-12.89},{"time":0.1333,"angle":-11.39},{"time":0.2,"angle":6.2},{"time":0.2666,"angle":18.96},{"time":0.4,"angle":17.89}],"translate":[{"time":0,"x":0,"y":0,"curve":"stepped"},{"time":0.4,"x":0,"y":0}]},"weapon":{"rotate":[{"time":0,"angle":0,"curve":"stepped"},{"time":0.4,"angle":0}],"translate":[{"time":0,"x":0,"y":0,"curve":"stepped"},{"time":0.4,"x":0,"y":0}]}}},"Crouch":{"bones":{"upperarm2":{"rotate":[{"time":0,"angle":38.03},{"time":0.5,"angle":30.8},{"time":1,"angle":38.03}],"translate":[{"time":0,"x":0,"y":0,"curve":"stepped"},{"time":1,"x":0,"y":0}]},"body":{"rotate":[{"time":0,"angle":-15.51,"curve":[0.25,0,0.75,1]},{"time":0.5,"angle":-11.54,"curve":[0.25,0,0.75,1]},{"time":1,"angle":-15.51}],"translate":[{"time":0,"x":-0.41,"y":-2.32,"curve":[0.25,0,0.75,1]},{"time":0.5,"x":-2.2,"y":-0.53,"curve":[0.25,0,0.75,1]},{"time":1,"x":-0.41,"y":-2.32}]},"head":{"rotate":[{"time":0,"angle":8.72},{"time":0.5,"angle":3.24},{"time":1,"angle":8.72}],"translate":[{"time":0,"x":-4.42,"y":-2.85,"curve":[0.361,0.63,0.697,1]},{"time":0.1666,"x":-4.84,"y":-3.05,"curve":[0.25,0,0.75,1]},{"time":0.6666,"x":-2.35,"y":-1.86,"curve":[0.36,0.43,0.701,0.8]},{"time":1,"x":-4.42,"y":-2.85}]},"Hip":{"rotate":[{"time":0,"angle":0,"curve":"stepped"},{"time":1,"angle":0}],"translate":[{"time":0,"x":-11.22,"y":-42.01,"curve":"stepped"},{"time":1,"x":-11.22,"y":-42.01}]},"mantles":{"rotate":[{"time":0,"angle":9.04},{"time":0.5,"angle":7.13},{"time":1,"angle":9.04}],"translate":[{"time":0,"x":-0.09,"y":0,"curve":"stepped"},{"time":1,"x":-0.09,"y":0}]},"L_Ground":{"rotate":[{"time":0,"angle":0,"curve":"stepped"},{"time":1,"angle":0}],"translate":[{"time":0,"x":-29.07,"y":1.18,"curve":"stepped"},{"time":1,"x":-29.07,"y":1.18}]},"R_Ground":{"rotate":[{"time":0,"angle":0,"curve":"stepped"},{"time":1,"angle":0}],"translate":[{"time":0,"x":16.23,"y":0,"curve":"stepped"},{"time":1,"x":16.23,"y":0}]},"upperarm1":{"rotate":[{"time":0,"angle":-5.42},{"time":0.5,"angle":-11.1},{"time":1,"angle":-5.42}],"translate":[{"time":0,"x":-6.94,"y":5.85,"curve":"stepped"},{"time":1,"x":-6.94,"y":5.85}]},"forearm1":{"rotate":[{"time":0,"angle":25.38},{"time":0.5,"angle":32.07},{"time":1,"angle":25.38}],"translate":[{"time":0,"x":0,"y":0,"curve":"stepped"},{"time":1,"x":0,"y":0}]},"forearm2":{"rotate":[{"time":0,"angle":18.6},{"time":0.5,"angle":26.15},{"time":1,"angle":18.6}],"translate":[{"time":0,"x":0,"y":0,"curve":"stepped"},{"time":1,"x":0,"y":0}]},"thigh2":{"rotate":[{"time":0,"angle":0,"curve":"stepped"},{"time":1,"angle":0}],"translate":[{"time":0,"x":-2.75,"y":0,"curve":"stepped"},{"time":1,"x":-2.75,"y":0}]},"thigh1":{"rotate":[{"time":0,"angle":0,"curve":"stepped"},{"time":1,"angle":0}],"translate":[{"time":0,"x":-0.92,"y":6.67,"curve":"stepped"},{"time":1,"x":-0.92,"y":6.67}]},"foot1":{"rotate":[{"time":0,"angle":270.13,"curve":"stepped"},{"time":1,"angle":270.13}],"translate":[{"time":0,"x":0,"y":0,"curve":"stepped"},{"time":1,"x":0,"y":0}]},"foot2":{"rotate":[{"time":0,"angle":0,"curve":"stepped"},{"time":1,"angle":0}],"translate":[{"time":0,"x":0,"y":0,"curve":"stepped"},{"time":1,"x":0,"y":0}]},"weapon":{"rotate":[{"time":0,"angle":0,"curve":"stepped"},{"time":1,"angle":0}],"translate":[{"time":0,"x":0,"y":0,"curve":"stepped"},{"time":1,"x":0,"y":0}]},"hand2":{"rotate":[{"time":0,"angle":-13.39},{"time":0.5,"angle":-17.28},{"time":1,"angle":-13.39}],"translate":[{"time":0,"x":0,"y":0,"curve":"stepped"},{"time":1,"x":0,"y":0}]},"hand1":{"rotate":[{"time":0,"angle":-9.29},{"time":0.5,"angle":-1.97},{"time":1,"angle":-9.29}],"translate":[{"time":0,"x":0,"y":0,"curve":"stepped"},{"time":1,"x":0,"y":0}]},"shin2":{"rotate":[{"time":0,"angle":0,"curve":"stepped"},{"time":1,"angle":0}],"translate":[{"time":0,"x":0,"y":0,"curve":"stepped"},{"time":1,"x":0,"y":0}]},"shin1":{"rotate":[{"time":0,"angle":0,"curve":"stepped"},{"time":1,"angle":0}],"translate":[{"time":0,"x":0,"y":0,"curve":"stepped"},{"time":1,"x":0,"y":0}]},"R_Ankle":{"rotate":[{"time":0,"angle":0,"curve":"stepped"},{"time":1,"angle":0}],"translate":[{"time":0,"x":0,"y":-4.92,"curve":"stepped"},{"time":1,"x":0,"y":-4.92}]},"L_Ankle":{"rotate":[{"time":0,"angle":0,"curve":"stepped"},{"time":1,"angle":0}],"translate":[{"time":0,"x":0,"y":-12.22,"curve":"stepped"},{"time":1,"x":0,"y":-12.22}]}}},"Fall":{"bones":{"R_Ground":{"rotate":[{"time":0,"angle":0,"curve":"stepped"},{"time":1,"angle":0}],"translate":[{"time":0,"x":13.15,"y":7.94,"curve":"stepped"},{"time":1,"x":13.15,"y":7.94}]},"L_Ground":{"rotate":[{"time":0,"angle":0,"curve":"stepped"},{"time":1,"angle":0}],"translate":[{"time":0,"x":35.34,"y":4.14,"curve":"stepped"},{"time":1,"x":35.34,"y":4.14}]},"foot1":{"rotate":[{"time":0,"angle":19.62,"curve":"stepped"},{"time":1,"angle":19.62}],"translate":[{"time":0,"x":0,"y":0,"curve":"stepped"},{"time":1,"x":0,"y":0}]},"foot2":{"rotate":[{"time":0,"angle":39.16,"curve":"stepped"},{"time":1,"angle":39.16}],"translate":[{"time":0,"x":0,"y":0,"curve":"stepped"},{"time":1,"x":0,"y":0}]},"Hip":{"rotate":[{"time":0,"angle":0,"curve":"stepped"},{"time":1,"angle":0}],"translate":[{"time":0,"x":0,"y":0,"curve":"stepped"},{"time":1,"x":0,"y":0}]},"thigh1":{"rotate":[{"time":0,"angle":0,"curve":"stepped"},{"time":1,"angle":0}],"translate":[{"time":0,"x":0,"y":0,"curve":"stepped"},{"time":1,"x":0,"y":0}]},"thigh2":{"rotate":[{"time":0,"angle":0,"curve":"stepped"},{"time":1,"angle":0}],"translate":[{"time":0,"x":0,"y":0,"curve":"stepped"},{"time":1,"x":0,"y":0}]},"body":{"rotate":[{"time":0,"angle":14.13,"curve":"stepped"},{"time":1,"angle":14.13}],"translate":[{"time":0,"x":0,"y":0,"curve":"stepped"},{"time":1,"x":0,"y":0}]},"head":{"rotate":[{"time":0,"angle":-17.81,"curve":"stepped"},{"time":1,"angle":-17.81}],"translate":[{"time":0,"x":0,"y":0,"curve":"stepped"},{"time":1,"x":0,"y":0}]},"upperarm1":{"rotate":[{"time":0,"angle":-25.71,"curve":"stepped"},{"time":1,"angle":-25.71}],"translate":[{"time":0,"x":0,"y":0,"curve":"stepped"},{"time":1,"x":0,"y":0}]},"forearm1":{"rotate":[{"time":0,"angle":26.18,"curve":"stepped"},{"time":1,"angle":26.18}],"translate":[{"time":0,"x":0,"y":0,"curve":"stepped"},{"time":1,"x":0,"y":0}]},"upperarm2":{"rotate":[{"time":0,"angle":37.75,"curve":"stepped"},{"time":1,"angle":37.75}],"translate":[{"time":0,"x":0,"y":0,"curve":"stepped"},{"time":1,"x":0,"y":0}]},"forearm2":{"rotate":[{"time":0,"angle":12.3,"curve":"stepped"},{"time":1,"angle":12.3}],"translate":[{"time":0,"x":0,"y":0,"curve":"stepped"},{"time":1,"x":0,"y":0}]},"L_Ankle":{"rotate":[{"time":0,"angle":0,"curve":"stepped"},{"time":1,"angle":0}],"translate":[{"time":0,"x":0,"y":0,"curve":"stepped"},{"time":1,"x":0,"y":0}]},"R_Ankle":{"rotate":[{"time":0,"angle":0,"curve":"stepped"},{"time":1,"angle":0}],"translate":[{"time":0,"x":0,"y":0,"curve":"stepped"},{"time":1,"x":0,"y":0}]},"mantles":{"rotate":[{"time":0,"angle":0,"curve":"stepped"},{"time":1,"angle":0}],"translate":[{"time":0,"x":0,"y":0,"curve":"stepped"},{"time":1,"x":0,"y":0}]},"shin1":{"rotate":[{"time":0,"angle":0,"curve":"stepped"},{"time":1,"angle":0}],"translate":[{"time":0,"x":0,"y":0,"curve":"stepped"},{"time":1,"x":0,"y":0}]},"shin2":{"rotate":[{"time":0,"angle":0,"curve":"stepped"},{"time":1,"angle":0}],"translate":[{"time":0,"x":0,"y":0,"curve":"stepped"},{"time":1,"x":0,"y":0}]},"hand1":{"rotate":[{"time":0,"angle":0,"curve":"stepped"},{"time":1,"angle":0}],"translate":[{"time":0,"x":0,"y":0,"curve":"stepped"},{"time":1,"x":0,"y":0}]},"hand2":{"rotate":[{"time":0,"angle":0,"curve":"stepped"},{"time":1,"angle":0}],"translate":[{"time":0,"x":0,"y":0,"curve":"stepped"},{"time":1,"x":0,"y":0}]},"weapon":{"rotate":[{"time":0,"angle":0,"curve":"stepped"},{"time":1,"angle":0}],"translate":[{"time":0,"x":0,"y":0,"curve":"stepped"},{"time":1,"x":0,"y":0}]}}},"Idle":{"bones":{"upperarm2":{"rotate":[{"time":0,"angle":0.46},{"time":0.5,"angle":358.79},{"time":1,"angle":0.46}],"translate":[{"time":0,"x":0,"y":0},{"time":0.5,"x":-3.12,"y":8.02},{"time":1,"x":0,"y":0}]},"body":{"rotate":[{"time":0,"angle":0},{"time":0.5,"angle":1.66},{"time":1,"angle":0}],"translate":[{"time":0,"x":0,"y":0,"curve":[0.25,0,0.75,1]},{"time":0.5,"x":0,"y":-3.7,"curve":[0.25,0,0.75,1]},{"time":1,"x":0,"y":0}]},"head":{"rotate":[{"time":0,"angle":-4.18},{"time":0.5,"angle":-8.25},{"time":1,"angle":-4.18}],"translate":[{"time":0,"x":-1.06,"y":0,"curve":[0.382,0.57,0.735,1]},{"time":0.1666,"x":0,"y":0,"curve":[0.25,0,0.75,1]},{"time":0.6666,"x":-3.74,"y":0,"curve":[0.243,0,0.648,0.6]},{"time":1,"x":-1.06,"y":0}]},"Hip":{"rotate":[{"time":0,"angle":0,"curve":"stepped"},{"time":1,"angle":0}],"translate":[{"time":0,"x":0,"y":-2.92,"curve":[0.25,0,0.75,1]},{"time":0.5,"x":-3.18,"y":-4.03,"curve":[0.25,0,0.75,1]},{"time":1,"x":0,"y":-2.92}]},"mantles":{"rotate":[{"time":0,"angle":0},{"time":0.4333,"angle":-4.83,"curve":[0.25,0,0.75,1]},{"time":1,"angle":0}],"translate":[{"time":0,"x":-0.09,"y":0,"curve":[0.3,0.21,0.755,1]},{"time":0.4333,"x":-1.41,"y":0,"curve":[0.25,0,0.75,1]},{"time":0.9333,"x":0,"y":0},{"time":1,"x":-0.09,"y":0}]},"L_Ground":{"rotate":[{"time":0,"angle":0,"curve":"stepped"},{"time":1,"angle":0}],"translate":[{"time":0,"x":-7.15,"y":0,"curve":"stepped"},{"time":1,"x":-7.15,"y":0}]},"R_Ground":{"rotate":[{"time":0,"angle":0,"curve":"stepped"},{"time":1,"angle":0}],"translate":[{"time":0,"x":5.94,"y":0,"curve":"stepped"},{"time":1,"x":5.94,"y":0}]},"upperarm1":{"rotate":[{"time":0,"angle":0,"curve":[0.404,0,0.75,1]},{"time":0.5,"angle":-15.4,"curve":[0.516,0,0.75,1]},{"time":1,"angle":0}],"translate":[{"time":0,"x":0,"y":0,"curve":[0.404,0,0.75,1]},{"time":0.5,"x":1.84,"y":-5,"curve":[0.516,0,0.75,1]},{"time":1,"x":0,"y":0}]},"forearm1":{"rotate":[{"time":0,"angle":0,"curve":[0.404,0,0.75,1]},{"time":0.5,"angle":9.63,"curve":[0.516,0,0.75,1]},{"time":1,"angle":0}],"translate":[{"time":0,"x":0,"y":0,"curve":"stepped"},{"time":1,"x":0,"y":0}]},"forearm2":{"rotate":[{"time":0,"angle":0},{"time":0.5,"angle":13.63},{"time":1,"angle":0}],"translate":[{"time":0,"x":0,"y":0,"curve":"stepped"},{"time":1,"x":0,"y":0}]},"thigh2":{"rotate":[{"time":0,"angle":0,"curve":"stepped"},{"time":1,"angle":0}],"translate":[{"time":0,"x":0,"y":0,"curve":"stepped"},{"time":1,"x":0,"y":0}]},"thigh1":{"rotate":[{"time":0,"angle":0,"curve":"stepped"},{"time":1,"angle":0}],"translate":[{"time":0,"x":0,"y":0,"curve":"stepped"},{"time":1,"x":0,"y":0}]},"foot1":{"rotate":[{"time":0,"angle":0,"curve":"stepped"},{"time":1,"angle":0}],"translate":[{"time":0,"x":0,"y":0,"curve":"stepped"},{"time":1,"x":0,"y":0}]},"foot2":{"rotate":[{"time":0,"angle":0,"curve":"stepped"},{"time":1,"angle":0}],"translate":[{"time":0,"x":0,"y":0,"curve":"stepped"},{"time":1,"x":0,"y":0}]},"weapon":{"rotate":[{"time":0,"angle":0,"curve":"stepped"},{"time":1,"angle":0}],"translate":[{"time":0,"x":0,"y":0,"curve":"stepped"},{"time":1,"x":0,"y":0}]},"hand2":{"rotate":[{"time":0,"angle":0},{"time":0.5,"angle":-8.65},{"time":1,"angle":0}],"translate":[{"time":0,"x":0,"y":0,"curve":"stepped"},{"time":1,"x":0,"y":0}]},"hand1":{"rotate":[{"time":0,"angle":0,"curve":[0.404,0,0.75,1]},{"time":0.5,"angle":12.36,"curve":[0.516,0,0.75,1]},{"time":1,"angle":0}],"translate":[{"time":0,"x":0,"y":0,"curve":"stepped"},{"time":1,"x":0,"y":0}]},"shin2":{"rotate":[{"time":0,"angle":0,"curve":"stepped"},{"time":1,"angle":0}],"translate":[{"time":0,"x":0,"y":0,"curve":"stepped"},{"time":1,"x":0,"y":0}]},"shin1":{"rotate":[{"time":0,"angle":0,"curve":"stepped"},{"time":1,"angle":0}],"translate":[{"time":0,"x":0,"y":0,"curve":"stepped"},{"time":1,"x":0,"y":0}]},"R_Ankle":{"rotate":[{"time":0,"angle":0,"curve":"stepped"},{"time":1,"angle":0}],"translate":[{"time":0,"x":0,"y":0,"curve":"stepped"},{"time":1,"x":0,"y":0}]},"L_Ankle":{"rotate":[{"time":0,"angle":0,"curve":"stepped"},{"time":1,"angle":0}],"translate":[{"time":0,"x":0,"y":0,"curve":"stepped"},{"time":1,"x":0,"y":0}]}}},"Jump":{"bones":{"R_Ground":{"rotate":[{"time":0,"angle":0,"curve":"stepped"},{"time":1,"angle":0}],"translate":[{"time":0,"x":-6.83,"y":12.06,"curve":"stepped"},{"time":1,"x":-6.83,"y":12.06}]},"L_Ground":{"rotate":[{"time":0,"angle":0,"curve":"stepped"},{"time":1,"angle":0}],"translate":[{"time":0,"x":2.41,"y":1.2,"curve":"stepped"},{"time":1,"x":2.41,"y":1.2}]},"foot1":{"rotate":[{"time":0,"angle":-32.23,"curve":"stepped"},{"time":1,"angle":-32.23}],"translate":[{"time":0,"x":0,"y":0,"curve":"stepped"},{"time":1,"x":0,"y":0}]},"foot2":{"rotate":[{"time":0,"angle":-33.3,"curve":"stepped"},{"time":1,"angle":-33.3}],"translate":[{"time":0,"x":0,"y":0,"curve":"stepped"},{"time":1,"x":0,"y":0}]},"Hip":{"rotate":[{"time":0,"angle":0,"curve":"stepped"},{"time":1,"angle":0}],"translate":[{"time":0,"x":0,"y":0,"curve":"stepped"},{"time":1,"x":0,"y":0}]},"thigh1":{"rotate":[{"time":0,"angle":0,"curve":"stepped"},{"time":1,"angle":0}],"translate":[{"time":0,"x":0,"y":0,"curve":"stepped"},{"time":1,"x":0,"y":0}]},"thigh2":{"rotate":[{"time":0,"angle":0,"curve":"stepped"},{"time":1,"angle":0}],"translate":[{"time":0,"x":0,"y":0,"curve":"stepped"},{"time":1,"x":0,"y":0}]},"body":{"rotate":[{"time":0,"angle":-10.4,"curve":"stepped"},{"time":1,"angle":-10.4}],"translate":[{"time":0,"x":0,"y":0,"curve":"stepped"},{"time":1,"x":0,"y":0}]},"head":{"rotate":[{"time":0,"angle":4.89,"curve":"stepped"},{"time":1,"angle":4.89}],"translate":[{"time":0,"x":0,"y":0,"curve":"stepped"},{"time":1,"x":0,"y":0}]},"upperarm1":{"rotate":[{"time":0,"angle":22.69,"curve":"stepped"},{"time":1,"angle":22.69}],"translate":[{"time":0,"x":0,"y":0,"curve":"stepped"},{"time":1,"x":0,"y":0}]},"forearm1":{"rotate":[{"time":0,"angle":56.41,"curve":"stepped"},{"time":1,"angle":56.41}],"translate":[{"time":0,"x":0,"y":0,"curve":"stepped"},{"time":1,"x":0,"y":0}]},"upperarm2":{"rotate":[{"time":0,"angle":23.71,"curve":"stepped"},{"time":1,"angle":23.71}],"translate":[{"time":0,"x":0,"y":0,"curve":"stepped"},{"time":1,"x":0,"y":0}]},"forearm2":{"rotate":[{"time":0,"angle":20.06,"curve":"stepped"},{"time":1,"angle":20.06}],"translate":[{"time":0,"x":0,"y":0,"curve":"stepped"},{"time":1,"x":0,"y":0}]},"L_Ankle":{"rotate":[{"time":0,"angle":0,"curve":"stepped"},{"time":1,"angle":0}],"translate":[{"time":0,"x":0,"y":0,"curve":"stepped"},{"time":1,"x":0,"y":0}]},"R_Ankle":{"rotate":[{"time":0,"angle":0,"curve":"stepped"},{"time":1,"angle":0}],"translate":[{"time":0,"x":0,"y":0,"curve":"stepped"},{"time":1,"x":0,"y":0}]},"mantles":{"rotate":[{"time":0,"angle":0,"curve":"stepped"},{"time":1,"angle":0}],"translate":[{"time":0,"x":0,"y":0,"curve":"stepped"},{"time":1,"x":0,"y":0}]},"shin1":{"rotate":[{"time":0,"angle":0,"curve":"stepped"},{"time":1,"angle":0}],"translate":[{"time":0,"x":0,"y":0,"curve":"stepped"},{"time":1,"x":0,"y":0}]},"shin2":{"rotate":[{"time":0,"angle":0,"curve":"stepped"},{"time":1,"angle":0}],"translate":[{"time":0,"x":0,"y":0,"curve":"stepped"},{"time":1,"x":0,"y":0}]},"hand1":{"rotate":[{"time":0,"angle":0,"curve":"stepped"},{"time":1,"angle":0}],"translate":[{"time":0,"x":0,"y":0,"curve":"stepped"},{"time":1,"x":0,"y":0}]},"hand2":{"rotate":[{"time":0,"angle":0,"curve":"stepped"},{"time":1,"angle":0}],"translate":[{"time":0,"x":0,"y":0,"curve":"stepped"},{"time":1,"x":0,"y":0}]},"weapon":{"rotate":[{"time":0,"angle":0,"curve":"stepped"},{"time":1,"angle":0}],"translate":[{"time":0,"x":0,"y":0,"curve":"stepped"},{"time":1,"x":0,"y":0}]}}},"Run":{"bones":{"upperarm1":{"rotate":[{"time":0,"angle":-40.45},{"time":0.044,"angle":-34.97},{"time":0.0881,"angle":1.79},{"time":0.1322,"angle":42.58},{"time":0.3117,"angle":-282.55},{"time":0.3525,"angle":48.21},{"time":0.3966,"angle":26.17},{"time":0.4407,"angle":-22.81},{"time":0.5333,"angle":-40.45}],"translate":[{"time":0,"x":0,"y":0},{"time":0.044,"x":1.33,"y":0.56},{"time":0.1762,"x":-2.74,"y":-5.58},{"time":0.3117,"x":-3.1,"y":-2.45},{"time":0.4407,"x":-0.75,"y":4.05},{"time":0.5333,"x":0,"y":0}]},"forearm1":{"rotate":[{"time":0,"angle":27.41},{"time":0.044,"angle":21.5},{"time":0.0881,"angle":16.71},{"time":0.1322,"angle":30.61},{"time":0.3117,"angle":38.33},{"time":0.3525,"angle":37.81},{"time":0.3966,"angle":16.47},{"time":0.4407,"angle":17.71},{"time":0.5333,"angle":27.41}],"translate":[{"time":0,"x":0,"y":0,"curve":"stepped"},{"time":0.5333,"x":0,"y":0}]},"hand1":{"rotate":[{"time":0,"angle":-20.19},{"time":0.044,"angle":-24.82},{"time":0.1762,"angle":-14.29},{"time":0.3525,"angle":21.84},{"time":0.3966,"angle":9.46},{"time":0.4407,"angle":12.08},{"time":0.5333,"angle":-20.19}],"translate":[{"time":0,"x":0,"y":0,"curve":"stepped"},{"time":0.5333,"x":0,"y":0}]},"L_Ground":{"rotate":[{"time":0,"angle":0,"curve":"stepped"},{"time":0.5333,"angle":0}],"translate":[{"time":0,"x":49.53,"y":-0.29},{"time":0.044,"x":39.66,"y":-0.29},{"time":0.0881,"x":-3.63,"y":-0.29},{"time":0.1322,"x":-10.76,"y":-0.29},{"time":0.1762,"x":-16.65,"y":22.09},{"time":0.2203,"x":-10,"y":27.07},{"time":0.2666,"x":-11.26,"y":16.63},{"time":0.3117,"x":12.41,"y":7.75},{"time":0.3525,"x":37.47,"y":7.29},{"time":0.3966,"x":52.33,"y":5.52},{"time":0.4407,"x":68.69,"y":19.42},{"time":0.4848,"x":68.69,"y":7.96},{"time":0.5333,"x":49.53,"y":-0.29}]},"foot1":{"rotate":[{"time":0,"angle":20.27},{"time":0.044,"angle":-0.6},{"time":0.1322,"angle":-31.14},{"time":0.1762,"angle":262.34},{"time":0.2203,"angle":-71.2},{"time":0.2666,"angle":-84.95},{"time":0.3117,"angle":-63.21},{"time":0.3525,"angle":-8.37},{"time":0.3966,"angle":-18.33},{"time":0.4407,"angle":34.08},{"time":0.5333,"angle":20.27}],"translate":[{"time":0,"x":0,"y":0,"curve":"stepped"},{"time":0.5333,"x":0,"y":0}]},"R_Ground":{"rotate":[{"time":0,"angle":0,"curve":"stepped"},{"time":0.5333,"angle":0}],"translate":[{"time":0,"x":-58.44,"y":26.01},{"time":0.044,"x":-42,"y":21.08},{"time":0.0881,"x":-5.28,"y":9.57},{"time":0.1322,"x":11.16,"y":11.76},{"time":0.1762,"x":19.38,"y":26.56},{"time":0.2203,"x":23.89,"y":16.89},{"time":0.2666,"x":21.52,"y":-0.14},{"time":0.3117,"x":-19.32,"y":-0.14},{"time":0.3525,"x":-53.26,"y":0.13},{"time":0.3966,"x":-65.63,"y":6.46},{"time":0.4407,"x":-75.71,"y":39.48},{"time":0.5333,"x":-58.44,"y":26.01}]},"foot2":{"rotate":[{"time":0,"angle":262.95},{"time":0.0881,"angle":-74.33},{"time":0.1322,"angle":-4.26},{"time":0.1762,"angle":13.38},{"time":0.2203,"angle":28.95},{"time":0.2666,"angle":35.05},{"time":0.3117,"angle":7.53},{"time":0.3525,"angle":-31.42},{"time":0.4407,"angle":260.06},{"time":0.5333,"angle":262.95}],"translate":[{"time":0,"x":0,"y":0,"curve":"stepped"},{"time":0.5333,"x":0,"y":0}]},"root":{"rotate":[{"time":0,"angle":0,"curve":"stepped"},{"time":0.5333,"angle":0}],"translate":[{"time":0,"x":0,"y":0,"curve":"stepped"},{"time":0.5333,"x":0,"y":0}]},"Hip":{"rotate":[{"time":0,"angle":0,"curve":"stepped"},{"time":0.5333,"angle":0}],"translate":[{"time":0,"x":0,"y":-8.39},{"time":0.044,"x":1.64,"y":-12.87},{"time":0.0881,"x":1.64,"y":-11.23,"curve":[0.25,0,0.75,1]},{"time":0.1762,"x":1.64,"y":8.97},{"time":0.2203,"x":1.64,"y":-1.1},{"time":0.2666,"x":0,"y":-8.39},{"time":0.3117,"x":0,"y":-10.17},{"time":0.3525,"x":0,"y":-9.45,"curve":[0.25,0,0.75,1]},{"time":0.4407,"x":0,"y":5.78},{"time":0.4848,"x":1.64,"y":-1.1},{"time":0.5333,"x":0,"y":-8.39}]},"L_Ankle":{"rotate":[{"time":0,"angle":0,"curve":"stepped"},{"time":0.5333,"angle":0}],"translate":[{"time":0,"x":0,"y":0},{"time":0.1762,"x":-1.45,"y":9.68},{"time":0.5333,"x":0,"y":0}]},"R_Ankle":{"rotate":[{"time":0,"angle":0,"curve":"stepped"},{"time":0.5333,"angle":0}],"translate":[{"time":0,"x":0,"y":0,"curve":"stepped"},{"time":0.5333,"x":0,"y":0}]},"body":{"rotate":[{"time":0,"angle":-11.15},{"time":0.044,"angle":-16.76},{"time":0.1762,"angle":-8.61},{"time":0.3117,"angle":-20.17},{"time":0.4407,"angle":-8.61},{"time":0.5333,"angle":-11.15}],"translate":[{"time":0,"x":3.36,"y":-2.52},{"time":0.044,"x":4.98,"y":0.87},{"time":0.1762,"x":2.6,"y":4.02},{"time":0.3117,"x":5.73,"y":0.46},{"time":0.4407,"x":2.7,"y":5.1},{"time":0.5333,"x":3.36,"y":-2.52}]},"thigh1":{"rotate":[{"time":0,"angle":0,"curve":"stepped"},{"time":0.5333,"angle":0}],"translate":[{"time":0,"x":6.02,"y":0},{"time":0.1322,"x":-3.58,"y":1.43},{"time":0.1762,"x":0.23,"y":2.72},{"time":0.2666,"x":6.13,"y":-0.59},{"time":0.3305,"x":8.81,"y":5.77},{"time":0.3966,"x":31,"y":0.35},{"time":0.4848,"x":22.13,"y":0.17},{"time":0.5333,"x":6.02,"y":0}]},"thigh2":{"rotate":[{"time":0,"angle":0,"curve":"stepped"},{"time":0.5333,"angle":0}],"translate":[{"time":0,"x":-8.31,"y":-2.37},{"time":0.1322,"x":-3.93,"y":-2.37},{"time":0.2666,"x":3.22,"y":-1.52},{"time":0.3525,"x":-18.12,"y":0.17},{"time":0.3966,"x":-28.38,"y":0.17},{"time":0.5333,"x":-8.31,"y":-2.37}]},"head":{"rotate":[{"time":0,"angle":8.08},{"time":0.044,"angle":1.34,"curve":[0.25,0,0.851,0.81]},{"time":0.1762,"angle":6.45},{"time":0.2666,"angle":10.37},{"time":0.3117,"angle":3.57,"curve":[0.25,0,0.842,0.77]},{"time":0.4407,"angle":7.81},{"time":0.5333,"angle":8.08}],"translate":[{"time":0,"x":2.87,"y":0.23},{"time":0.044,"x":-3.5,"y":-1.82},{"time":0.1762,"x":4.6,"y":0.76},{"time":0.2666,"x":1.55,"y":-6.16},{"time":0.3117,"x":-7.07,"y":-8.66},{"time":0.4407,"x":7.03,"y":0.05},{"time":0.5333,"x":2.87,"y":0.23}]},"mantles":{"rotate":[{"time":0,"angle":0},{"time":0.044,"angle":-2.17},{"time":0.2666,"angle":2.9},{"time":0.3117,"angle":-0.95},{"time":0.5333,"angle":0}],"translate":[{"time":0,"x":0,"y":0},{"time":0.044,"x":-2.6,"y":-0.65},{"time":0.2666,"x":1.39,"y":-0.59},{"time":0.3117,"x":-2.6,"y":-0.65},{"time":0.5333,"x":0,"y":0}]},"shin1":{"rotate":[{"time":0,"angle":0,"curve":"stepped"},{"time":0.5333,"angle":0}],"translate":[{"time":0,"x":0,"y":0,"curve":"stepped"},{"time":0.5333,"x":0,"y":0}]},"shin2":{"rotate":[{"time":0,"angle":0,"curve":"stepped"},{"time":0.5333,"angle":0}],"translate":[{"time":0,"x":0,"y":0,"curve":"stepped"},{"time":0.5333,"x":0,"y":0}]},"upperarm2":{"rotate":[{"time":0,"angle":30.8},{"time":0.044,"angle":38.3},{"time":0.1322,"angle":5.43},{"time":0.2203,"angle":334.6,"curve":[0.25,0,0.75,1]},{"time":0.3117,"angle":328.38},{"time":0.4407,"angle":21.28},{"time":0.5333,"angle":30.8}],"translate":[{"time":0,"x":-5.33,"y":-1.55},{"time":0.1762,"x":-6.43,"y":2.12},{"time":0.5333,"x":-5.33,"y":-1.55}]},"forearm2":{"rotate":[{"time":0,"angle":35.89},{"time":0.0881,"angle":25.71},{"time":0.1762,"angle":29.3},{"time":0.2203,"angle":34.63,"curve":[0.25,0,0.75,1]},{"time":0.3117,"angle":38.94},{"time":0.4407,"angle":30.09},{"time":0.5333,"angle":35.89}],"translate":[{"time":0,"x":0,"y":0,"curve":"stepped"},{"time":0.5333,"x":0,"y":0}]},"hand2":{"rotate":[{"time":0,"angle":8.06},{"time":0.044,"angle":12.45},{"time":0.1762,"angle":33.85},{"time":0.4407,"angle":22.92},{"time":0.5333,"angle":8.06}],"translate":[{"time":0,"x":0,"y":0,"curve":"stepped"},{"time":0.5333,"x":0,"y":0}]},"weapon":{"rotate":[{"time":0,"angle":0,"curve":"stepped"},{"time":0.5333,"angle":0}],"translate":[{"time":0,"x":0,"y":0,"curve":"stepped"},{"time":0.5333,"x":0,"y":0}]}},"events":[{"time":0.2666,"name":"Footstep"},{"time":0.5333,"name":"Footstep"}]},"Walk":{"bones":{"L_Ground":{"rotate":[{"time":0,"angle":0,"curve":"stepped"},{"time":1.0666,"angle":0}],"translate":[{"time":0,"x":68.76,"y":0},{"time":0.1333,"x":57.43,"y":0},{"time":0.2666,"x":41.05,"y":0},{"time":0.4,"x":21.33,"y":0},{"time":0.5333,"x":5.89,"y":0},{"time":0.6666,"x":4.91,"y":0},{"time":0.8,"x":5.89,"y":10.31},{"time":0.9333,"x":44.68,"y":10.8},{"time":1.0666,"x":68.76,"y":0}]},"thigh1":{"rotate":[{"time":0,"angle":0,"curve":"stepped"},{"time":1.0666,"angle":0}],"translate":[{"time":0,"x":24.92,"y":0},{"time":0.2666,"x":22.2,"y":0},{"time":0.4,"x":21.75,"y":-1.01},{"time":0.5333,"x":21.29,"y":0},{"time":0.6666,"x":16.1,"y":1},{"time":0.9333,"x":21.7,"y":-3.92},{"time":1.0666,"x":24.92,"y":0}]},"Hip":{ + "flipX": [ + { "time": 0 }, + { "time": 0.4, "x": true } + ],"rotate":[{"time":0,"angle":0,"curve":"stepped"},{"time":1.0666,"angle":0}],"translate":[{"time":0,"x":0,"y":-7.39},{"time":0.1333,"x":0,"y":-6.32},{"time":0.2666,"x":0,"y":-1.44},{"time":0.3333,"x":0,"y":1.49},{"time":0.4,"x":0,"y":0.87},{"time":0.5333,"x":0,"y":-9.59},{"time":0.6666,"x":0,"y":-8.44},{"time":0.8,"x":0,"y":-1.44},{"time":0.8666,"x":0,"y":1.49},{"time":0.9333,"x":0,"y":0.87},{"time":1.0666,"x":0,"y":-7.39}]},"foot1":{"rotate":[{"time":0,"angle":17.4},{"time":0.1333,"angle":-0.28},{"time":0.4,"angle":-10.63},{"time":0.5333,"angle":-8.71},{"time":0.6666,"angle":-24.7},{"time":0.8,"angle":-43.24},{"time":0.9333,"angle":-35.2},{"time":1.0666,"angle":17.4}],"translate":[{"time":0,"x":0,"y":0,"curve":"stepped"},{"time":1.0666,"x":0,"y":0}]},"thigh2":{"rotate":[{"time":0,"angle":0,"curve":"stepped"},{"time":1.0666,"angle":0}],"translate":[{"time":0,"x":-25.09,"y":0},{"time":0.2,"x":-16.15,"y":-4.51},{"time":0.4,"x":-9.43,"y":-3.48},{"time":0.5333,"x":-4.25,"y":-1.41},{"time":0.6666,"x":-6.64,"y":0.04},{"time":0.8,"x":-11.55,"y":-2.12},{"time":0.9333,"x":-22.84,"y":-3.88},{"time":1.0666,"x":-25.09,"y":0}]},"R_Ground":{"rotate":[{"time":0,"angle":0,"curve":"stepped"},{"time":1.0666,"angle":0}],"translate":[{"time":0,"x":-53.9,"y":0},{"time":0.1333,"x":-55,"y":2.56},{"time":0.2666,"x":-56,"y":14.27},{"time":0.4,"x":-9.55,"y":9.63},{"time":0.5333,"x":18.47,"y":-0.26},{"time":0.6666,"x":6.23,"y":-0.26},{"time":0.8,"x":-20.75,"y":-0.26},{"time":0.9333,"x":-36.46,"y":-3.45},{"time":1.0666,"x":-53.9,"y":0}]},"foot2":{"rotate":[{"time":0,"angle":-20},{"time":0.1333,"angle":-36.58},{"time":0.2666,"angle":-69.51},{"time":0.4,"angle":-13.92},{"time":0.5333,"angle":33.26},{"time":0.6666,"angle":0.41},{"time":0.9333,"angle":-1.16},{"time":1.0666,"angle":-20}],"translate":[{"time":0,"x":0,"y":0,"curve":"stepped"},{"time":1.0666,"x":0,"y":0}]},"upperarm1":{"rotate":[{"time":0,"angle":13.97},{"time":0.1333,"angle":2.64},{"time":0.5333,"angle":-293.8},{"time":0.6666,"angle":-302.37},{"time":0.8,"angle":41.55},{"time":0.9333,"angle":14.48},{"time":1.0666,"angle":13.97}],"translate":[{"time":0,"x":0,"y":0},{"time":0.1333,"x":4.42,"y":3.57},{"time":0.5333,"x":-0.22,"y":-4.77},{"time":0.6666,"x":0.24,"y":-2.39},{"time":1.0666,"x":0,"y":0}]},"forearm1":{"rotate":[{"time":0,"angle":-11.7},{"time":0.1333,"angle":-5.73},{"time":0.5333,"angle":24.76},{"time":0.6666,"angle":33.27,"curve":[0.25,0,0.75,1]},{"time":0.8,"angle":3.08},{"time":0.9333,"angle":5.39},{"time":1.0666,"angle":-11.7}],"translate":[{"time":0,"x":0,"y":0,"curve":"stepped"},{"time":1.0666,"x":0,"y":0}]},"hand1":{"rotate":[{"time":0,"angle":-19.62},{"time":0.1333,"angle":-25.06},{"time":0.2666,"angle":-27.67},{"time":0.4,"angle":-34.31},{"time":0.5333,"angle":-24.05},{"time":0.8,"angle":16.76},{"time":0.9333,"angle":7.44},{"time":1.0666,"angle":-19.62}],"translate":[{"time":0,"x":0,"y":0,"curve":"stepped"},{"time":1.0666,"x":0,"y":0}]},"body":{"rotate":[{"time":0,"angle":2.18},{"time":0.1333,"angle":-2.56,"curve":[0.464,0,0.75,1]},{"time":0.3333,"angle":4.73},{"time":0.5333,"angle":0.29},{"time":0.6666,"angle":-2.56,"curve":[0.464,0,0.75,1]},{"time":0.8666,"angle":3.59},{"time":1.0666,"angle":2.18}],"translate":[{"time":0,"x":10.86,"y":-1.14},{"time":0.1333,"x":10.48,"y":-2.93},{"time":0.3333,"x":1.78,"y":5.09},{"time":0.5333,"x":12.04,"y":-2.64},{"time":0.6666,"x":10.48,"y":-2.93},{"time":0.8666,"x":1.78,"y":6.43},{"time":1.0666,"x":10.86,"y":-1.14}]},"head":{"rotate":[{"time":0,"angle":-11.7},{"time":0.1333,"angle":-2.87},{"time":0.3333,"angle":-10.46},{"time":0.5333,"angle":-6.46},{"time":0.6666,"angle":-2.85},{"time":0.8666,"angle":-8.52},{"time":1.0666,"angle":-11.7}],"translate":[{"time":0,"x":0,"y":0},{"time":0.1333,"x":-2.96,"y":-3.42},{"time":0.3333,"x":1.04,"y":0.33},{"time":0.5333,"x":0,"y":0},{"time":0.6666,"x":-2.96,"y":-3.42},{"time":0.8666,"x":1.04,"y":0.33},{"time":1.0666,"x":0,"y":0}]},"upperarm2":{"rotate":[{"time":0,"angle":349.66},{"time":0.1333,"angle":349.79},{"time":0.2666,"angle":343.53},{"time":0.4,"angle":334.09},{"time":0.5333,"angle":327.79},{"time":0.8,"angle":338.53},{"time":0.9333,"angle":354.68},{"time":1.0666,"angle":349.66}],"translate":[{"time":0,"x":0,"y":0},{"time":0.1333,"x":-0.76,"y":-1.44},{"time":0.5333,"x":-0.19,"y":8.7},{"time":1.0666,"x":0,"y":0}]},"forearm2":{"rotate":[{"time":0,"angle":21.04},{"time":0.1333,"angle":24.41},{"time":0.2666,"angle":-0.81},{"time":0.4,"angle":23.68},{"time":0.5333,"angle":23.61},{"time":0.6666,"angle":25.56},{"time":0.8,"angle":12.55},{"time":0.9333,"angle":-0.27},{"time":1.0666,"angle":21.04}],"translate":[{"time":0,"x":0,"y":0,"curve":"stepped"},{"time":1.0666,"x":0,"y":0}]},"hand2":{"rotate":[{"time":0,"angle":-12.1},{"time":0.1333,"angle":-8.87},{"time":0.2666,"angle":13.76},{"time":0.4,"angle":-3.02},{"time":0.5333,"angle":11.48},{"time":0.6666,"angle":5.24},{"time":0.8,"angle":3.93},{"time":0.9333,"angle":0.31},{"time":1.0666,"angle":-12.1}],"translate":[{"time":0,"x":0,"y":0,"curve":"stepped"},{"time":1.0666,"x":0,"y":0}]},"root":{"rotate":[{"time":0,"angle":0,"curve":"stepped"},{"time":1.0666,"angle":0}],"translate":[{"time":0,"x":0,"y":0,"curve":"stepped"},{"time":1.0666,"x":0,"y":0}]},"L_Ankle":{"rotate":[{"time":0,"angle":0,"curve":"stepped"},{"time":1.0666,"angle":0}],"translate":[{"time":0,"x":0,"y":0,"curve":"stepped"},{"time":1.0666,"x":0,"y":0}]},"R_Ankle":{"rotate":[{"time":0,"angle":0,"curve":"stepped"},{"time":1.0666,"angle":0}],"translate":[{"time":0,"x":0,"y":-1.35,"curve":"stepped"},{"time":1.0666,"x":0,"y":-1.35}]},"mantles":{"rotate":[{"time":0,"angle":-3.56},{"time":0.3333,"angle":-8.55},{"time":0.5333,"angle":-6.73},{"time":0.8666,"angle":-8.55},{"time":1.0666,"angle":-3.56}],"translate":[{"time":0,"x":0,"y":0},{"time":0.1333,"x":-1.9,"y":-1.47},{"time":0.3333,"x":-0.66,"y":-0.2},{"time":0.6666,"x":-1.9,"y":-1.47},{"time":0.8666,"x":-0.66,"y":-0.2},{"time":1.0666,"x":0,"y":0}]},"shin1":{"rotate":[{"time":0,"angle":0,"curve":"stepped"},{"time":1.0666,"angle":0}],"translate":[{"time":0,"x":0,"y":0,"curve":"stepped"},{"time":1.0666,"x":0,"y":0}]},"shin2":{"rotate":[{"time":0,"angle":0,"curve":"stepped"},{"time":1.0666,"angle":0}],"translate":[{"time":0,"x":0,"y":0,"curve":"stepped"},{"time":1.0666,"x":0,"y":0}]},"weapon":{"rotate":[{"time":0,"angle":0,"curve":"stepped"},{"time":1.0666,"angle":0}],"translate":[{"time":0,"x":0,"y":0,"curve":"stepped"},{"time":1.0666,"x":0,"y":0}]},"LookConstraintGoal":{"rotate":[{"time":0.9333,"angle":0}]}},"events":[{"time":0.5333,"name":"Footstep"},{"time":1.0666,"name":"Footstep"}]}}} \ No newline at end of file diff --git a/spine-corona/examples/hero/images/body.png b/spine-corona/examples/hero/images/body.png new file mode 100644 index 000000000..0ad1fa813 Binary files /dev/null and b/spine-corona/examples/hero/images/body.png differ diff --git a/spine-corona/examples/hero/images/cape.png b/spine-corona/examples/hero/images/cape.png new file mode 100644 index 000000000..2a0b9c4d6 Binary files /dev/null and b/spine-corona/examples/hero/images/cape.png differ diff --git a/spine-corona/examples/hero/images/eyes.png b/spine-corona/examples/hero/images/eyes.png new file mode 100644 index 000000000..81faaa629 Binary files /dev/null and b/spine-corona/examples/hero/images/eyes.png differ diff --git a/spine-corona/examples/hero/images/fingers.png b/spine-corona/examples/hero/images/fingers.png new file mode 100644 index 000000000..241e889c4 Binary files /dev/null and b/spine-corona/examples/hero/images/fingers.png differ diff --git a/spine-corona/examples/hero/images/foot1.png b/spine-corona/examples/hero/images/foot1.png new file mode 100644 index 000000000..2c14a8864 Binary files /dev/null and b/spine-corona/examples/hero/images/foot1.png differ diff --git a/spine-corona/examples/hero/images/foot2.png b/spine-corona/examples/hero/images/foot2.png new file mode 100644 index 000000000..5f4323ea8 Binary files /dev/null and b/spine-corona/examples/hero/images/foot2.png differ diff --git a/spine-corona/examples/hero/images/forearm1.png b/spine-corona/examples/hero/images/forearm1.png new file mode 100644 index 000000000..442577ca7 Binary files /dev/null and b/spine-corona/examples/hero/images/forearm1.png differ diff --git a/spine-corona/examples/hero/images/forearm2.png b/spine-corona/examples/hero/images/forearm2.png new file mode 100644 index 000000000..aee03c528 Binary files /dev/null and b/spine-corona/examples/hero/images/forearm2.png differ diff --git a/spine-corona/examples/hero/images/hand1.png b/spine-corona/examples/hero/images/hand1.png new file mode 100644 index 000000000..61be4568b Binary files /dev/null and b/spine-corona/examples/hero/images/hand1.png differ diff --git a/spine-corona/examples/hero/images/hand2.png b/spine-corona/examples/hero/images/hand2.png new file mode 100644 index 000000000..b8d1c0008 Binary files /dev/null and b/spine-corona/examples/hero/images/hand2.png differ diff --git a/spine-corona/examples/hero/images/head.png b/spine-corona/examples/hero/images/head.png new file mode 100644 index 000000000..f61076441 Binary files /dev/null and b/spine-corona/examples/hero/images/head.png differ diff --git a/spine-corona/examples/hero/images/license.txt b/spine-corona/examples/hero/images/license.txt new file mode 100644 index 000000000..86fb7fa08 --- /dev/null +++ b/spine-corona/examples/hero/images/license.txt @@ -0,0 +1,5 @@ +Copyright (c) 2014, XDTech + +The project file and images in this "Hero" project are provided for +demonstration purposes only and may not be redistributed for any reason nor +used as the basis for derivative work. \ No newline at end of file diff --git a/spine-corona/examples/hero/images/mantles.png b/spine-corona/examples/hero/images/mantles.png new file mode 100644 index 000000000..64951c97e Binary files /dev/null and b/spine-corona/examples/hero/images/mantles.png differ diff --git a/spine-corona/examples/hero/images/mouth.png b/spine-corona/examples/hero/images/mouth.png new file mode 100644 index 000000000..18ea237f0 Binary files /dev/null and b/spine-corona/examples/hero/images/mouth.png differ diff --git a/spine-corona/examples/hero/images/shin1.png b/spine-corona/examples/hero/images/shin1.png new file mode 100644 index 000000000..0f8dcca5b Binary files /dev/null and b/spine-corona/examples/hero/images/shin1.png differ diff --git a/spine-corona/examples/hero/images/shin2.png b/spine-corona/examples/hero/images/shin2.png new file mode 100644 index 000000000..21febdd27 Binary files /dev/null and b/spine-corona/examples/hero/images/shin2.png differ diff --git a/spine-corona/examples/hero/images/sword.png b/spine-corona/examples/hero/images/sword.png new file mode 100644 index 000000000..64cf16bba Binary files /dev/null and b/spine-corona/examples/hero/images/sword.png differ diff --git a/spine-corona/examples/hero/images/thigh1.png b/spine-corona/examples/hero/images/thigh1.png new file mode 100644 index 000000000..cd5e7ff6b Binary files /dev/null and b/spine-corona/examples/hero/images/thigh1.png differ diff --git a/spine-corona/examples/hero/images/thigh2.png b/spine-corona/examples/hero/images/thigh2.png new file mode 100644 index 000000000..11415d861 Binary files /dev/null and b/spine-corona/examples/hero/images/thigh2.png differ diff --git a/spine-corona/examples/hero/images/upperarm1.png b/spine-corona/examples/hero/images/upperarm1.png new file mode 100644 index 000000000..b0e00ac3e Binary files /dev/null and b/spine-corona/examples/hero/images/upperarm1.png differ diff --git a/spine-corona/examples/hero/images/upperarm2.png b/spine-corona/examples/hero/images/upperarm2.png new file mode 100644 index 000000000..d3f098ee1 Binary files /dev/null and b/spine-corona/examples/hero/images/upperarm2.png differ diff --git a/spine-corona/main.lua b/spine-corona/main.lua index 0672c2682..54588f6fa 100644 --- a/spine-corona/main.lua +++ b/spine-corona/main.lua @@ -1,4 +1,5 @@ -require "examples.spineboy" +-- require "examples.spineboy" -- require "examples.goblins" -- require "examples.dragon" +require "examples.hero" diff --git a/spine-corona/spine-corona/spine.lua b/spine-corona/spine-corona/spine.lua index da29acaa5..2ca591561 100644 --- a/spine-corona/spine-corona/spine.lua +++ b/spine-corona/spine-corona/spine.lua @@ -128,10 +128,11 @@ function spine.Skeleton.new (skeletonData, group) end -- Position image based on attachment and bone. if image ~= spine.Skeleton.failed then - local flipX, flipY = ((self.flipX and -1) or 1), ((self.flipY and -1) or 1) + local bone = slot.bone + local flipX, flipY = ((bone.worldFlipX and -1) or 1), ((bone.worldFlipY and -1) or 1) - local x = slot.bone.worldX + attachment.x * slot.bone.m00 + attachment.y * slot.bone.m01 - local y = -(slot.bone.worldY + attachment.x * slot.bone.m10 + attachment.y * slot.bone.m11) + local x = bone.worldX + attachment.x * bone.m00 + attachment.y * bone.m01 + local y = -(bone.worldY + attachment.x * bone.m10 + attachment.y * bone.m11) if not image.lastX then image.x, image.y = x, y image.lastX, image.lastY = x, y @@ -145,16 +146,16 @@ function spine.Skeleton.new (skeletonData, group) -- Fix scaling when attachment is rotated 90 or -90. local rotation = math.abs(attachment.rotation) % 180 if (rotation == 90) then - xScale = xScale * slot.bone.worldScaleY - yScale = yScale * slot.bone.worldScaleX + xScale = xScale * bone.worldScaleY + yScale = yScale * bone.worldScaleX else - xScale = xScale * slot.bone.worldScaleX - yScale = yScale * slot.bone.worldScaleY + xScale = xScale * bone.worldScaleX + yScale = yScale * bone.worldScaleY if rotation ~= 0 and xScale ~= yScale and not image.rotationWarning then image.rotationWarning = true print("WARNING: Non-uniform bone scaling with attachments not rotated to\n" .." cardinal angles will not work as expected with Corona.\n" - .." Bone: "..slot.bone.data.name..", slot: "..slot.data.name..", attachment: "..attachment.name) + .." Bone: "..bone.data.name..", slot: "..slot.data.name..", attachment: "..attachment.name) end end if not image.lastScaleX then @@ -165,7 +166,7 @@ function spine.Skeleton.new (skeletonData, group) image.lastScaleX, image.lastScaleY = xScale, yScale end - rotation = -(slot.bone.worldRotation + attachment.rotation) * flipX * flipY + rotation = -(bone.worldRotation + attachment.rotation) * flipX * flipY if not image.lastRotation then image.rotation = rotation image.lastRotation = rotation @@ -199,13 +200,13 @@ function spine.Skeleton.new (skeletonData, group) bone.line.x = bone.worldX bone.line.y = -bone.worldY bone.line.rotation = -bone.worldRotation - if self.flipX then + if bone.worldFlipX then bone.line.xScale = -1 bone.line.rotation = -bone.line.rotation else bone.line.xScale = 1 end - if self.flipY then + if bone.worldFlipY then bone.line.yScale = -1 bone.line.rotation = -bone.line.rotation else diff --git a/spine-lua/Animation.lua b/spine-lua/Animation.lua index c068e446c..fc27956e5 100644 --- a/spine-lua/Animation.lua +++ b/spine-lua/Animation.lua @@ -83,6 +83,22 @@ local function binarySearch (values, target, step) end end +local function binarySearch1 (values, target) + local low = 0 + local high = math.floor(#values - 1) + if high == 0 then return 1 end + local current = math.floor(high / 2) + while true do + if values[current + 1] <= target then + low = current + 1 + else + high = current + end + if low == high then return low + 1 end + current = math.floor((low + high) / 2) + end +end + local function linearSearch (values, target, step) for i = 0, #values, step do if (values[i] > target) then return i end @@ -419,7 +435,7 @@ function Animation.AttachmentTimeline.new () if time >= frames[#frames] then -- Time is after last frame. frameIndex = #frames else - frameIndex = binarySearch(frames, time, 1) - 1 + frameIndex = binarySearch1(frames, time) - 1 end local attachmentName = self.attachmentNames[frameIndex] @@ -477,7 +493,7 @@ function Animation.EventTimeline.new () if lastTime < frames[0] then frameIndex = 0 else - frameIndex = binarySearch(frames, lastTime, 1) + frameIndex = binarySearch1(frames, lastTime) local frame = frames[frameIndex] while frameIndex > 0 do -- Fire multiple events with the same frame. if frames[frameIndex - 1] ~= frame then break end @@ -522,7 +538,7 @@ function Animation.DrawOrderTimeline.new () if time >= frames[#frames] then -- Time is after last frame. frameIndex = #frames else - frameIndex = binarySearch(frames, time, 1) - 1 + frameIndex = binarySearch1(frames, time) - 1 end local drawOrder = skeleton.drawOrder @@ -542,4 +558,147 @@ function Animation.DrawOrderTimeline.new () return self end +Animation.FfdTimeline = {} +function Animation.FfdTimeline.new () + local self = Animation.CurveTimeline.new() + self.frames = {} + self.frameVertices = {} + self.slotIndex = -1 + + function self:getDuration () + return self.frames[#self.frames] + end + + function self:getFrameCount () + return #self.frames + 1 + end + + function self:setFrame (frameIndex, time, vertices) + self.frames[frameIndex] = time + self.frameVertices[frameIndex] = vertices + end + + function self:apply (skeleton, lastTime, time, firedEvents, alpha) + local slot = skeleton.slots[self.slotIndex] + if slot.attachment ~= attachment then return end + + local frames = self.frames + if time < frames[0] then -- Time is before first frame. + slot.attachmentVerticesCount = 0 + return + end + + local frameVertices = self.frameVertices + local vertexCount = #frameVertices[0] + local vertices = slot.attachmentVertices + if #vertices < vertexCount then + vertices = {} + vertices[vertexCount] = 0 + slot.attachmentVertices = vertices + elseif #vertices < vertexCount then + alpha = 1 -- Don't mix from uninitialized slot vertices. + end + slot.attachmentVerticesCount = vertexCount + + if time >= frames[#frames] then -- Time is after last frame. + local lastVertices = frameVertices[#frames.Length] + if alpha < 1 then + for i = 0, vertexCount do + local vertex = vertices[i] + vertices[i] = vertex + (lastVertices[i] - vertex) * alpha + end + else + for i = 0, vertexCount do + vertices[i] = lastVertices[i] + end + end + return + end + + -- Interpolate between the previous frame and the current frame. + local frameIndex = binarySearch1(frames, time) + local frameTime = frames[frameIndex] + local percent = 1 - (time - frameTime) / (frames[frameIndex - 1] - frameTime) + if percent < 0 then percent = 0 elseif percent > 1 then percent = 1 end + percent = self:getCurvePercent(frameIndex - 1, percent) + + local prevVertices = frameVertices[frameIndex - 1] + local nextVertices = frameVertices[frameIndex] + + if alpha < 1 then + for i = 0, vertexCount do + local prev = prevVertices[i] + local vertices = vertices[i] + vertices[i] = vertices + (prev + (nextVertices[i] - prev) * percent - vertices) * alpha + end + else + for i = 0, vertexCount do + local prev = prevVertices[i] + vertices[i] = prev + (nextVertices[i] - prev) * percent + end + end + end + + return self +end + +Animation.FlipXTimeline = {} +function Animation.FlipXTimeline.new () + local self = { + frames = {}, -- time, flip, ... + boneIndex = -1 + } + + function self:getDuration () + return self.frames[#self.frames - 1] + end + + function self:getFrameCount () + return (#self.frames + 1) / 2 + end + + function self:setFrame (frameIndex, time, flip) + frameIndex = frameIndex * 2 + self.frames[frameIndex] = time + self.frames[frameIndex + 1] = flip + end + + function self:apply (skeleton, lastTime, time, firedEvents, alpha) + local frames = self.frames + if time < frames[0] then + if lastTime > time then self:apply(skeleton, lastTime, 999999, null, 0) end + return + elseif lastTime > time then + lastTime = -1 + end + + local frameIndex + if time >= frames[#frames - 1] then + frameIndex = #frames - 1 + else + frameIndex = binarySearch(frames, time, 2) - 2 + end + if frames[frameIndex] < lastTime then return end + + self:setFlip(skeleton.bones[self.boneIndex], frames[frameIndex + 1]) + end + + function self:setFlip (bone, flip) + bone.flipX = flip + end + + return self +end + +Animation.FlipYTimeline = {} +function Animation.FlipYTimeline.new () + local self = Animation.FlipXTimeline.new() + + function self:setFlip (bone, flip) + bone.flipY = flip + end + + return self +end + return Animation diff --git a/spine-lua/Bone.lua b/spine-lua/Bone.lua index 270a61781..55375d3e8 100644 --- a/spine-lua/Bone.lua +++ b/spine-lua/Bone.lua @@ -30,19 +30,23 @@ local Bone = {} -function Bone.new (data, parent) +function Bone.new (data, skeleton, parent) if not data then error("data cannot be nil", 2) end - + if not skeleton then error("skeleton cannot be nil", 2) end + local self = { data = data, + skeleton = skeleton, parent = parent, x = 0, y = 0, rotation = 0, scaleX = 1, scaleY = 1, + flipX = false, flipY = false, m00 = 0, m01 = 0, worldX = 0, -- a b x m10 = 0, m11 = 0, worldY = 0, -- c d y worldRotation = 0, worldScaleX = 1, worldScaleY = 1, + worldFlipX = false, worldFlipY = false, } function self:updateWorldTransform (flipX, flipY) @@ -62,13 +66,16 @@ function Bone.new (data, parent) else self.worldRotation = self.rotation end + self.worldFlipX = parent.worldFlipX ~= self.flipX + self.worldFlipY = parent.worldFlipY ~= self.flipY else - if flipX then + local skeletonFlipX, skeletonFlipY = self.skeleton.flipX, self.skeleton.flipY + if skeletonFlipX then self.worldX = -self.x else self.worldX = self.x end - if flipY then + if skeletonFlipY then self.worldY = -self.y else self.worldY = self.y @@ -76,21 +83,25 @@ function Bone.new (data, parent) self.worldScaleX = self.scaleX self.worldScaleY = self.scaleY self.worldRotation = self.rotation + self.worldFlipX = skeletonFlipX ~= self.flipX + self.worldFlipY = skeletonFlipY ~= self.flipY end local radians = math.rad(self.worldRotation) local cos = math.cos(radians) local sin = math.sin(radians) - self.m00 = cos * self.worldScaleX - self.m10 = sin * self.worldScaleX - self.m01 = -sin * self.worldScaleY - self.m11 = cos * self.worldScaleY - if flipX then - self.m00 = -self.m00 - self.m01 = -self.m01 + if self.worldFlipX then + self.m00 = -cos * self.worldScaleX + self.m01 = sin * self.worldScaleY + else + self.m00 = cos * self.worldScaleX + self.m01 = -sin * self.worldScaleY end - if flipY then - self.m10 = -self.m10 - self.m11 = -self.m11 + if self.worldFlipY then + self.m10 = -sin * self.worldScaleX + self.m11 = -cos * self.worldScaleY + else + self.m10 = sin * self.worldScaleX + self.m11 = cos * self.worldScaleY end end @@ -101,6 +112,8 @@ function Bone.new (data, parent) self.rotation = data.rotation self.scaleX = data.scaleX self.scaleY = data.scaleY + self.flipX = data.flipX + self.flipY = data.flipY end self:setToSetupPose() diff --git a/spine-lua/Skeleton.lua b/spine-lua/Skeleton.lua index 1e30a5f86..5d0b166c7 100644 --- a/spine-lua/Skeleton.lua +++ b/spine-lua/Skeleton.lua @@ -51,7 +51,7 @@ function Skeleton.new (skeletonData) function self:updateWorldTransform () for i,bone in ipairs(self.bones) do - bone:updateWorldTransform(self.flipX, self.flipY) + bone:updateWorldTransform() end end @@ -165,12 +165,12 @@ function Skeleton.new (skeletonData) for i,boneData in ipairs(skeletonData.bones) do local parent if boneData.parent then parent = self.bones[spine.utils.indexOf(skeletonData.bones, boneData.parent)] end - table.insert(self.bones, Bone.new(boneData, parent)) + table.insert(self.bones, Bone.new(boneData, self, parent)) end for i,slotData in ipairs(skeletonData.slots) do local bone = self.bones[spine.utils.indexOf(skeletonData.bones, slotData.boneData)] - local slot = Slot.new(slotData, self, bone) + local slot = Slot.new(slotData, bone) table.insert(self.slots, slot) self.slotsByName[slot.data.name] = slot table.insert(self.drawOrder, slot) diff --git a/spine-lua/SkeletonJson.lua b/spine-lua/SkeletonJson.lua index 001821220..327444b24 100755 --- a/spine-lua/SkeletonJson.lua +++ b/spine-lua/SkeletonJson.lua @@ -86,6 +86,8 @@ function SkeletonJson.new (attachmentLoader) else boneData.scaleY = 1 end + boneData.flipX = boneMap["flipX"] or false + boneData.flipY = boneMap["flipY"] or false if boneMap["inheritScale"] == false then boneData.inheritScale = false else @@ -375,6 +377,27 @@ function SkeletonJson.new (attachmentLoader) table.insert(timelines, timeline) duration = math.max(duration, timeline:getDuration()) + elseif timelineName == "flipX" or timelineName == "flipY" then + local x = timelineName == "flipX" + local timeline, field + if x then + timeline = Animation.FlipXTimeline.new() + field = "x" + else + timeline = Animation.FlipYTimeline.new(); + field = "y" + end + timeline.boneIndex = boneIndex + + local frameIndex = 0 + for i,valueMap in ipairs(values) do + local flip + timeline:setFrame(frameIndex, valueMap["time"], valueMap[field] or false) + frameIndex = frameIndex + 1 + end + table.insert(timelines, timeline) + duration = math.max(duration, timeline:getDuration()) + else error("Invalid timeline type for a bone: " .. timelineName .. " (" .. boneName .. ")") end diff --git a/spine-lua/Slot.lua b/spine-lua/Slot.lua index c8c993760..bc3722313 100644 --- a/spine-lua/Slot.lua +++ b/spine-lua/Slot.lua @@ -29,19 +29,18 @@ ------------------------------------------------------------------------------- local Slot = {} -function Slot.new (slotData, skeleton, bone) +function Slot.new (slotData, bone) if not slotData then error("slotData cannot be nil", 2) end - if not skeleton then error("skeleton cannot be nil", 2) end if not bone then error("bone cannot be nil", 2) end local self = { data = slotData, - skeleton = skeleton, bone = bone, r = 1, g = 1, b = 1, a = 1, attachment = nil, attachmentTime = 0, - attachmentVertices = nil + attachmentVertices = nil, + attachmentVerticesCount = 0 } function self:setColor (r, g, b, a) @@ -53,15 +52,16 @@ function Slot.new (slotData, skeleton, bone) function self:setAttachment (attachment) self.attachment = attachment - self.attachmentTime = self.skeleton.time + self.attachmentTime = self.bone.skeleton.time + self.attachmentVerticesCount = 0 end function self:setAttachmentTime (time) - self.attachmentTime = self.skeleton.time - time + self.attachmentTime = self.bone.skeleton.time - time end function self:getAttachmentTime () - return self.skeleton.time - self.attachmentTime + return self.bone.skeleton.time - self.attachmentTime end function self:setToSetupPose () @@ -71,7 +71,7 @@ function Slot.new (slotData, skeleton, bone) local attachment if data.attachmentName then - attachment = self.skeleton:getAttachment(data.name, data.attachmentName) + attachment = self.bone.skeleton:getAttachment(data.name, data.attachmentName) end self:setAttachment(attachment) end