浏览代码

Fancier SkeletonTest for trying skeleton files, organized assets.

NathanSweet 11 年之前
父节点
当前提交
fa52abc780

+ 1 - 0
spine-libgdx/.classpath

@@ -1,6 +1,7 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <classpath>
 	<classpathentry kind="src" path="src"/>
+	<classpathentry kind="src" path="assets"/>
 	<classpathentry kind="src" path="test"/>
 	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.6"/>
 	<classpathentry combineaccessrules="false" exported="true" kind="src" path="/gdx-backend-lwjgl"/>

+ 68 - 61
spine-libgdx/test/goblins.atlas → spine-libgdx/assets/goblins/goblins.atlas

@@ -4,281 +4,288 @@ format: RGBA8888
 filter: Linear,Linear
 repeat: none
 dagger
-  rotate: true
-  xy: 372, 100
+  rotate: false
+  xy: 2, 28
   size: 26, 108
   orig: 26, 108
   offset: 0, 0
   index: -1
 goblin/eyes-closed
   rotate: false
-  xy: 380, 8
+  xy: 137, 29
   size: 34, 12
   orig: 34, 12
   offset: 0, 0
   index: -1
 goblin/head
   rotate: false
-  xy: 107, 36
+  xy: 26, 357
   size: 103, 66
   orig: 103, 66
   offset: 0, 0
   index: -1
 goblin/left-arm
   rotate: false
-  xy: 684, 20
+  xy: 30, 28
   size: 37, 35
   orig: 37, 35
   offset: 0, 0
   index: -1
 goblin/left-foot
   rotate: false
-  xy: 773, 95
+  xy: 134, 260
   size: 65, 31
   orig: 65, 31
   offset: 0, 0
   index: -1
 goblin/left-hand
-  rotate: true
-  xy: 779, 57
+  rotate: false
+  xy: 69, 25
   size: 36, 41
   orig: 36, 41
   offset: 0, 0
   index: -1
 goblin/left-lower-leg
-  rotate: true
-  xy: 557, 93
+  rotate: false
+  xy: 134, 293
   size: 33, 70
   orig: 33, 70
   offset: 0, 0
   index: -1
 goblin/left-shoulder
   rotate: false
-  xy: 456, 2
+  xy: 137, 43
   size: 29, 44
   orig: 29, 44
   offset: 0, 0
   index: -1
 goblin/left-upper-leg
-  rotate: true
-  xy: 482, 93
+  rotate: false
+  xy: 30, 65
   size: 33, 73
   orig: 33, 73
   offset: 0, 0
   index: -1
 goblin/neck
-  rotate: true
-  xy: 822, 57
+  rotate: false
+  xy: 201, 387
   size: 36, 41
   orig: 36, 41
   offset: 0, 0
   index: -1
 goblin/pelvis
   rotate: false
-  xy: 456, 48
+  xy: 26, 140
   size: 62, 43
   orig: 62, 43
   offset: 0, 0
   index: -1
 goblin/right-arm
-  rotate: true
-  xy: 972, 73
+  rotate: false
+  xy: 171, 84
   size: 23, 50
   orig: 23, 50
   offset: 0, 0
   index: -1
 goblin/right-foot
   rotate: false
-  xy: 907, 93
+  xy: 134, 225
   size: 63, 33
   orig: 63, 33
   offset: 0, 0
   index: -1
 goblin/right-hand
-  rotate: true
-  xy: 723, 20
+  rotate: false
+  xy: 204, 258
   size: 36, 37
   orig: 36, 37
   offset: 0, 0
   index: -1
 goblin/right-lower-leg
   rotate: false
-  xy: 380, 22
+  xy: 201, 430
   size: 36, 76
   orig: 36, 76
   offset: 0, 0
   index: -1
 goblin/right-shoulder
-  rotate: true
-  xy: 487, 7
+  rotate: false
+  xy: 130, 89
   size: 39, 45
   orig: 39, 45
   offset: 0, 0
   index: -1
 goblin/right-upper-leg
-  rotate: true
-  xy: 584, 57
+  rotate: false
+  xy: 98, 214
   size: 34, 63
   orig: 34, 63
   offset: 0, 0
   index: -1
 goblin/torso
-  rotate: true
-  xy: 212, 34
+  rotate: false
+  xy: 131, 410
   size: 68, 96
   orig: 68, 96
   offset: 0, 0
   index: -1
 goblin/undie-straps
   rotate: false
-  xy: 107, 15
+  xy: 2, 7
   size: 55, 19
   orig: 55, 19
   offset: 0, 0
   index: -1
 goblin/undies
   rotate: false
-  xy: 581, 5
+  xy: 199, 227
   size: 36, 29
   orig: 36, 29
   offset: 0, 0
   index: -1
 goblingirl/eyes-closed
   rotate: false
-  xy: 164, 13
+  xy: 59, 2
   size: 37, 21
   orig: 37, 21
   offset: 0, 0
   index: -1
 goblingirl/head
   rotate: false
-  xy: 2, 21
+  xy: 26, 425
   size: 103, 81
   orig: 103, 81
   offset: 0, 0
   index: -1
 goblingirl/left-arm
   rotate: false
-  xy: 762, 20
+  xy: 201, 190
   size: 37, 35
   orig: 37, 35
   offset: 0, 0
   index: -1
 goblingirl/left-foot
   rotate: false
-  xy: 840, 95
+  xy: 134, 192
   size: 65, 31
   orig: 65, 31
   offset: 0, 0
   index: -1
 goblingirl/left-hand
-  rotate: true
-  xy: 865, 58
+  rotate: false
+  xy: 196, 109
   size: 35, 40
   orig: 35, 40
   offset: 0, 0
   index: -1
 goblingirl/left-lower-leg
-  rotate: true
-  xy: 629, 93
+  rotate: false
+  xy: 169, 293
   size: 33, 70
   orig: 33, 70
   offset: 0, 0
   index: -1
 goblingirl/left-shoulder
-  rotate: true
-  xy: 907, 63
+  rotate: false
+  xy: 107, 30
   size: 28, 46
   orig: 28, 46
   offset: 0, 0
   index: -1
 goblingirl/left-upper-leg
-  rotate: true
-  xy: 701, 93
+  rotate: false
+  xy: 65, 68
   size: 33, 70
   orig: 33, 70
   offset: 0, 0
   index: -1
 goblingirl/neck
-  rotate: true
-  xy: 641, 20
+  rotate: false
+  xy: 204, 297
   size: 35, 41
   orig: 35, 41
   offset: 0, 0
   index: -1
 goblingirl/pelvis
   rotate: false
-  xy: 520, 48
+  xy: 131, 365
   size: 62, 43
   orig: 62, 43
   offset: 0, 0
   index: -1
 goblingirl/right-arm
-  rotate: true
-  xy: 972, 98
+  rotate: false
+  xy: 100, 97
   size: 28, 50
   orig: 28, 50
   offset: 0, 0
   index: -1
 goblingirl/right-foot
   rotate: false
-  xy: 714, 58
+  xy: 134, 157
   size: 63, 33
   orig: 63, 33
   offset: 0, 0
   index: -1
 goblingirl/right-hand
-  rotate: true
-  xy: 801, 19
+  rotate: false
+  xy: 199, 151
   size: 36, 37
   orig: 36, 37
   offset: 0, 0
   index: -1
 goblingirl/right-lower-leg
   rotate: false
-  xy: 418, 22
+  xy: 96, 279
   size: 36, 76
   orig: 36, 76
   offset: 0, 0
   index: -1
 goblingirl/right-shoulder
-  rotate: true
-  xy: 534, 7
+  rotate: false
+  xy: 204, 340
   size: 39, 45
   orig: 39, 45
   offset: 0, 0
   index: -1
 goblingirl/right-upper-leg
-  rotate: true
-  xy: 649, 57
+  rotate: false
+  xy: 98, 149
   size: 34, 63
   orig: 34, 63
   offset: 0, 0
   index: -1
 goblingirl/torso
   rotate: false
-  xy: 310, 2
+  xy: 26, 259
   size: 68, 96
   orig: 68, 96
   offset: 0, 0
   index: -1
 goblingirl/undie-straps
   rotate: false
-  xy: 584, 36
+  xy: 134, 136
   size: 55, 19
   orig: 55, 19
   offset: 0, 0
   index: -1
 goblingirl/undies
-  rotate: true
-  xy: 840, 19
+  rotate: false
+  xy: 196, 78
   size: 36, 29
   orig: 36, 29
   offset: 0, 0
   index: -1
+shield
+  rotate: false
+  xy: 26, 185
+  size: 70, 72
+  orig: 70, 72
+  offset: 0, 0
+  index: -1
 spear
-  rotate: true
-  xy: 2, 104
+  rotate: false
+  xy: 2, 138
   size: 22, 368
   orig: 22, 368
   offset: 0, 0

+ 1012 - 0
spine-libgdx/assets/goblins/goblins.json

@@ -0,0 +1,1012 @@
+{
+"bones": [
+	{ "name": "root" },
+	{ "name": "hip", "parent": "root", "x": 0.64, "y": 114.41 },
+	{ "name": "left upper leg", "parent": "hip", "length": 50.39, "x": 14.45, "y": 2.81, "rotation": -89.09 },
+	{ "name": "pelvis", "parent": "hip", "x": 1.41, "y": -6.57 },
+	{ "name": "right upper leg", "parent": "hip", "length": 42.45, "x": -20.07, "y": -6.83, "rotation": -97.49 },
+	{ "name": "torso", "parent": "hip", "length": 85.82, "x": -6.42, "y": 1.97, "rotation": 93.92 },
+	{ "name": "left lower leg", "parent": "left upper leg", "length": 49.89, "x": 56.34, "y": 0.98, "rotation": -16.65 },
+	{ "name": "left shoulder", "parent": "torso", "length": 35.43, "x": 74.04, "y": -20.38, "rotation": -156.96 },
+	{ "name": "neck", "parent": "torso", "length": 18.38, "x": 81.67, "y": -6.34, "rotation": -1.51 },
+	{ "name": "right lower leg", "parent": "right upper leg", "length": 58.52, "x": 42.99, "y": -0.61, "rotation": -14.34 },
+	{ "name": "right shoulder", "parent": "torso", "length": 37.24, "x": 76.02, "y": 18.14, "rotation": 133.88 },
+	{ "name": "head", "parent": "neck", "length": 68.28, "x": 20.93, "y": 11.59, "rotation": -13.92 },
+	{ "name": "left arm", "parent": "left shoulder", "length": 35.62, "x": 37.85, "y": -2.34, "rotation": 28.16 },
+	{ "name": "left foot", "parent": "left lower leg", "length": 46.5, "x": 58.94, "y": -7.61, "rotation": 102.43 },
+	{ "name": "right arm", "parent": "right shoulder", "length": 36.74, "x": 37.6, "y": 0.31, "rotation": 36.32 },
+	{ "name": "right foot", "parent": "right lower leg", "length": 45.45, "x": 64.88, "y": 0.04, "rotation": 110.3 },
+	{ "name": "left hand", "parent": "left arm", "length": 11.52, "x": 35.62, "y": 0.07, "rotation": 2.7 },
+	{ "name": "right hand", "parent": "right arm", "length": 15.32, "x": 36.9, "y": 0.34, "rotation": 2.35 }
+],
+"slots": [
+	{ "name": "left shoulder", "bone": "left shoulder", "attachment": "left shoulder" },
+	{ "name": "left arm", "bone": "left arm", "attachment": "left arm" },
+	{ "name": "left hand item", "bone": "left hand", "attachment": "spear" },
+	{ "name": "left hand", "bone": "left hand", "attachment": "left hand" },
+	{ "name": "left foot", "bone": "left foot", "attachment": "left foot" },
+	{ "name": "left lower leg", "bone": "left lower leg", "attachment": "left lower leg" },
+	{ "name": "left upper leg", "bone": "left upper leg", "attachment": "left upper leg" },
+	{ "name": "neck", "bone": "neck", "attachment": "neck" },
+	{ "name": "torso", "bone": "torso", "attachment": "torso" },
+	{ "name": "pelvis", "bone": "pelvis", "attachment": "pelvis" },
+	{ "name": "right foot", "bone": "right foot", "attachment": "right foot" },
+	{ "name": "right lower leg", "bone": "right lower leg", "attachment": "right lower leg" },
+	{ "name": "undie straps", "bone": "pelvis", "attachment": "undie straps" },
+	{ "name": "undies", "bone": "pelvis", "attachment": "undies" },
+	{ "name": "right upper leg", "bone": "right upper leg", "attachment": "right upper leg" },
+	{ "name": "head", "bone": "head", "attachment": "head" },
+	{ "name": "eyes", "bone": "head" },
+	{ "name": "right shoulder", "bone": "right shoulder", "attachment": "right shoulder" },
+	{ "name": "right arm", "bone": "right arm", "attachment": "right arm" },
+	{ "name": "right hand thumb", "bone": "right hand", "attachment": "right hand thumb" },
+	{ "name": "right hand item", "bone": "right hand", "attachment": "dagger" },
+	{ "name": "right hand", "bone": "right hand", "attachment": "right hand" },
+	{ "name": "right hand item 2", "bone": "right hand", "attachment": "shield" }
+],
+"skins": {
+	"default": {
+		"left hand item": {
+			"dagger": { "x": 7.88, "y": -23.45, "rotation": 10.47, "width": 26, "height": 108 },
+			"spear": {
+				"type": "mesh",
+				"vertices": [ -26.02, 180.65, -29.24, 172.19, 41.7, -138.95, 32.42, -141.1, -41.49, 169.49, -47.22, 174.67, -47.08, 218.22, -44.27, 218.87 ],
+				"triangles": [ 4, 5, 6, 1, 7, 0, 1, 3, 4, 6, 7, 1, 1, 4, 6, 2, 3, 1 ],
+				"uvs": [ 1, 0.11236, 0.77096, 0.13278, 0.72117, 1, 0.28838, 1, 0.20043, 0.13242, 0, 0.11519, 0.4527, 0, 0.58399, 0 ],
+				"edges": [ 12, 10, 10, 8, 8, 6, 4, 6, 4, 2, 2, 0, 12, 14, 0, 14 ],
+				"hull": 16,
+				"width": 22,
+				"height": 368
+			}
+		},
+		"right hand item": {
+			"dagger": {
+				"type": "mesh",
+				"vertices": [ 15.49, -12.82, 21.13, -13.57, 20.16, -20.49, 13.15, -21.67, 8.13, -58.56, -5.13, -77.04, -9.92, -76.36, -7.79, -53.6, -0.03, -20.36, -5.6, -17.04, -4.63, -10.17, 1.12, -10.93, 7.46, 30.24, 26.93, 27.49 ],
+				"triangles": [ 0, 12, 13, 11, 12, 0, 0, 1, 2, 9, 10, 11, 3, 11, 0, 3, 0, 2, 8, 11, 3, 9, 11, 8, 5, 6, 7, 4, 5, 8, 4, 8, 3, 5, 7, 8 ],
+				"uvs": [ 0.78091, 0.38453, 1, 0.38405, 1, 0.44881, 0.73953, 0.4687, 0.74641, 0.81344, 0.34022, 1, 0.15434, 1, 0.11303, 0.78858, 0.23007, 0.47367, 0, 0.45047, 0, 0.38621, 0.22367, 0.38573, 0.24384, 0, 1, 0 ],
+				"edges": [ 22, 20, 24, 26, 22, 24, 2, 0, 0, 22, 0, 26, 12, 14, 14, 16, 18, 20, 16, 18, 2, 4, 4, 6, 6, 8, 10, 12, 8, 10 ],
+				"hull": 28,
+				"width": 26,
+				"height": 108
+			}
+		},
+		"right hand item 2": {
+			"shield": { "rotation": 93.49, "width": 70, "height": 72 }
+		}
+	},
+	"goblin": {
+		"eyes": {
+			"eyes closed": { "name": "goblin/eyes-closed", "x": 29.19, "y": -24.89, "rotation": -88.92, "width": 34, "height": 12 }
+		},
+		"head": {
+			"head": {
+				"name": "goblin/head",
+				"type": "mesh",
+				"vertices": [ 14.56, 50.42, 23.12, 35.47, 17.46, 26.36, 11.57, 16.86, 3.74, 11.71, -5.89, -3.91, -11.83, -37.23, -8.31, -45.63, 7.75, -44.24, 10.39, -51.33, 19.52, -51.82, 25.21, -43.15, 26.12, -47.43, 27.35, -53.16, 34.84, -53.46, 35.96, -47.33, 37.11, -41.08, 43.75, -33.97, 53.58, -19.87, 54.5, 0.03, 43.31, 19.16, 35.6, 23.41, 35.89, 40.17, 28.39, 49.87, 10.25, 5.99, 24.2, 2, 35.55, 12.48, 9.39, -25.1, 16.8, -24.31, 17.2, -40.65, 20.68, -33.02 ],
+				"triangles": [ 26, 20, 19, 21, 20, 26, 15, 14, 13, 12, 15, 13, 11, 16, 15, 11, 15, 12, 26, 17, 25, 18, 26, 19, 17, 26, 18, 30, 25, 17, 30, 17, 16, 30, 16, 11, 1, 22, 21, 23, 22, 1, 2, 1, 21, 2, 21, 26, 29, 30, 11, 29, 11, 10, 28, 25, 30, 0, 23, 1, 9, 29, 10, 25, 3, 2, 25, 2, 26, 29, 27, 28, 29, 28, 30, 24, 3, 25, 24, 25, 28, 24, 28, 27, 8, 29, 9, 27, 29, 8, 4, 3, 24, 5, 24, 27, 4, 24, 5, 7, 6, 27, 7, 27, 8, 5, 27, 6 ],
+				"uvs": [ 0, 0.60494, 0.14172, 0.5145, 0.24218, 0.55229, 0.32667, 0.67806, 0.37969, 0.79352, 0.53505, 0.93014, 0.86056, 1, 0.94071, 0.94169, 0.92098, 0.69923, 0.9888, 0.65497, 0.99003, 0.51643, 0.89632, 0.43561, 0.94487, 0.41916, 1, 0.39713, 1, 0.2836, 0.94017, 0.27027, 0.87906, 0.25666, 0.80754, 0.16044, 0.66698, 0.01997, 0.4734, 0.01805, 0.29215, 0.19893, 0.25392, 0.31823, 0.09117, 0.324, 0, 0.44331, 0.43271, 0.69153, 0.466, 0.47794, 0.35996, 0.31246, 0.73473, 0.68593, 0.72215, 0.57425, 0.88179, 0.5583, 0.80267, 0.51015 ],
+				"edges": [ 0, 2, 6, 8, 8, 10, 10, 12, 12, 14, 14, 16, 16, 18, 18, 20, 20, 22, 26, 28, 32, 34, 34, 36, 36, 38, 38, 40, 40, 42, 42, 44, 44, 46, 0, 46, 6, 48, 48, 50, 50, 52, 52, 42, 2, 4, 4, 6, 4, 52, 2, 44, 22, 32, 22, 24, 24, 26, 28, 30, 30, 32, 24, 30, 16, 54, 54, 56, 20, 58, 58, 54, 16, 58, 22, 60, 60, 56, 58, 60 ],
+				"hull": 48,
+				"width": 103,
+				"height": 66
+			}
+		},
+		"left arm": {
+			"left arm": {
+				"name": "goblin/left-arm",
+				"type": "mesh",
+				"vertices": [ 18.6, 8.81, 32.19, 10.31, 38.02, 1.62, 38.08, -9.63, 32.31, -13.49, 14.37, -9.62, -0.75, -10.78, -9.84, 2.77, 1.29, 10.25 ],
+				"triangles": [ 6, 7, 8, 5, 6, 8, 0, 5, 8, 0, 1, 2, 5, 0, 2, 4, 5, 2, 3, 4, 2 ],
+				"uvs": [ 0.68992, 0.29284, 1, 0.46364, 1, 0.74643, 0.84089, 1, 0.66344, 1, 0.33765, 0.64284, 0, 0.44124, 0, 0, 0.34295, 0 ],
+				"edges": [ 14, 16, 16, 0, 0, 2, 2, 4, 6, 4, 6, 8, 8, 10, 12, 14, 10, 12 ],
+				"hull": 18,
+				"width": 37,
+				"height": 35
+			}
+		},
+		"left foot": {
+			"left foot": {
+				"name": "goblin/left-foot",
+				"type": "mesh",
+				"vertices": [ 2.28, 13.07, -1.76, -1.64, 3.59, -7.8, 20.25, -6.04, 37.91, -5.27, 58.12, -3.71, 57.31, 3.34, 47.78, 9.51, 31.95, 15.05, 21.99, 24.11, 24.03, 0.75, 42.21, 1.16 ],
+				"triangles": [ 0, 9, 8, 10, 0, 8, 10, 8, 7, 11, 10, 7, 11, 7, 6, 1, 0, 10, 11, 6, 5, 3, 1, 10, 4, 10, 11, 4, 11, 5, 3, 10, 4, 2, 1, 3 ],
+				"uvs": [ 0.15733, 0.31873, 0.08195, 0.78502, 0.15884, 0.99366, 0.41633, 0.96804, 0.68822, 0.97636, 1, 0.96388, 0.99385, 0.73501, 0.85294, 0.51862, 0.61479, 0.31056, 0.46991, 0, 0.48032, 0.75604, 0.75994, 0.77706 ],
+				"edges": [ 0, 2, 2, 4, 4, 6, 6, 8, 8, 10, 10, 12, 12, 14, 14, 16, 16, 18, 0, 18, 6, 20, 20, 16, 2, 20, 8, 22, 22, 14, 20, 22, 22, 10 ],
+				"hull": 20,
+				"width": 65,
+				"height": 31
+			}
+		},
+		"left hand": {
+			"left hand": {
+				"name": "goblin/left-hand",
+				"type": "mesh",
+				"vertices": [ -3.11, 15.42, 10.83, 22.27, 15.5, 14.55, 18.35, -8.96, 9.48, -14.32, -4.58, -14.3, -11.63, -2.63, -14.89, 13.68, -7.75, 17.99 ],
+				"triangles": [ 2, 0, 1, 0, 5, 6, 6, 7, 0, 0, 7, 8, 3, 4, 0, 4, 5, 0, 2, 3, 0 ],
+				"uvs": [ 0.518, 0.12578, 1, 0.16285, 0.99788, 0.50578, 0.69745, 1, 0.37445, 1, 0, 0.80051, 0, 0.42792, 0.17601, 0, 0.43567, 0 ],
+				"edges": [ 16, 0, 0, 2, 2, 4, 4, 6, 6, 8, 8, 10, 10, 12, 14, 16, 12, 14 ],
+				"hull": 18,
+				"width": 36,
+				"height": 41
+			}
+		},
+		"left lower leg": {
+			"left lower leg": {
+				"name": "goblin/left-lower-leg",
+				"type": "mesh",
+				"vertices": [ -0.19, 6.82, 30.97, 10.96, 37.97, 17.33, 53.88, 12.6, 57.58, 6.31, 59.34, 0.08, 55.04, -8.63, 32.99, -9.33, 20.79, -17.43, -7.27, -21.56, -8.19, -18.29 ],
+				"triangles": [ 10, 8, 9, 1, 7, 10, 7, 8, 10, 0, 1, 10, 1, 4, 7, 3, 1, 2, 5, 6, 7, 7, 4, 5, 1, 3, 4 ],
+				"uvs": [ 0.95508, 0.20749, 0.81927, 0.65213, 0.94754, 0.77308, 0.67842, 0.97346, 0.46463, 1, 0.26845, 1, 0.04963, 0.90706, 0.2106, 0.60115, 0.07478, 0.40195, 0.18545, 0, 0.28857, 0 ],
+				"edges": [ 20, 0, 0, 2, 2, 4, 4, 6, 6, 8, 8, 10, 10, 12, 12, 14, 14, 16, 18, 20, 16, 18 ],
+				"hull": 22,
+				"width": 33,
+				"height": 70
+			}
+		},
+		"left shoulder": {
+			"left shoulder": {
+				"name": "goblin/left-shoulder",
+				"type": "mesh",
+				"vertices": [ 15.18, 5.74, 32.17, 5.32, 41.79, 0.21, 36.63, -9.5, 14.88, -9.72, 0.9, -10.89, -10.66, -4.74, -4.66, 6.54 ],
+				"triangles": [ 5, 6, 7, 4, 5, 7, 4, 7, 0, 3, 4, 0, 3, 0, 1, 3, 1, 2 ],
+				"uvs": [ 0.7377, 0.40692, 1, 0.75237, 1, 1, 0.62046, 1, 0.26184, 0.56601, 0, 0.29783, 0, 0, 0.44115, 0 ],
+				"edges": [ 12, 14, 14, 0, 4, 2, 0, 2, 4, 6, 6, 8, 10, 12, 8, 10 ],
+				"hull": 16,
+				"width": 29,
+				"height": 44
+			}
+		},
+		"left upper leg": {
+			"left upper leg": {
+				"name": "goblin/left-upper-leg",
+				"type": "mesh",
+				"vertices": [ 2.33, 13.06, 33.5, 12.57, 51, 9.34, 66.32, 4.31, 63, -10.71, 43.13, -20.58, 8.91, -20.04, -6.79, -2.64, -6.61, 9.1 ],
+				"triangles": [ 7, 8, 0, 5, 6, 7, 0, 1, 7, 4, 5, 7, 1, 4, 7, 2, 4, 1, 3, 4, 2 ],
+				"uvs": [ 1, 0.12167, 1, 0.54873, 0.91067, 0.78907, 0.76567, 1, 0.3087, 0.9579, 0, 0.68777, 0, 0.219, 0.51961, 0, 0.87552, 0 ],
+				"edges": [ 10, 8, 8, 6, 6, 4, 4, 2, 10, 12, 12, 14, 14, 16, 2, 0, 16, 0 ],
+				"hull": 18,
+				"width": 33,
+				"height": 73
+			}
+		},
+		"neck": {
+			"neck": {
+				"name": "goblin/neck",
+				"type": "mesh",
+				"vertices": [ 18.62, -11.65, -3.98, -13.85, -10.28, 2.76, -6.91, 13.89, 0.8, 19.05, 10.06, 11.51, 16.74, 12.45, 22.71, 17.64, 31.4, 12.19, 30.12, -7.67, 8.05, -6.71 ],
+				"triangles": [ 6, 8, 9, 6, 9, 0, 7, 8, 6, 10, 5, 6, 0, 10, 6, 10, 0, 1, 3, 4, 5, 2, 5, 10, 2, 10, 1, 3, 5, 2 ],
+				"uvs": [ 0.81967, 0.27365, 0.92101, 0.82048, 0.47134, 1, 0.15679, 0.9354, 0, 0.7556, 0.19268, 0.51833, 0.15468, 0.35706, 0, 0.21989, 0.13568, 0, 0.68878, 0, 0.70145, 0.53872 ],
+				"edges": [ 14, 12, 12, 10, 10, 8, 8, 6, 6, 4, 4, 2, 2, 20, 20, 0, 0, 18, 16, 18, 14, 16, 0, 2 ],
+				"hull": 20,
+				"width": 36,
+				"height": 41
+			}
+		},
+		"pelvis": {
+			"pelvis": {
+				"name": "goblin/pelvis",
+				"type": "mesh",
+				"vertices": [ 25.38, -20.73, -36.61, -20.73, -36.61, 22.26, 25.38, 22.26 ],
+				"triangles": [ 1, 2, 3, 1, 3, 0 ],
+				"uvs": [ 1, 1, 0, 1, 0, 0, 1, 0 ],
+				"edges": [ 0, 2, 2, 4, 4, 6, 0, 6 ],
+				"hull": 8,
+				"width": 62,
+				"height": 43
+			}
+		},
+		"right arm": {
+			"right arm": {
+				"name": "goblin/right-arm",
+				"type": "mesh",
+				"vertices": [ -4.75, 8.89, 33.03, 11.74, 40.99, 5.89, 41.81, -5.03, 35.53, -11.13, -2.53, -9.2, -8.5, -2.71, -9.09, 5.18 ],
+				"triangles": [ 6, 7, 0, 2, 3, 5, 4, 5, 3, 1, 6, 0, 6, 2, 5, 1, 2, 6 ],
+				"uvs": [ 1, 0.09223, 1, 0.8501, 0.72058, 1, 0.24384, 1, 0, 0.86558, 0.20822, 0.10919, 0.50903, 0, 0.85342, 0 ],
+				"edges": [ 8, 6, 4, 6, 4, 2, 12, 14, 2, 0, 14, 0, 10, 12, 8, 10 ],
+				"hull": 16,
+				"width": 23,
+				"height": 50
+			}
+		},
+		"right foot": {
+			"right foot": {
+				"name": "goblin/right-foot",
+				"type": "mesh",
+				"vertices": [ 17.36, 25.99, 29.13, 15.44, 39.89, 10.8, 48.14, 7.24, 53.84, -2.38, 49.43, -6, 34.84, -6.39, 16.84, -6.87, -2.4, -7.38, -7.58, -3.86, -7.78, 3.7, -7.95, 10.1, -2.57, 22.36, 10.84, 25.97, 22.14, 2.75, 37.31, 2.03 ],
+				"triangles": [ 1, 10, 11, 1, 13, 0, 14, 1, 2, 1, 12, 13, 12, 1, 11, 14, 10, 1, 15, 14, 2, 15, 2, 3, 9, 10, 14, 15, 3, 4, 7, 8, 9, 14, 7, 9, 6, 14, 15, 5, 6, 15, 7, 14, 6, 4, 5, 15 ],
+				"uvs": [ 0.40851, 0.0047, 0.59087, 0.33404, 0.75959, 0.48311, 0.88907, 0.59751, 0.97532, 0.89391, 0.90385, 1, 0.6722, 1, 0.38633, 1, 0.08074, 1, 0, 0.88921, 0, 0.65984, 0, 0.46577, 0.0906, 0.0988, 0.305, 0, 0.47461, 0.71257, 0.715, 0.74681 ],
+				"edges": [ 0, 2, 6, 8, 8, 10, 16, 18, 22, 24, 24, 26, 0, 26, 10, 12, 2, 4, 4, 6, 12, 14, 14, 16, 18, 20, 20, 22, 2, 28, 28, 14, 20, 28, 4, 30, 30, 12, 28, 30, 30, 8 ],
+				"hull": 28,
+				"width": 63,
+				"height": 33
+			}
+		},
+		"right hand": {
+			"right hand": {
+				"name": "goblin/right-hand",
+				"type": "mesh",
+				"vertices": [ -10.82, -9.45, 5.95, -15.34, 18.88, -14.9, 24, -7.5, 25.69, 5.16, 25.31, 16.07, 18.61, 17.44, 15.84, 14.74, 6.84, 15.02, 0.81, 19.18, -11.41, 7.83 ],
+				"triangles": [ 8, 10, 9, 0, 10, 1, 8, 2, 1, 8, 1, 10, 7, 3, 8, 3, 2, 8, 4, 3, 7, 5, 7, 6, 4, 7, 5 ],
+				"uvs": [ 0.17957, 0, 0, 0.44772, 0, 0.79734, 0.20057, 0.94264, 0.55057, 1, 0.8539, 1, 0.89823, 0.82004, 0.8259, 0.74285, 0.84223, 0.49993, 0.96356, 0.34102, 0.66023, 0 ],
+				"edges": [ 0, 2, 2, 4, 4, 6, 6, 8, 8, 10, 10, 12, 12, 14, 14, 16, 16, 18, 18, 20, 0, 20 ],
+				"hull": 22,
+				"width": 36,
+				"height": 37
+			}
+		},
+		"right hand thumb": {
+			"right hand thumb": {
+				"name": "goblin/right-hand",
+				"type": "mesh",
+				"vertices": [ -2.82, 15.97, 2.4, 11.71, 18.08, 11.9, 20.27, 19.27, 11.09, 20.62 ],
+				"triangles": [ 1, 0, 4, 2, 1, 4, 3, 2, 4 ],
+				"uvs": [ 0.88538, 0.22262, 0.76167, 0.3594, 0.75088, 0.78308, 0.95326, 0.84981, 1, 0.60302 ],
+				"edges": [ 2, 4, 4, 6, 6, 8, 2, 0, 0, 8 ],
+				"hull": 10,
+				"width": 36,
+				"height": 37
+			}
+		},
+		"right lower leg": {
+			"right lower leg": {
+				"name": "goblin/right-lower-leg",
+				"type": "mesh",
+				"vertices": [ 6.26, 8.46, 23.32, 8.04, 37.1, 12.89, 41.45, 20.82, 53.07, 21.46, 61.33, 10.06, 65.77, -1.03, 58.99, -9.19, 43.02, -9.81, 16.33, -20, -12.79, -9.26 ],
+				"triangles": [ 1, 10, 0, 9, 10, 1, 8, 9, 1, 2, 8, 1, 4, 2, 3, 6, 7, 8, 5, 6, 8, 2, 5, 8, 4, 5, 2 ],
+				"uvs": [ 1, 0.27261, 0.81312, 0.52592, 0.79587, 0.71795, 0.95544, 0.80988, 0.85193, 0.95493, 0.47241, 1, 0.14033, 1, 0, 0.8773, 0.14896, 0.67914, 0.1619, 0.30325, 0.60611, 0 ],
+				"edges": [ 0, 2, 2, 4, 4, 6, 6, 8, 8, 10, 10, 12, 12, 14, 14, 16, 16, 18, 0, 20, 18, 20 ],
+				"hull": 22,
+				"width": 36,
+				"height": 76
+			}
+		},
+		"right shoulder": {
+			"right shoulder": {
+				"name": "goblin/right-shoulder",
+				"type": "mesh",
+				"vertices": [ -3.17, -11.05, -9, -0.57, -1.01, 10.33, 16.69, 11.17, 37.41, 8.2, 45.45, -1.16, 36.95, -8.46, 21.2, -7.47 ],
+				"triangles": [ 2, 3, 0, 2, 0, 1, 7, 0, 3, 4, 5, 6, 4, 7, 3, 4, 6, 7 ],
+				"uvs": [ 0.62008, 0.03708, 0.92131, 0.09048, 1, 0.38319, 0.72049, 0.6937, 0.31656, 1, 0, 1, 0, 0.75106, 0.28233, 0.49988 ],
+				"edges": [ 10, 12, 12, 14, 14, 0, 0, 2, 2, 4, 4, 6, 8, 10, 6, 8 ],
+				"hull": 16,
+				"width": 39,
+				"height": 45
+			}
+		},
+		"right upper leg": {
+			"right upper leg": {
+				"name": "goblin/right-upper-leg",
+				"type": "mesh",
+				"vertices": [ -9.85, -10.37, 2.17, -14.07, 35.49, -13.66, 47.29, -12.11, 52.61, -2.26, 51.63, 5.16, 40.51, 10.18, 19.13, 18.47, 2.85, 16.32, -8.4, 6.14 ],
+				"triangles": [ 9, 8, 7, 9, 1, 0, 6, 9, 7, 6, 1, 9, 2, 1, 6, 4, 3, 2, 6, 4, 2, 5, 4, 6 ],
+				"uvs": [ 0.27018, 0, 0.11618, 0.18177, 0, 0.70688, 0, 0.89577, 0.26668, 1, 0.48718, 1, 0.67618, 0.83532, 1, 0.5161, 1, 0.25543, 0.74618, 0.0571 ],
+				"edges": [ 0, 2, 2, 4, 4, 6, 6, 8, 8, 10, 10, 12, 12, 14, 14, 16, 16, 18, 0, 18 ],
+				"hull": 20,
+				"width": 34,
+				"height": 63
+			}
+		},
+		"torso": {
+			"torso": {
+				"name": "goblin/torso",
+				"type": "mesh",
+				"vertices": [ 56.93, 27.95, 43.37, 18.23, 30.16, 19.5, 11.53, 21.28, -2.55, 10.69, -10.89, -13.12, -11.59, -21.23, 8.54, -36.12, 19.65, -37.08, 28.68, -37.86, 37.68, -34, 45.98, -30.44, 56.4, -29.07, 84.78, -20.92, 87.9, 15.15, 81.88, 25.79, 1.67, -21.01, 10.03, 2.18, 25.23, -21.69, 29.98, 0, 48.54, -8.39, 13.98, -21.36, 35.9, -15.6 ],
+				"triangles": [ 0, 15, 14, 20, 14, 13, 20, 13, 12, 1, 0, 14, 20, 12, 11, 20, 1, 14, 22, 20, 11, 22, 11, 10, 19, 1, 20, 19, 20, 22, 2, 1, 19, 18, 22, 10, 18, 10, 9, 19, 22, 18, 18, 9, 8, 21, 18, 8, 21, 8, 7, 17, 2, 19, 21, 17, 19, 21, 19, 18, 3, 2, 17, 16, 21, 7, 17, 21, 16, 4, 3, 17, 5, 17, 16, 4, 17, 5, 6, 16, 7, 5, 16, 6 ],
+				"uvs": [ 0, 0.33287, 0.15945, 0.46488, 0.15761, 0.60314, 0.15502, 0.79806, 0.32807, 0.93478, 0.6875, 1, 0.80731, 1, 1, 0.77763, 1, 0.66147, 1, 0.56703, 0.93207, 0.4771, 0.86944, 0.39416, 0.83837, 0.226, 0.68085, 0, 0.14836, 0, 0, 0.07199, 0.78734, 0.86249, 0.43679, 0.79649, 0.76738, 0.61733, 0.44345, 0.58747, 0.54329, 0.38316, 0.77692, 0.73446, 0.66478, 0.51012 ],
+				"edges": [ 0, 2, 6, 8, 8, 10, 10, 12, 12, 14, 22, 24, 24, 26, 26, 28, 28, 30, 0, 30, 14, 32, 32, 34, 34, 6, 18, 36, 36, 38, 2, 4, 4, 6, 38, 4, 2, 40, 40, 22, 40, 38, 38, 34, 32, 10, 34, 8, 40, 28, 14, 16, 16, 18, 32, 42, 42, 36, 16, 42, 42, 34, 18, 20, 20, 22, 36, 44, 44, 40, 20, 44 ],
+				"hull": 32,
+				"width": 68,
+				"height": 96
+			}
+		},
+		"undie straps": {
+			"undie straps": {
+				"name": "goblin/undie-straps",
+				"type": "mesh",
+				"vertices": [ -10.56, 12.87, 6.53, 9.9, 25.62, 17.71, 25.62, 10.56, 11.97, 2.41, -9.09, 2.41, -31, 16.39, -31, 21.41, -23.92, 21.41 ],
+				"triangles": [ 6, 7, 8, 6, 8, 0, 3, 1, 2, 5, 0, 1, 6, 0, 5, 4, 1, 3, 5, 1, 4 ],
+				"uvs": [ 0.36097, 0.44959, 0.66297, 0.60591, 1, 0.19486, 1, 0.57117, 0.75897, 1, 0.38697, 1, 0, 0.26433, 0, 0, 0.12497, 0 ],
+				"edges": [ 14, 16, 16, 0, 0, 2, 2, 4, 4, 6, 6, 8, 8, 10, 12, 14, 10, 12, 0, 10, 2, 8 ],
+				"hull": 18,
+				"width": 55,
+				"height": 19
+			}
+		},
+		"undies": {
+			"undies": {
+				"name": "goblin/undies",
+				"type": "mesh",
+				"vertices": [ -13.22, 5.56, -8, -2.47, -5.49, -14.27, -0.64, -14.36, 4.78, -14.45, 15.27, -2.59, 22.22, 6.11, 22.92, 14.05, 3.75, 9.44, -13.08, 13.71, 4.21, -2.59, 4.03, 2.05 ],
+				"triangles": [ 6, 8, 7, 0, 9, 8, 11, 8, 6, 0, 8, 11, 5, 11, 6, 10, 11, 5, 1, 0, 11, 1, 11, 10, 3, 2, 1, 10, 3, 1, 4, 10, 5, 3, 10, 4 ],
+				"uvs": [ 0, 0.32029, 0.14893, 0.59457, 0.22437, 1, 0.35909, 1, 0.50998, 1, 0.79559, 0.58453, 0.9842, 0.28015, 1, 0.00588, 0.46957, 0.17646, 0, 0.03933, 0.48843, 0.59122, 0.48114, 0.43099 ],
+				"edges": [ 0, 2, 2, 4, 8, 10, 10, 12, 12, 14, 14, 16, 16, 18, 0, 18, 4, 6, 6, 8, 6, 20, 16, 22, 22, 20, 0, 22, 22, 12, 2, 20, 20, 10 ],
+				"hull": 20,
+				"width": 36,
+				"height": 29
+			}
+		}
+	},
+	"goblingirl": {
+		"eyes": {
+			"eyes closed": { "name": "goblingirl/eyes-closed", "x": 28, "y": -25.54, "rotation": -87.04, "width": 37, "height": 21 }
+		},
+		"head": {
+			"head": { "name": "goblingirl/head", "x": 27.71, "y": -4.32, "rotation": -85.58, "width": 103, "height": 81 }
+		},
+		"left arm": {
+			"left arm": { "name": "goblingirl/left-arm", "x": 19.64, "y": -2.42, "rotation": 33.05, "width": 37, "height": 35 }
+		},
+		"left foot": {
+			"left foot": { "name": "goblingirl/left-foot", "x": 25.17, "y": 7.92, "rotation": 3.32, "width": 65, "height": 31 }
+		},
+		"left hand": {
+			"left hand": {
+				"name": "goblingirl/left-hand",
+				"x": 4.34,
+				"y": 2.39,
+				"scaleX": 0.896,
+				"scaleY": 0.896,
+				"rotation": 30.34,
+				"width": 35,
+				"height": 40
+			}
+		},
+		"left lower leg": {
+			"left lower leg": { "name": "goblingirl/left-lower-leg", "x": 25.02, "y": -0.6, "rotation": 105.75, "width": 33, "height": 70 }
+		},
+		"left shoulder": {
+			"left shoulder": { "name": "goblingirl/left-shoulder", "x": 19.8, "y": -0.42, "rotation": 61.21, "width": 28, "height": 46 }
+		},
+		"left upper leg": {
+			"left upper leg": { "name": "goblingirl/left-upper-leg", "x": 30.21, "y": -2.95, "rotation": 89.09, "width": 33, "height": 70 }
+		},
+		"neck": {
+			"neck": { "name": "goblingirl/neck", "x": 6.16, "y": -3.14, "rotation": -98.86, "width": 35, "height": 41 }
+		},
+		"pelvis": {
+			"pelvis": { "name": "goblingirl/pelvis", "x": -3.87, "y": 3.18, "width": 62, "height": 43 }
+		},
+		"right arm": {
+			"right arm": { "name": "goblingirl/right-arm", "x": 16.85, "y": -0.66, "rotation": 93.52, "width": 28, "height": 50 }
+		},
+		"right foot": {
+			"right foot": { "name": "goblingirl/right-foot", "x": 23.46, "y": 9.66, "rotation": 1.52, "width": 63, "height": 33 }
+		},
+		"right hand": {
+			"right hand": { "name": "goblingirl/right-hand", "x": 7.21, "y": 3.43, "rotation": 91.16, "width": 36, "height": 37 }
+		},
+		"right hand item": {
+			"right hand item": { "name": "goblingirl/dagger-tip", "x": 13.45, "y": 22.07, "rotation": -3.23, "width": 17, "height": 17 }
+		},
+		"right hand thumb": {
+			"right hand thumb": { "name": "goblingirl/right-hand", "x": 7.21, "y": 3.43, "rotation": 91.16, "width": 36, "height": 37 }
+		},
+		"right lower leg": {
+			"right lower leg": { "name": "goblingirl/right-lower-leg", "x": 26.15, "y": -3.27, "rotation": 111.83, "width": 36, "height": 76 }
+		},
+		"right shoulder": {
+			"right shoulder": { "name": "goblingirl/right-shoulder", "x": 14.46, "y": 0.45, "rotation": 129.85, "width": 39, "height": 45 }
+		},
+		"right upper leg": {
+			"right upper leg": { "name": "goblingirl/right-upper-leg", "x": 19.69, "y": 2.13, "rotation": 97.49, "width": 34, "height": 63 }
+		},
+		"torso": {
+			"torso": { "name": "goblingirl/torso", "x": 36.28, "y": -5.14, "rotation": -95.74, "width": 68, "height": 96 }
+		},
+		"undie straps": {
+			"undie straps": { "name": "goblingirl/undie-straps", "x": -1.51, "y": 14.18, "width": 55, "height": 19 }
+		},
+		"undies": {
+			"undies": { "name": "goblingirl/undies", "x": 5.4, "y": 1.7, "width": 36, "height": 29 }
+		}
+	}
+},
+"animations": {
+	"walk": {
+		"slots": {
+			"eyes": {
+				"attachment": [
+					{ "time": 0.7, "name": "eyes closed" },
+					{ "time": 0.8, "name": null }
+				]
+			}
+		},
+		"bones": {
+			"left upper leg": {
+				"rotate": [
+					{ "time": 0, "angle": -26.55 },
+					{ "time": 0.1333, "angle": -8.78 },
+					{ "time": 0.2333, "angle": 9.51 },
+					{ "time": 0.3666, "angle": 30.74 },
+					{ "time": 0.5, "angle": 25.33 },
+					{ "time": 0.6333, "angle": 26.11 },
+					{ "time": 0.7333, "angle": 7.45 },
+					{ "time": 0.8666, "angle": -21.19 },
+					{ "time": 1, "angle": -26.55 }
+				],
+				"translate": [
+					{ "time": 0, "x": -1.32, "y": 1.7 },
+					{ "time": 0.3666, "x": -0.06, "y": 2.42 },
+					{ "time": 1, "x": -1.32, "y": 1.7 }
+				]
+			},
+			"right upper leg": {
+				"rotate": [
+					{ "time": 0, "angle": 42.45 },
+					{
+						"time": 0.1333,
+						"angle": 49.86,
+						"curve": [ 0.414, 0, 0.705, 0.99 ]
+					},
+					{ "time": 0.2333, "angle": 22.51 },
+					{ "time": 0.5, "angle": -16.93 },
+					{ "time": 0.6333, "angle": 1.89 },
+					{
+						"time": 0.7333,
+						"angle": 34.86,
+						"curve": [ 0.462, 0.11, 1, 1 ]
+					},
+					{
+						"time": 0.8666,
+						"angle": 58.68,
+						"curve": [ 0.5, 0.02, 1, 1 ]
+					},
+					{ "time": 1, "angle": 42.45 }
+				],
+				"translate": [
+					{ "time": 0, "x": 6.23, "y": 0 },
+					{ "time": 0.2333, "x": 2.14, "y": 2.4 },
+					{ "time": 0.5, "x": 2.44, "y": 4.8 },
+					{ "time": 1, "x": 6.23, "y": 0 }
+				]
+			},
+			"left lower leg": {
+				"rotate": [
+					{ "time": 0, "angle": -18.05 },
+					{ "time": 0.1333, "angle": -63.5 },
+					{ "time": 0.2333, "angle": -83.01 },
+					{ "time": 0.5, "angle": 5.11 },
+					{ "time": 0.6333, "angle": -28.29 },
+					{ "time": 0.7333, "angle": -27.52 },
+					{ "time": 0.8666, "angle": 3.53 },
+					{ "time": 1, "angle": -18.05 }
+				],
+				"translate": [
+					{ "time": 0, "x": 0, "y": 0 },
+					{ "time": 0.2333, "x": 2.55, "y": -0.47 },
+					{ "time": 0.5, "x": 0, "y": 0, "curve": "stepped" },
+					{ "time": 1, "x": 0, "y": 0 }
+				]
+			},
+			"left foot": {
+				"rotate": [
+					{ "time": 0, "angle": -14.56 },
+					{ "time": 0.1333, "angle": -10.42 },
+					{ "time": 0.2333, "angle": -5.01 },
+					{ "time": 0.3, "angle": 6.67 },
+					{ "time": 0.3666, "angle": 3.87 },
+					{ "time": 0.5, "angle": -3.87 },
+					{ "time": 0.6333, "angle": 2.78 },
+					{ "time": 0.7333, "angle": -11.99 },
+					{ "time": 0.8666, "angle": -12.45 },
+					{ "time": 1, "angle": -14.56 }
+				]
+			},
+			"right shoulder": {
+				"rotate": [
+					{
+						"time": 0,
+						"angle": 5.29,
+						"curve": [ 0.264, 0, 0.75, 1 ]
+					},
+					{ "time": 0.6333, "angle": 6.65 },
+					{ "time": 1, "angle": 5.29 }
+				]
+			},
+			"right arm": {
+				"rotate": [
+					{
+						"time": 0,
+						"angle": -4.02,
+						"curve": [ 0.267, 0, 0.804, 0.99 ]
+					},
+					{
+						"time": 0.6333,
+						"angle": 19.78,
+						"curve": [ 0.307, 0, 0.787, 0.99 ]
+					},
+					{ "time": 1, "angle": -4.02 }
+				]
+			},
+			"right hand": {
+				"rotate": [
+					{ "time": 0, "angle": 8.98 },
+					{ "time": 0.6333, "angle": 0.51 },
+					{ "time": 1, "angle": 8.98 }
+				]
+			},
+			"left shoulder": {
+				"rotate": [
+					{
+						"time": 0,
+						"angle": 6.25,
+						"curve": [ 0.339, 0, 0.683, 1 ]
+					},
+					{
+						"time": 0.5,
+						"angle": -11.78,
+						"curve": [ 0.281, 0, 0.686, 0.99 ]
+					},
+					{ "time": 1, "angle": 6.25 }
+				],
+				"translate": [
+					{ "time": 0, "x": 1.15, "y": 0.23 }
+				]
+			},
+			"left hand": {
+				"rotate": [
+					{
+						"time": 0,
+						"angle": -21.23,
+						"curve": [ 0.295, 0, 0.755, 0.98 ]
+					},
+					{
+						"time": 0.5,
+						"angle": -27.28,
+						"curve": [ 0.241, 0, 0.75, 0.97 ]
+					},
+					{ "time": 1, "angle": -21.23 }
+				]
+			},
+			"left arm": {
+				"rotate": [
+					{
+						"time": 0,
+						"angle": 28.37,
+						"curve": [ 0.339, 0, 0.683, 1 ]
+					},
+					{
+						"time": 0.5,
+						"angle": 60.09,
+						"curve": [ 0.281, 0, 0.686, 0.99 ]
+					},
+					{ "time": 1, "angle": 28.37 }
+				]
+			},
+			"torso": {
+				"rotate": [
+					{ "time": 0, "angle": -10.28 },
+					{
+						"time": 0.1333,
+						"angle": -15.38,
+						"curve": [ 0.545, 0, 0.818, 1 ]
+					},
+					{
+						"time": 0.3666,
+						"angle": -9.78,
+						"curve": [ 0.58, 0.17, 0.669, 0.99 ]
+					},
+					{
+						"time": 0.6333,
+						"angle": -15.75,
+						"curve": [ 0.235, 0.01, 0.795, 1 ]
+					},
+					{
+						"time": 0.8666,
+						"angle": -7.06,
+						"curve": [ 0.209, 0, 0.816, 0.98 ]
+					},
+					{ "time": 1, "angle": -10.28 }
+				],
+				"translate": [
+					{ "time": 0, "x": -3.72, "y": -0.01 }
+				]
+			},
+			"right foot": {
+				"rotate": [
+					{ "time": 0, "angle": -5.25 },
+					{ "time": 0.2333, "angle": -17.76 },
+					{ "time": 0.3666, "angle": -20.09 },
+					{ "time": 0.5, "angle": -19.73 },
+					{ "time": 0.7333, "angle": -11.68 },
+					{ "time": 0.8, "angle": 4.46 },
+					{ "time": 0.8666, "angle": 0.46 },
+					{ "time": 1, "angle": -5.25 }
+				]
+			},
+			"right lower leg": {
+				"rotate": [
+					{
+						"time": 0,
+						"angle": -3.39,
+						"curve": [ 0.316, 0.01, 0.741, 0.98 ]
+					},
+					{
+						"time": 0.1333,
+						"angle": -43.21,
+						"curve": [ 0.414, 0, 0.705, 0.99 ]
+					},
+					{ "time": 0.2333, "angle": -25.98 },
+					{ "time": 0.5, "angle": -19.53 },
+					{ "time": 0.6333, "angle": -64.8 },
+					{
+						"time": 0.7333,
+						"angle": -89.54,
+						"curve": [ 0.557, 0.18, 1, 1 ]
+					},
+					{ "time": 1, "angle": -3.39 }
+				],
+				"translate": [
+					{ "time": 0, "x": 0, "y": 0, "curve": "stepped" },
+					{ "time": 0.5, "x": 0, "y": 0 },
+					{ "time": 0.6333, "x": 2.18, "y": 0.21 },
+					{ "time": 1, "x": 0, "y": 0 }
+				]
+			},
+			"hip": {
+				"rotate": [
+					{ "time": 0, "angle": 0, "curve": "stepped" },
+					{ "time": 1, "angle": 0 }
+				],
+				"translate": [
+					{ "time": 0, "x": 0, "y": -8.4 },
+					{
+						"time": 0.1333,
+						"x": 0,
+						"y": -9.35,
+						"curve": [ 0.326, 0.05, 0.674, 0.93 ]
+					},
+					{
+						"time": 0.2333,
+						"x": 0,
+						"y": -0.59,
+						"curve": [ 0.325, 0.39, 0.643, 0.7 ]
+					},
+					{ "time": 0.3666, "x": 0, "y": -3.96 },
+					{ "time": 0.5, "x": 0, "y": -8.4 },
+					{
+						"time": 0.6333,
+						"x": 0,
+						"y": -10,
+						"curve": [ 0.359, 0.47, 0.646, 0.74 ]
+					},
+					{
+						"time": 0.7333,
+						"x": 0,
+						"y": -5.29,
+						"curve": [ 0.333, 0.36, 0.662, 0.69 ]
+					},
+					{
+						"time": 0.8,
+						"x": 0,
+						"y": -2.49,
+						"curve": [ 0.322, 0.35, 0.651, 0.68 ]
+					},
+					{ "time": 0.8666, "x": 0, "y": -3.96 },
+					{ "time": 1, "x": 0, "y": -8.4 }
+				]
+			},
+			"neck": {
+				"rotate": [
+					{ "time": 0, "angle": 3.6 },
+					{ "time": 0.1333, "angle": 17.49 },
+					{ "time": 0.2333, "angle": 6.1 },
+					{ "time": 0.3666, "angle": 3.45 },
+					{ "time": 0.5, "angle": 5.17 },
+					{ "time": 0.6333, "angle": 18.36 },
+					{ "time": 0.7333, "angle": 6.09 },
+					{ "time": 0.8666, "angle": 2.28 },
+					{ "time": 1, "angle": 3.6 }
+				]
+			},
+			"head": {
+				"rotate": [
+					{
+						"time": 0,
+						"angle": 3.6,
+						"curve": [ 0, 0, 0.704, 1.17 ]
+					},
+					{ "time": 0.1333, "angle": -0.2 },
+					{ "time": 0.2333, "angle": 6.1 },
+					{ "time": 0.3666, "angle": 3.45 },
+					{
+						"time": 0.5,
+						"angle": 5.17,
+						"curve": [ 0, 0, 0.704, 1.61 ]
+					},
+					{ "time": 0.6666, "angle": 1.1 },
+					{ "time": 0.7333, "angle": 6.09 },
+					{ "time": 0.8666, "angle": 2.28 },
+					{ "time": 1, "angle": 3.6 }
+				]
+			},
+			"pelvis": {
+				"rotate": [
+					{ "time": 0, "angle": -1.33 }
+				],
+				"translate": [
+					{ "time": 0, "x": 0.39, "y": -0.78 }
+				]
+			}
+		},
+		"ffd": {
+			"default": {
+				"right hand item": {
+					"dagger": [
+						{
+							"time": 0,
+							"vertices": [ 15.49, -12.82, 21.13, -13.57, 20.16, -20.49, 13.15, -21.67, 8.13, -58.56, -5.13, -77.04, -9.92, -76.36, -7.79, -53.6, -0.03, -20.36, -5.6, -17.04, -4.63, -10.17, 1.12, -10.93, 7.46, 30.24, 29.28, 27.64 ],
+							"curve": [ 0.25, 0, 0.75, 1 ]
+						},
+						{
+							"time": 0.5,
+							"vertices": [ 15.49, -12.82, 21.13, -13.57, 20.16, -20.49, 13.15, -21.67, 6.93, -54.25, -5.06, -70.62, -8.26, -70.17, -6.04, -50.01, -0.03, -20.36, -5.6, -17.04, -4.63, -10.17, 1.12, -10.93, 7.46, 30.24, 26.93, 27.49 ],
+							"curve": [ 0.25, 0, 0.75, 1 ]
+						},
+						{
+							"time": 1,
+							"vertices": [ 15.49, -12.82, 21.13, -13.57, 20.16, -20.49, 13.15, -21.67, 8.13, -58.56, -5.13, -77.04, -9.92, -76.36, -7.79, -53.6, -0.03, -20.36, -5.6, -17.04, -4.63, -10.17, 1.12, -10.93, 7.46, 30.24, 29.28, 27.64 ]
+						}
+					]
+				}
+			},
+			"goblin": {
+				"head": {
+					"head": [
+						{
+							"time": 0,
+							"curve": [ 0.632, 0, 0.75, 1 ]
+						},
+						{
+							"time": 0.2,
+							"vertices": [ 3.58, 43.73, 18.44, 33.01, 17.46, 26.36, 11.57, 16.86, 3.74, 11.71, -5.89, -3.91, -11.83, -37.23, -8.31, -45.63, 6.66, -44.15, 9.31, -51.25, 18.44, -51.74, 25.21, -43.15, 23.9, -44.76, 22.52, -50.46, 29.13, -53.98, 32.8, -48.95, 37.11, -41.08, 43.75, -33.97, 53.58, -19.87, 54.5, 0.03, 43.31, 19.16, 35.6, 23.41, 29.24, 40.99, 16.57, 48.52, 10.25, 5.99, 24.2, 2, 35.55, 12.48, 9.39, -25.1, 16.8, -24.31, 16.12, -40.57, 20.68, -33.02 ],
+							"curve": [ 0.25, 0, 0.75, 1 ]
+						},
+						{
+							"time": 0.3666,
+							"vertices": [ 25.25, 54.48, 26.78, 37.32, 17.46, 26.36, 11.57, 16.86, 3.74, 11.71, -5.89, -3.91, -11.83, -37.23, -8.31, -45.63, 9.22, -44.15, 11.86, -51.24, 21, -51.73, 25.21, -43.15, 28.82, -47.66, 31.12, -53.05, 38.53, -51.9, 38.46, -45.68, 37.11, -41.08, 43.75, -33.97, 53.58, -19.87, 54.5, 0.03, 43.31, 19.16, 35.6, 23.41, 40.35, 36.26, 37.59, 48.2, 10.25, 5.99, 24.2, 2, 35.55, 12.48, 9.39, -25.1, 16.8, -24.31, 18.67, -40.56, 20.68, -33.02 ],
+							"curve": [ 0.621, 0, 0.75, 1 ]
+						},
+						{
+							"time": 0.7,
+							"vertices": [ 3.58, 43.73, 18.44, 33.01, 17.46, 26.36, 11.57, 16.86, 3.74, 11.71, -5.89, -3.91, -11.83, -37.23, -8.31, -45.63, 6.57, -44.41, 9.22, -51.5, 18.35, -51.99, 25.21, -43.15, 23.9, -44.76, 22.52, -50.46, 29.13, -53.98, 32.8, -48.95, 37.11, -41.08, 43.75, -33.97, 53.58, -19.87, 54.5, 0.03, 43.31, 19.16, 35.6, 23.41, 29.24, 40.99, 16.57, 48.52, 10.25, 5.99, 24.2, 2, 35.55, 12.48, 9.39, -25.1, 16.8, -24.31, 16.03, -40.82, 20.68, -33.02 ],
+							"curve": [ 0.25, 0, 0.75, 1 ]
+						},
+						{
+							"time": 0.8666,
+							"vertices": [ 25.25, 54.48, 26.78, 37.32, 17.46, 26.36, 11.57, 16.86, 3.74, 11.71, -5.89, -3.91, -11.83, -37.23, -8.31, -45.63, 8.14, -44.15, 10.78, -51.25, 19.91, -51.74, 25.21, -43.15, 28.82, -47.66, 31.12, -53.05, 38.53, -51.9, 38.46, -45.68, 37.11, -41.08, 43.75, -33.97, 53.58, -19.87, 54.5, 0.03, 43.31, 19.16, 35.6, 23.41, 40.35, 36.26, 37.59, 48.2, 10.25, 5.99, 24.2, 2, 35.55, 12.48, 9.39, -25.1, 16.8, -24.31, 17.59, -40.57, 20.68, -33.02 ],
+							"curve": [ 0.25, 0, 0.75, 1 ]
+						},
+						{ "time": 1 }
+					]
+				},
+				"left foot": {
+					"left foot": [
+						{
+							"time": 0,
+							"vertices": [ 2.28, 13.07, -1.76, -1.64, 3.59, -7.8, 20.25, -6.04, 41.61, -2.89, 50.95, 15.08, 44.53, 18.12, 35.02, 16.01, 28.81, 17.04, 21.55, 24.48, 24.03, 0.75, 38.41, 4.14 ]
+						},
+						{ "time": 0.1333 },
+						{
+							"time": 0.2333,
+							"vertices": [ 2.28, 13.07, -1.76, -1.64, 3.59, -7.8, 20.25, -6.04, 33.95, -7.62, 52.32, -16.18, 55.08, -9.64, 49.81, 0.4, 31.95, 15.05, 21.99, 24.11, 24.03, 0.75, 40.86, -4.12 ]
+						},
+						{
+							"time": 0.3666,
+							"vertices": [ 2.28, 13.07, -1.76, -1.64, 3.59, -7.8, 20.25, -6.04, 38.58, -4.94, 58.46, -1.02, 56.83, 5.89, 46.64, 10.89, 31.95, 15.05, 21.99, 24.11, 24.03, 0.75, 42.09, 1.95 ]
+						},
+						{ "time": 0.5, "curve": "stepped" },
+						{ "time": 0.6333 },
+						{
+							"time": 0.7333,
+							"vertices": [ 2.28, 13.07, -1.76, -1.64, 3.59, -7.8, 20.25, -6.04, 34.94, 4.12, 51.2, 16.21, 46.76, 21.75, 35.41, 21.89, 27.22, 21.36, 21.99, 24.11, 22.54, 5.64, 35.14, 11.86 ]
+						},
+						{
+							"time": 0.8333,
+							"vertices": [ 2.28, 13.07, -1.76, -1.64, 3.59, -7.8, 21.31, -4.48, 35.39, 2.72, 52.6, 13.42, 48.38, 19.14, 37.04, 19.73, 27.71, 20.42, 21.99, 24.11, 24.03, 0.75, 36.38, 9.71 ]
+						},
+						{
+							"time": 1,
+							"vertices": [ 2.28, 13.07, -1.76, -1.64, 3.59, -7.8, 20.25, -6.04, 41.61, -2.89, 50.95, 15.08, 44.53, 18.12, 35.02, 16.01, 28.81, 17.04, 21.55, 24.48, 24.03, 0.75, 38.41, 4.14 ]
+						}
+					]
+				},
+				"pelvis": {
+					"pelvis": [
+						{ "time": 0 },
+						{
+							"time": 0.1333,
+							"vertices": [ 25.38, -20.73, -36.61, -20.73, -36.61, 22.26, 24.69, 18.13 ]
+						},
+						{
+							"time": 0.3333,
+							"vertices": [ 25.38, -20.73, -36.61, -20.73, -36.61, 22.26, 24.33, 19.16 ]
+						},
+						{
+							"time": 0.7,
+							"vertices": [ 25.38, -20.73, -36.61, -20.73, -36.61, 22.26, 23.95, 15.96 ]
+						},
+						{
+							"time": 0.8666,
+							"vertices": [ 25.38, -20.73, -36.61, -20.73, -36.61, 22.26, 24.24, 20.47 ]
+						},
+						{ "time": 1 }
+					]
+				},
+				"right foot": {
+					"right foot": [
+						{ "time": 0 },
+						{
+							"time": 0.1333,
+							"vertices": [ 17.36, 25.99, 26.32, 18.07, 37.54, 14.7, 46.15, 12.11, 52.9, 3.19, 48.94, -0.9, 34.49, -2.96, 16.66, -5.5, -2.4, -7.38, -7.58, -3.86, -7.78, 3.7, -7.95, 10.1, -2.57, 22.36, 10.84, 25.97, 20.83, 4.67, 35.98, 5.68 ]
+						},
+						{
+							"time": 0.2333,
+							"vertices": [ 17.36, 25.99, 22.74, 21.85, 32.14, 19.07, 41.12, 18.6, 49.8, 11.55, 46.93, 6.62, 33.38, 1.19, 16.66, -5.5, -2.4, -7.38, -7.58, -3.86, -7.78, 3.7, -7.95, 10.1, -2.57, 22.36, 10.84, 25.97, 18.3, 5.36, 32.77, 9.95 ]
+						},
+						{
+							"time": 0.3,
+							"vertices": [ 17.36, 25.99, 20.86, 22.12, 30.59, 20.94, 39.52, 21.96, 49.25, 16.43, 47.23, 11.1, 34.76, 3.51, 19.38, -5.85, -2.4, -7.38, -7.58, -3.86, -7.78, 3.7, -7.95, 10.1, -2.57, 22.36, 10.84, 25.97, 19.2, 5.13, 32.72, 12.05 ]
+						},
+						{
+							"time": 0.3666,
+							"vertices": [ 17.36, 25.99, 18.66, 24.88, 26.52, 23.21, 33.82, 24.19, 44.59, 21.17, 43.91, 15.51, 33.65, 5.13, 19.38, -5.85, -2.4, -7.38, -7.58, -3.86, -7.78, 3.7, -7.95, 10.1, -2.57, 22.36, 10.84, 25.97, 18, 5.05, 30.68, 13.4 ]
+						},
+						{
+							"time": 0.5,
+							"vertices": [ 17.36, 25.99, 23.71, 19.8, 29.3, 17.85, 36.5, 18.8, 47.64, 17.74, 47.97, 12.05, 39.71, 0.02, 19.65, -6.59, -2.4, -7.38, -7.58, -3.86, -7.78, 3.7, -7.95, 10.1, -2.57, 22.36, 10.84, 25.97, 22.14, 2.75, 34.35, 6.98 ]
+						},
+						{ "time": 0.6333 },
+						{
+							"time": 0.7333,
+							"vertices": [ 17.36, 25.99, 29.13, 15.44, 41.2, 3.96, 47.27, -5.29, 47.85, -16.46, 42.27, -17.63, 29.16, -11.22, 16.84, -6.87, -2.4, -7.38, -7.58, -3.86, -7.78, 3.7, -7.95, 10.1, -2.57, 22.36, 10.84, 25.97, 22.14, 2.75, 35.25, -4.9 ]
+						},
+						{
+							"time": 0.8,
+							"vertices": [ 17.36, 25.99, 29.13, 15.44, 40.55, 7.38, 47.71, 0.97, 50.85, -9.42, 45.85, -11.81, 32, -8.8, 16.84, -6.87, -2.4, -7.38, -7.58, -3.86, -7.78, 3.7, -7.95, 10.1, 0.22, 21.08, 10.84, 25.97, 22.14, 2.75, 36.28, -1.43 ]
+						},
+						{ "time": 0.8666 }
+					]
+				},
+				"right hand": {
+					"right hand": [
+						{
+							"time": 0,
+							"vertices": [ -10.82, -9.45, 5.95, -15.34, 17.39, -14.55, 24, -7.5, 27, 5.24, 26.92, 16.17, 18.74, 17.59, 15.84, 14.74, 6.84, 15.02, 0.08, 19.14, -11.41, 7.83 ]
+						},
+						{ "time": 0.5 },
+						{
+							"time": 1,
+							"vertices": [ -10.82, -9.45, 5.95, -15.34, 17.39, -14.55, 24, -7.5, 27, 5.24, 26.92, 16.17, 18.74, 17.59, 15.84, 14.74, 6.84, 15.02, 0.08, 19.14, -11.41, 7.83 ]
+						}
+					]
+				},
+				"right lower leg": {
+					"right lower leg": [
+						{ "time": 0 },
+						{
+							"time": 0.6,
+							"vertices": [ 6.26, 8.46, 23.32, 8.04, 37.1, 12.89, 43.25, 19.26, 53.07, 21.46, 61.33, 10.06, 65.77, -1.03, 58.99, -9.19, 43.02, -9.81, 16.33, -20, -12.79, -9.26 ]
+						},
+						{ "time": 1 }
+					]
+				},
+				"right upper leg": {
+					"right upper leg": [
+						{
+							"time": 0,
+							"vertices": [ -15.89, -11.83, 2.17, -14.07, 35.49, -13.66, 47.29, -12.11, 52.61, -2.26, 51.63, 5.16, 40.51, 10.18, 18.78, 16.54, 0.99, 11.27, -10.9, 3.04 ]
+						},
+						{ "time": 0.3333 },
+						{
+							"time": 0.8666,
+							"vertices": [ -9.85, -10.37, 2.17, -14.07, 35.49, -13.66, 47.29, -12.11, 52.61, -2.26, 51.63, 5.16, 40.51, 10.18, 19.27, 16.11, 1.52, 10.33, -9.76, 1.7 ]
+						},
+						{
+							"time": 1,
+							"vertices": [ -15.89, -11.83, 2.17, -14.07, 35.49, -13.66, 47.29, -12.11, 52.61, -2.26, 51.63, 5.16, 40.51, 10.18, 18.78, 16.54, 0.99, 11.27, -10.9, 3.04 ]
+						}
+					]
+				},
+				"torso": {
+					"torso": [
+						{
+							"time": 0,
+							"vertices": [ 56.93, 27.95, 43.37, 18.23, 30.16, 19.5, 11.53, 21.28, -2.55, 10.69, -10.89, -13.12, -11.59, -21.23, 7.05, -36.36, 16.93, -39.24, 28.17, -41.26, 37.68, -34, 45.98, -30.44, 56.4, -29.07, 84.78, -20.92, 87.9, 15.15, 81.88, 25.79, 2.77, -23.63, 10.03, 2.18, 25.81, -22.93, 29.98, 0, 48.54, -8.39, 11.86, -24.66, 35.9, -15.6 ]
+						},
+						{
+							"time": 0.1333,
+							"vertices": [ 56.93, 27.95, 43.37, 18.23, 30.16, 19.5, 11.53, 21.28, -2.55, 10.69, -10.89, -13.12, -11.59, -21.23, 9.86, -36.72, 18.67, -38.71, 29.43, -38.47, 36.24, -32.03, 45.98, -30.44, 56.4, -29.07, 84.78, -20.92, 87.9, 15.15, 81.88, 25.79, 4.33, -24.97, 10.03, 2.18, 23.76, -22, 29.98, 0, 48.54, -8.39, 10.66, -24.92, 33.34, -15.3 ]
+						},
+						{
+							"time": 0.3,
+							"vertices": [ 56.93, 27.95, 43.37, 18.23, 30.16, 19.5, 11.53, 21.28, -2.55, 10.69, -10.89, -13.12, -11.59, -21.23, 14.58, -39.26, 27.21, -38.46, 35.48, -37.55, 41.92, -32.86, 45.98, -30.44, 56.4, -29.07, 84.78, -20.92, 87.9, 15.15, 81.88, 25.79, 5.75, -26.18, 10.03, 2.18, 29.24, -21.41, 29.98, 0, 48.54, -8.39, 17.41, -24.89, 35.9, -15.6 ]
+						},
+						{
+							"time": 0.5,
+							"vertices": [ 56.93, 27.95, 43.37, 18.23, 30.16, 19.5, 11.53, 21.28, -2.55, 10.69, -10.89, -13.12, -11.59, -21.23, 10.8, -36.99, 22.23, -37.65, 31.86, -38.43, 39.17, -33.01, 45.98, -30.44, 56.4, -29.07, 84.78, -20.92, 87.9, 15.15, 81.88, 25.79, 4.89, -25.45, 10.03, 2.18, 26.72, -21.67, 29.98, 0, 48.54, -8.39, 14.29, -24.65, 34.36, -15.42 ]
+						},
+						{
+							"time": 0.6333,
+							"vertices": [ 56.93, 27.95, 43.37, 18.23, 30.16, 19.5, 11.53, 21.28, -2.55, 10.69, -10.89, -13.12, -11.59, -21.23, 9.29, -37.64, 18.67, -38.71, 29.43, -38.47, 36.24, -32.03, 45.98, -30.44, 56.4, -29.07, 84.78, -20.92, 87.9, 15.15, 81.88, 25.79, 4.33, -24.97, 10.03, 2.18, 23.76, -22, 29.98, 0, 48.54, -8.39, 10.66, -24.92, 33.34, -15.3 ]
+						},
+						{
+							"time": 0.8666,
+							"vertices": [ 56.93, 27.95, 43.37, 18.23, 30.16, 19.5, 11.53, 21.28, -2.55, 10.69, -10.89, -13.12, -11.59, -21.23, 9.16, -37.38, 20.04, -39.29, 31.94, -38.36, 40.09, -31.61, 45.98, -30.44, 56.4, -29.07, 84.78, -20.92, 87.9, 15.15, 81.88, 25.79, 3.33, -24.12, 10.03, 2.18, 27.54, -22.84, 29.98, 0, 48.54, -8.39, 13.9, -25, 34.97, -15.49 ]
+						},
+						{
+							"time": 1,
+							"vertices": [ 56.93, 27.95, 43.37, 18.23, 30.16, 19.5, 11.53, 21.28, -2.55, 10.69, -10.89, -13.12, -11.59, -21.23, 7.05, -36.36, 16.93, -39.24, 28.17, -41.26, 37.68, -34, 45.98, -30.44, 56.4, -29.07, 84.78, -20.92, 87.9, 15.15, 81.88, 25.79, 2.77, -23.63, 10.03, 2.18, 25.81, -22.93, 29.98, 0, 48.54, -8.39, 11.86, -24.66, 35.9, -15.6 ]
+						}
+					]
+				},
+				"undie straps": {
+					"undie straps": [
+						{
+							"time": 0,
+							"vertices": [ -10.56, 12.87, 4.76, 10.45, 24.66, 16.67, 25.23, 10.32, 10.19, 2.96, -9.09, 2.41, -31, 16.39, -31, 21.41, -23.92, 21.41 ]
+						},
+						{
+							"time": 0.1333,
+							"vertices": [ -10.56, 12.87, 4.28, 8.87, 24.12, 13.47, 24.87, 7.71, 10.07, 2.96, -9.09, 2.41, -31, 16.39, -31, 21.41, -23.92, 21.41 ]
+						},
+						{
+							"time": 0.3333,
+							"vertices": [ -10.56, 12.87, 4.15, 9.85, 25.12, 17.91, 24.71, 11.73, 10.36, 5.12, -8.12, 3.22, -31, 16.39, -31, 21.41, -23.92, 21.41 ]
+						},
+						{
+							"time": 0.7,
+							"vertices": [ -10.56, 12.87, 5.62, 7.14, 25, 14.08, 24.77, 8.29, 9.41, 2.94, -9.09, 2.41, -31, 16.39, -31, 21.41, -23.92, 21.41 ]
+						},
+						{
+							"time": 0.8666,
+							"vertices": [ -10.56, 12.87, 3.97, 10.43, 24.04, 18.03, 24.23, 10.89, 9.41, 2.94, -9.09, 2.41, -31, 16.39, -31, 21.41, -23.92, 21.41 ]
+						},
+						{
+							"time": 1,
+							"vertices": [ -10.56, 12.87, 4.76, 10.45, 24.82, 18.25, 24.82, 11.1, 10.19, 2.96, -9.09, 2.41, -31, 16.39, -31, 21.41, -23.92, 21.41 ]
+						}
+					]
+				},
+				"undies": {
+					"undies": [
+						{
+							"time": 0,
+							"vertices": [ -12.79, 6.29, 2.6, -2.59, -3.19, -14.27, 1.65, -14.36, 7.08, -14.45, 15.86, -2.34, 19.82, 5.46, 20.65, 13.28, 6.04, 9.44, -12.49, 13.22, 9.2, -2.7, 10.54, 1.82 ]
+						},
+						{
+							"time": 0.1333,
+							"vertices": [ -12.49, 6, -0.79, -2.64, -4.11, -14.27, 0.73, -14.36, 6.16, -14.45, 16.53, -2.54, 21.22, 3.16, 21.55, 10.98, 5.12, 9.44, -12.72, 13.42, 7.21, -2.66, 7.94, 1.91 ]
+						},
+						{
+							"time": 0.3333,
+							"vertices": [ -12.05, 5.56, -5.89, -2.71, -5.49, -14.27, -0.64, -14.36, 4.78, -14.45, 17.52, -2.84, 21.78, 6.72, 21.37, 14.53, 3.75, 9.44, -13.08, 13.71, 4.21, -2.59, 4.03, 2.05 ]
+						},
+						{
+							"time": 0.5333,
+							"vertices": [ -12.05, 5.56, -8.23, -3.41, -8.41, -13.92, -0.64, -14.36, 4.78, -14.45, 15.77, -2.84, 21.58, 4.03, 22.28, 11.97, 3.75, 9.44, -13.08, 13.71, 4.21, -2.59, 4.03, 2.05 ]
+						},
+						{
+							"time": 0.7,
+							"vertices": [ -11.36, 5.45, -3.33, -2.56, -7.25, -14.06, -0.64, -14.36, 4.22, -14.13, 14.14, -3.74, 20.02, 2.64, 21.63, 10.58, 3.75, 9.44, -13.08, 13.71, 5.8, -2.63, 6.69, 2.22 ]
+						},
+						{
+							"time": 0.8333,
+							"vertices": [ -10.8, 5.36, 0.57, -1.89, -6.32, -14.17, -0.64, -14.36, 3.76, -13.86, 12.83, -4.46, 20.59, 6.11, 22.92, 14.05, 3.75, 9.44, -13.08, 13.71, 7.07, -2.67, 8.82, 2.35 ]
+						},
+						{
+							"time": 0.8666,
+							"vertices": [ -11.2, 5.54, 0.98, -2.03, -5.7, -14.19, -0.18, -14.36, 4.42, -13.98, 13.43, -4.04, 21.43, 7.37, 23.46, 15.29, 4.21, 9.44, -12.96, 13.61, 7.5, -2.68, 9.16, 2.25 ]
+						},
+						{
+							"time": 1,
+							"vertices": [ -12.79, 6.29, 2.6, -2.59, -3.19, -14.27, 1.65, -14.36, 7.08, -14.45, 15.86, -2.34, 19.82, 5.46, 20.65, 13.28, 6.04, 9.44, -12.49, 13.22, 9.2, -2.7, 10.54, 1.82 ]
+						}
+					]
+				}
+			}
+		}
+	}
+}
+}

二进制
spine-libgdx/assets/goblins/goblins.png


二进制
spine-libgdx/assets/goblins/goblins.skel


+ 198 - 0
spine-libgdx/assets/skin/skin.atlas

@@ -0,0 +1,198 @@
+
+skin.png
+format: RGBA8888
+filter: Nearest,Nearest
+repeat: none
+default
+  rotate: false
+  xy: 1, 50
+  size: 254, 77
+  orig: 254, 77
+  offset: 0, 0
+  index: -1
+default-window
+  rotate: false
+  xy: 1, 20
+  size: 27, 29
+  split: 4, 3, 20, 3
+  orig: 27, 29
+  offset: 0, 0
+  index: -1
+default-select
+  rotate: false
+  xy: 29, 29
+  size: 27, 20
+  split: 4, 14, 4, 4
+  orig: 27, 20
+  offset: 0, 0
+  index: -1
+default-round-large
+  rotate: false
+  xy: 57, 29
+  size: 20, 20
+  split: 5, 5, 5, 4
+  orig: 20, 20
+  offset: 0, 0
+  index: -1
+default-scroll
+  rotate: false
+  xy: 78, 29
+  size: 20, 20
+  split: 2, 2, 2, 2
+  orig: 20, 20
+  offset: 0, 0
+  index: -1
+default-slider-knob
+  rotate: false
+  xy: 1, 1
+  size: 9, 18
+  orig: 9, 18
+  offset: 0, 0
+  index: -1
+default-round-down
+  rotate: false
+  xy: 99, 29
+  size: 12, 20
+  split: 5, 5, 5, 4
+  orig: 12, 20
+  offset: 0, 0
+  index: -1
+default-round
+  rotate: false
+  xy: 112, 29
+  size: 12, 20
+  split: 5, 5, 5, 4
+  pad: 4, 4, 1, 1
+  orig: 12, 20
+  offset: 0, 0
+  index: -1
+check-off
+  rotate: false
+  xy: 11, 5
+  size: 14, 14
+  orig: 14, 14
+  offset: 0, 0
+  index: -1
+textfield
+  rotate: false
+  xy: 11, 5
+  size: 14, 14
+  split: 3, 3, 3, 3
+  orig: 14, 14
+  offset: 0, 0
+  index: -1
+check-on
+  rotate: false
+  xy: 125, 35
+  size: 14, 14
+  orig: 14, 14
+  offset: 0, 0
+  index: -1
+tree-minus
+  rotate: false
+  xy: 140, 35
+  size: 14, 14
+  orig: 14, 14
+  offset: 0, 0
+  index: -1
+tree-plus
+  rotate: false
+  xy: 155, 35
+  size: 14, 14
+  orig: 14, 14
+  offset: 0, 0
+  index: -1
+default-slider
+  rotate: false
+  xy: 29, 20
+  size: 8, 8
+  split: 2, 2, 2, 2
+  orig: 8, 8
+  offset: 0, 0
+  index: -1
+default-pane
+  rotate: false
+  xy: 11, 1
+  size: 5, 3
+  split: 1, 1, 1, 1
+  orig: 5, 3
+  offset: 0, 0
+  index: -1
+default-rect-pad
+  rotate: false
+  xy: 11, 1
+  size: 5, 3
+  split: 1, 1, 1, 1
+  orig: 5, 3
+  offset: 0, 0
+  index: -1
+default-splitpane
+  rotate: false
+  xy: 17, 1
+  size: 5, 3
+  split: 0, 5, 0, 0
+  orig: 5, 3
+  offset: 0, 0
+  index: -1
+cursor
+  rotate: false
+  xy: 23, 1
+  size: 3, 3
+  split: 1, 1, 1, 1
+  orig: 3, 3
+  offset: 0, 0
+  index: -1
+default-splitpane-vertical
+  rotate: false
+  xy: 125, 29
+  size: 3, 5
+  split: 0, 0, 0, 5
+  orig: 3, 5
+  offset: 0, 0
+  index: -1
+default-rect-down
+  rotate: false
+  xy: 170, 46
+  size: 3, 3
+  split: 1, 1, 1, 1
+  orig: 3, 3
+  offset: 0, 0
+  index: -1
+default-rect
+  rotate: false
+  xy: 38, 25
+  size: 3, 3
+  split: 1, 1, 1, 1
+  orig: 3, 3
+  offset: 0, 0
+  index: -1
+default-select-selection
+  rotate: false
+  xy: 26, 16
+  size: 3, 3
+  split: 1, 1, 1, 1
+  orig: 3, 3
+  offset: 0, 0
+  index: -1
+default-pane-noborder
+  rotate: false
+  xy: 129, 33
+  size: 1, 1
+  split: 0, 0, 0, 0
+  orig: 1, 1
+  offset: 0, 0
+  index: -1
+selection
+  rotate: false
+  xy: 170, 44
+  size: 1, 1
+  orig: 1, 1
+  offset: 0, 0
+  index: -1
+white
+  rotate: false
+  xy: 174, 48
+  size: 1, 1
+  orig: 1, 1
+  offset: 0, 0
+  index: -1

+ 59 - 0
spine-libgdx/assets/skin/skin.json

@@ -0,0 +1,59 @@
+{
+com.badlogic.gdx.graphics.g2d.BitmapFont: { default-font: { file: com/badlogic/gdx/utils/arial-15.fnt } },
+com.badlogic.gdx.graphics.Color: {
+	green: { a: 1, b: 0, g: 1, r: 0 },
+	white: { a: 1, b: 1, g: 1, r: 1 },
+	red: { a: 1, b: 0, g: 0, r: 1 },
+	black: { a: 1, b: 0, g: 0, r: 0 }
+},
+com.badlogic.gdx.scenes.scene2d.ui.Skin$TintedDrawable: {
+	dialogDim: { name: white, color: { r: 0, g: 0, b: 0, a: 0.45 } }
+},
+com.badlogic.gdx.scenes.scene2d.ui.Button$ButtonStyle: {
+	default: { down: default-round-down, up: default-round },
+	toggle: { down: default-round-down, checked: default-round-down, up: default-round }
+},
+com.badlogic.gdx.scenes.scene2d.ui.TextButton$TextButtonStyle: {
+	default: { down: default-round-down, up: default-round, font: default-font, fontColor: white },
+	toggle: { down: default-round-down, up: default-round, checked: default-round-down, font: default-font, fontColor: white, downFontColor: red }
+},
+com.badlogic.gdx.scenes.scene2d.ui.ScrollPane$ScrollPaneStyle: {
+	default: { vScroll: default-scroll, hScrollKnob: default-round-large, background: default-rect, hScroll: default-scroll, vScrollKnob: default-round-large }
+},
+com.badlogic.gdx.scenes.scene2d.ui.SelectBox$SelectBoxStyle: {
+	default: {
+		font: default-font, fontColor: white, background: default-select,
+		scrollStyle: default,
+		listStyle: { font: default-font, selection: default-select-selection }
+	}
+},
+com.badlogic.gdx.scenes.scene2d.ui.SplitPane$SplitPaneStyle: {
+	default-vertical: { handle: default-splitpane-vertical },
+	default-horizontal: { handle: default-splitpane }
+},
+com.badlogic.gdx.scenes.scene2d.ui.Window$WindowStyle: {
+	default: { titleFont: default-font, background: default-window, titleFontColor: white },
+	dialog: { titleFont: default-font, background: default-window, titleFontColor: white, stageBackground: dialogDim }
+},
+com.badlogic.gdx.scenes.scene2d.ui.Slider$SliderStyle: {
+	default-horizontal: { background: default-slider, knob: default-slider-knob }
+},
+com.badlogic.gdx.scenes.scene2d.ui.Label$LabelStyle: {
+	default: { font: default-font, fontColor: white }
+},
+com.badlogic.gdx.scenes.scene2d.ui.TextField$TextFieldStyle: {
+	default: { selection: selection, background: textfield, font: default-font, fontColor: white, cursor: cursor }
+},
+com.badlogic.gdx.scenes.scene2d.ui.CheckBox$CheckBoxStyle: {
+	default: { checkboxOn: check-on, checkboxOff: check-off, font: default-font, fontColor: white }
+},
+com.badlogic.gdx.scenes.scene2d.ui.List$ListStyle: {
+	default: { fontColorUnselected: white, selection: selection, fontColorSelected: white, font: default-font }
+},
+com.badlogic.gdx.scenes.scene2d.ui.Touchpad$TouchpadStyle: {
+	default: { background: default-pane, knob: default-round-large }
+},
+com.badlogic.gdx.scenes.scene2d.ui.Tree$TreeStyle: {
+	default: { minus: tree-minus, plus: tree-plus, selection: default-select-selection }
+}
+}

二进制
spine-libgdx/assets/skin/skin.png


+ 0 - 0
spine-libgdx/test/spineboy-diffuse.atlas → spine-libgdx/assets/spineboy/spineboy-diffuse.atlas


+ 0 - 0
spine-libgdx/test/spineboy-diffuse.png → spine-libgdx/assets/spineboy/spineboy-diffuse.png


+ 0 - 0
spine-libgdx/test/spineboy-normal.png → spine-libgdx/assets/spineboy/spineboy-normal.png


+ 67 - 102
spine-libgdx/test/spineboy.atlas → spine-libgdx/assets/spineboy/spineboy.atlas

@@ -3,164 +3,129 @@ spineboy.png
 format: RGBA8888
 filter: Linear,Linear
 repeat: none
-head
-  rotate: false
-  xy: 1, 122
-  size: 121, 132
-  orig: 121, 132
-  offset: 0, 0
-  index: -1
-torso
+eyes
   rotate: false
-  xy: 1, 28
-  size: 68, 92
-  orig: 68, 92
+  xy: 447, 44
+  size: 34, 27
+  orig: 34, 27
   offset: 0, 0
   index: -1
-left-pant-bottom
-  rotate: false
-  xy: 1, 4
-  size: 44, 22
-  orig: 44, 22
+eyes-closed
+  rotate: true
+  xy: 483, 37
+  size: 34, 27
+  orig: 34, 27
   offset: 0, 0
   index: -1
-right-pant-bottom
-  rotate: false
-  xy: 47, 8
-  size: 46, 18
-  orig: 46, 18
+head
+  rotate: true
+  xy: 2, 5
+  size: 121, 132
+  orig: 121, 132
   offset: 0, 0
   index: -1
-right-upper-leg
-  rotate: false
-  xy: 71, 50
-  size: 44, 70
-  orig: 44, 70
+left-arm
+  rotate: true
+  xy: 382, 40
+  size: 35, 29
+  orig: 35, 29
   offset: 0, 0
   index: -1
-pelvis
+left-foot
   rotate: false
-  xy: 95, 1
-  size: 63, 47
-  orig: 63, 47
+  xy: 205, 2
+  size: 65, 30
+  orig: 65, 30
   offset: 0, 0
   index: -1
-left-upper-leg
+left-hand
   rotate: false
-  xy: 117, 53
-  size: 33, 67
-  orig: 33, 67
+  xy: 272, 7
+  size: 35, 38
+  orig: 35, 38
   offset: 0, 0
   index: -1
-right-foot
-  rotate: false
-  xy: 160, 224
-  size: 67, 30
-  orig: 67, 30
+left-lower-leg
+  rotate: true
+  xy: 331, 77
+  size: 49, 64
+  orig: 49, 64
   offset: 0, 0
   index: -1
 left-shoulder
   rotate: false
-  xy: 124, 201
+  xy: 462, 73
   size: 34, 53
   orig: 34, 53
   offset: 0, 0
   index: -1
-left-ankle
-  rotate: false
-  xy: 229, 222
-  size: 25, 32
-  orig: 25, 32
-  offset: 0, 0
-  index: -1
-left-foot
-  rotate: false
-  xy: 160, 192
-  size: 65, 30
-  orig: 65, 30
+left-upper-leg
+  rotate: true
+  xy: 259, 47
+  size: 33, 67
+  orig: 33, 67
   offset: 0, 0
   index: -1
 neck
   rotate: false
-  xy: 124, 171
+  xy: 382, 10
   size: 34, 28
   orig: 34, 28
   offset: 0, 0
   index: -1
-right-arm
-  rotate: false
-  xy: 124, 124
-  size: 21, 45
-  orig: 21, 45
-  offset: 0, 0
-  index: -1
-right-ankle
+pelvis
   rotate: false
-  xy: 227, 190
-  size: 25, 30
-  orig: 25, 30
+  xy: 397, 79
+  size: 63, 47
+  orig: 63, 47
   offset: 0, 0
   index: -1
-left-hand
-  rotate: false
-  xy: 147, 131
-  size: 35, 38
-  orig: 35, 38
+right-arm
+  rotate: true
+  xy: 206, 39
+  size: 21, 45
+  orig: 21, 45
   offset: 0, 0
   index: -1
-left-arm
+right-foot
   rotate: false
-  xy: 184, 161
-  size: 35, 29
-  orig: 35, 29
+  xy: 136, 2
+  size: 67, 30
+  orig: 67, 30
   offset: 0, 0
   index: -1
-eyes-closed
+right-hand
   rotate: false
-  xy: 221, 161
-  size: 34, 27
-  orig: 34, 27
+  xy: 413, 45
+  size: 32, 32
+  orig: 32, 32
   offset: 0, 0
   index: -1
 right-lower-leg
   rotate: false
-  xy: 152, 65
+  xy: 206, 62
   size: 51, 64
   orig: 51, 64
   offset: 0, 0
   index: -1
-right-foot-idle
-  rotate: false
-  xy: 184, 131
-  size: 53, 28
-  orig: 53, 28
-  offset: 0, 0
-  index: -1
-left-lower-leg
-  rotate: false
-  xy: 205, 65
-  size: 49, 64
-  orig: 49, 64
-  offset: 0, 0
-  index: -1
 right-shoulder
   rotate: false
-  xy: 160, 12
+  xy: 328, 24
   size: 52, 51
   orig: 52, 51
   offset: 0, 0
   index: -1
-eyes
-  rotate: false
-  xy: 214, 36
-  size: 34, 27
-  orig: 34, 27
+right-upper-leg
+  rotate: true
+  xy: 259, 82
+  size: 44, 70
+  orig: 44, 70
   offset: 0, 0
   index: -1
-right-hand
+torso
   rotate: false
-  xy: 214, 2
-  size: 32, 32
-  orig: 32, 32
+  xy: 136, 34
+  size: 68, 92
+  orig: 68, 92
   offset: 0, 0
   index: -1

+ 51 - 68
spine-libgdx/test/spineboy.json → spine-libgdx/assets/spineboy/spineboy.json

@@ -5,7 +5,7 @@
 	{ "name": "left upper leg", "parent": "hip", "length": 50.39, "x": 14.45, "y": 2.81, "rotation": -89.09 },
 	{ "name": "pelvis", "parent": "hip", "x": 1.41, "y": -6.57 },
 	{ "name": "right upper leg", "parent": "hip", "length": 45.76, "x": -18.27, "rotation": -101.13 },
-	{ "name": "torso", "parent": "hip", "length": 85.82, "x": -6.42, "y": 1.97, "rotation": 94.95 },
+	{ "name": "torso", "parent": "hip", "length": 85.82, "x": -6.42, "y": 1.97, "rotation": 99.4 },
 	{ "name": "left lower leg", "parent": "left upper leg", "length": 56.45, "x": 51.78, "y": 3.46, "rotation": -16.65 },
 	{ "name": "left shoulder", "parent": "torso", "length": 44.19, "x": 78.96, "y": -15.75, "rotation": -156.96 },
 	{ "name": "neck", "parent": "torso", "length": 18.38, "x": 83.64, "y": -1.78, "rotation": 0.9 },
@@ -34,7 +34,7 @@
 	{ "name": "neck", "bone": "neck", "attachment": "neck" },
 	{ "name": "head", "bone": "head", "attachment": "head" },
 	{ "name": "eyes", "bone": "head", "attachment": "eyes" },
-	{ "name": "right shoulder", "bone": "right shoulder", "attachment": "right-shoulder", "additive": true },
+	{ "name": "right shoulder", "bone": "right shoulder", "attachment": "right-shoulder" },
 	{ "name": "right arm", "bone": "right arm", "attachment": "right-arm" },
 	{ "name": "right hand", "bone": "right hand", "attachment": "right-hand" },
 	{ "name": "bb-head", "bone": "head", "attachment": "bb-head" }
@@ -44,24 +44,7 @@
 		"bb-head": {
 			"bb-head": {
 				"type": "boundingbox",
-				"vertices": [
-					55.69696,
-					-44.60648,
-					8.2226715,
-					-47.609646,
-					-11.244263,
-					-32.942703,
-					-0.05206299,
-					35.835804,
-					61.018433,
-					43.227512,
-					90.35846,
-					-16.054127,
-					115.41275,
-					-32.817406,
-					78.29431,
-					-56.05409
-				]
+				"vertices": [ 77.2608, -53.82651, 105.80151, -32.42244, 58.433777, 40.348133, 5.8296814, 37.007954, -7.0167694, -42.236595 ]
 			}
 		},
 		"eyes": {
@@ -124,20 +107,20 @@
 	"headPop": {}
 },
 "animations": {
-	"drawOrder": {
+	"headPop": {
 		"bones": {
 			"head": {
 				"rotate": [
 					{ "time": 0, "angle": 0 },
-					{ "time": 0.4827, "angle": -23.11 },
-					{ "time": 0.8965, "angle": -56.45 },
-					{ "time": 1.3103, "angle": 1.38 },
-					{ "time": 1.7931, "angle": 36.12 },
-					{ "time": 2.1379, "angle": 1.24 },
-					{ "time": 2.6206, "angle": -37.12 },
-					{ "time": 2.9666, "angle": 2.07 },
-					{ "time": 3.4666, "angle": 34.72 },
-					{ "time": 3.9, "angle": 359.99 }
+					{ "time": 0.9614, "angle": -23.11 },
+					{ "time": 1.7856, "angle": -56.45 },
+					{ "time": 2.6097, "angle": 1.38 },
+					{ "time": 3.5712, "angle": 36.12 },
+					{ "time": 4.258, "angle": 1.24 },
+					{ "time": 5.2195, "angle": -37.12 },
+					{ "time": 5.9086, "angle": 2.07 },
+					{ "time": 6.9044, "angle": 34.72 },
+					{ "time": 7.7675, "angle": 359.99 }
 				],
 				"translate": [
 					{
@@ -147,167 +130,167 @@
 						"curve": [ 0.19, 0.4, 0.586, 0.75 ]
 					},
 					{
-						"time": 0.2758,
+						"time": 0.5494,
 						"x": 57.88,
 						"y": -35.72,
 						"curve": [ 0.39, 0.54, 0.632, 0.72 ]
 					},
 					{
-						"time": 0.4827,
+						"time": 0.9614,
 						"x": 87.26,
 						"y": -87.89,
 						"curve": [ 0.325, 0.23, 0.587, 0.36 ]
 					},
 					{
-						"time": 0.6896,
+						"time": 1.3735,
 						"x": 28.89,
 						"y": -114.62,
 						"curve": [ 0.383, 0.23, 0.736, 0.55 ]
 					},
 					{
-						"time": 0.8965,
+						"time": 1.7856,
 						"x": -76.58,
 						"y": -124.98,
 						"curve": [ 0.129, 0.21, 0.547, 0.64 ]
 					},
 					{
-						"time": 1.1034,
+						"time": 2.1977,
 						"x": -154.37,
 						"y": -77.13,
 						"curve": [ 0.354, 0.48, 0.729, 0.9 ]
 					},
 					{
-						"time": 1.3103,
+						"time": 2.6097,
 						"x": -181.02,
 						"y": 18.56,
 						"curve": [ 0.063, 0.15, 0.52, 0.62 ]
 					},
 					{
-						"time": 1.5862,
+						"time": 3.1591,
 						"x": -150.38,
 						"y": 128.67,
 						"curve": [ 0.381, 0.54, 0.778, 1 ]
 					},
 					{
-						"time": 1.7931,
+						"time": 3.5712,
 						"x": -112.08,
 						"y": 146.28,
 						"curve": [ 0.242, 0, 0.626, 0.45 ]
 					},
 					{
-						"time": 1.931,
+						"time": 3.8459,
 						"x": -63.7,
 						"y": 111.22,
 						"curve": [ 0.398, 0.35, 0.786, 0.76 ]
 					},
 					{
-						"time": 2.1379,
+						"time": 4.258,
 						"x": -48.94,
 						"y": -1.55,
 						"curve": [ 0.188, 0.21, 0.575, 0.61 ]
 					},
 					{
-						"time": 2.3448,
+						"time": 4.6701,
 						"x": -91.69,
 						"y": -91.93,
 						"curve": [ 0.362, 0.51, 0.766, 1 ]
 					},
 					{
-						"time": 2.6206,
+						"time": 5.2195,
 						"x": -142.79,
 						"y": -126.83,
 						"curve": [ 0.227, 0.34, 0.593, 0.75 ]
 					},
 					{
-						"time": 2.7586,
+						"time": 5.4942,
 						"x": -176.7,
 						"y": -98.32,
 						"curve": [ 0.26, 0.4, 0.612, 0.71 ]
 					},
 					{
-						"time": 2.8965,
+						"time": 5.7689,
 						"x": -163.95,
 						"y": -24.04,
 						"curve": [ 0.338, 0.37, 0.676, 0.71 ]
 					},
 					{
-						"time": 2.9655,
+						"time": 5.9063,
 						"x": -150.17,
 						"y": 10.71,
 						"curve": [ 0.387, 0.61, 0.741, 1 ]
 					},
 					{
-						"time": 3.1034,
+						"time": 6.181,
 						"x": -102.44,
 						"y": 45.92,
 						"curve": [ 0.31, 0.24, 0.648, 0.58 ]
 					},
 					{
-						"time": 3.2413,
+						"time": 6.4557,
 						"x": -53.99,
 						"y": 70.39,
 						"curve": [ 0.325, 0.29, 0.663, 0.63 ]
 					},
 					{
-						"time": 3.3793,
+						"time": 6.7304,
 						"x": 1.88,
 						"y": 55.54,
 						"curve": [ 0.387, 0.33, 0.769, 0.73 ]
 					},
 					{
-						"time": 3.5862,
+						"time": 7.1425,
 						"x": 34.26,
 						"y": 36.13,
 						"curve": [ 0.206, 0.28, 0.596, 0.67 ]
 					},
 					{
-						"time": 3.7931,
+						"time": 7.5545,
 						"x": 23.94,
 						"y": 1.01,
 						"curve": [ 0.373, 0.56, 0.759, 1 ]
 					},
-					{ "time": 4, "x": 0, "y": 0 }
+					{ "time": 7.9666, "x": 0, "y": 0 }
 				],
 				"scale": [
-					{ "time": 0.8275, "x": 1, "y": 1 },
-					{ "time": 1.3103, "x": 0.742, "y": 0.742 },
-					{ "time": 1.7931, "x": 1, "y": 1 },
-					{ "time": 2.1379, "x": 1.502, "y": 1.502 },
-					{ "time": 2.6206, "x": 1, "y": 1 },
-					{ "time": 2.9655, "x": 0.707, "y": 0.707 },
-					{ "time": 3.3793, "x": 1, "y": 1 }
+					{ "time": 1.6482, "x": 1, "y": 1 },
+					{ "time": 2.6097, "x": 0.742, "y": 0.742 },
+					{ "time": 3.5712, "x": 1, "y": 1 },
+					{ "time": 4.258, "x": 1.502, "y": 1.502 },
+					{ "time": 5.2195, "x": 1, "y": 1 },
+					{ "time": 5.9063, "x": 0.707, "y": 0.707 },
+					{ "time": 6.7304, "x": 1, "y": 1 }
 				]
 			}
 		},
-		"events": [
-			{ "time": 0, "name": "headPop", "string": "pop.wav" },
-			{ "time": 1.3103, "name": "behind" },
-			{ "time": 2.9655, "name": "behind" },
-			{ "time": 4, "name": "headAttach", "string": "attach.wav" }
-		],
 		"draworder": [
 			{
-				"time": 0.6206,
+				"time": 1.2362,
 				"offsets": [
 					{ "slot": "head", "offset": -12 },
 					{ "slot": "eyes", "offset": -12 }
 				]
 			},
 			{
-				"time": 1.7931,
+				"time": 3.5712,
 				"offsets": [
 					{ "slot": "head", "offset": 3 },
 					{ "slot": "eyes", "offset": 3 }
 				]
 			},
 			{
-				"time": 2.6206,
+				"time": 5.2195,
 				"offsets": [
 					{ "slot": "head", "offset": -12 },
 					{ "slot": "eyes", "offset": -12 }
 				]
 			},
-			{ "time": 3.5862 }
+			{ "time": 7.1425 }
+		],
+		"events": [
+			{ "time": 0, "name": "headPop", "string": "pop.wav" },
+			{ "time": 2.6097, "name": "behind" },
+			{ "time": 5.9063, "name": "behind" },
+			{ "time": 7.9666, "name": "headAttach", "string": "attach.wav" }
 		]
 	},
 	"jump": {

二进制
spine-libgdx/assets/spineboy/spineboy.png


二进制
spine-libgdx/test/spineboy.skel → spine-libgdx/assets/spineboy/spineboy.skel


+ 5 - 4
spine-libgdx/test/com/esotericsoftware/spine/AnimationStateTest.java

@@ -57,11 +57,12 @@ public class AnimationStateTest extends ApplicationAdapter {
 		camera = new OrthographicCamera();
 		batch = new SpriteBatch();
 		renderer = new SkeletonRenderer();
+		renderer.setPremultipliedAlpha(true);
 		debugRenderer = new SkeletonRendererDebug();
 
-		atlas = new TextureAtlas(Gdx.files.internal("spineboy.atlas"));
-		SkeletonJson json = new SkeletonJson(atlas); // This loads skeleton JSON data.
-		SkeletonData skeletonData = json.readSkeletonData(Gdx.files.internal("spineboy.json")); // SkeletonData is stateless.
+		atlas = new TextureAtlas(Gdx.files.internal("spineboy/spineboy.atlas"));
+		SkeletonJson json = new SkeletonJson(atlas); // This loads skeleton JSON data, which is stateless.
+		SkeletonData skeletonData = json.readSkeletonData(Gdx.files.internal("spineboy/spineboy.json"));
 
 		skeleton = new Skeleton(skeletonData); // Skeleton holds skeleton state (bone positions, slot attachments, etc).
 		skeleton.setX(250);
@@ -92,7 +93,7 @@ public class AnimationStateTest extends ApplicationAdapter {
 				System.out.println(trackIndex + " end: " + state.getCurrent(trackIndex));
 			}
 		});
-		state.setAnimation(0, "drawOrder", true);
+		state.setAnimation(0, "headPop", true);
 
 		Gdx.input.setInputProcessor(new InputAdapter() {
 			final Vector3 point = new Vector3();

+ 5 - 3
spine-libgdx/test/com/esotericsoftware/spine/Box2DExample.java

@@ -56,7 +56,7 @@ import com.badlogic.gdx.utils.Array;
 public class Box2DExample extends ApplicationAdapter {
 	SpriteBatch batch;
 	ShapeRenderer renderer;
-	SkeletonRenderer skeletonRenderer = new SkeletonRenderer();
+	SkeletonRenderer skeletonRenderer;
 
 	TextureAtlas atlas;
 	Skeleton skeleton;
@@ -74,8 +74,10 @@ public class Box2DExample extends ApplicationAdapter {
 	public void create () {
 		batch = new SpriteBatch();
 		renderer = new ShapeRenderer();
+		skeletonRenderer = new SkeletonRenderer();
+		skeletonRenderer.setPremultipliedAlpha(true);
 
-		atlas = new TextureAtlas(Gdx.files.internal("spineboy.atlas"));
+		atlas = new TextureAtlas(Gdx.files.internal("spineboy/spineboy.atlas"));
 
 		// This loader creates Box2dAttachments instead of RegionAttachments for an easy way to keep
 		// track of the Box2D body for each attachment.
@@ -90,7 +92,7 @@ public class Box2DExample extends ApplicationAdapter {
 		};
 		SkeletonJson json = new SkeletonJson(atlasLoader);
 		json.setScale(0.05f);
-		SkeletonData skeletonData = json.readSkeletonData(Gdx.files.internal("spineboy.json"));
+		SkeletonData skeletonData = json.readSkeletonData(Gdx.files.internal("spineboy/spineboy.json"));
 		animation = skeletonData.findAnimation("walk");
 
 		skeleton = new Skeleton(skeletonData);

+ 2 - 1
spine-libgdx/test/com/esotericsoftware/spine/MixTest.java

@@ -52,9 +52,10 @@ public class MixTest extends ApplicationAdapter {
 	public void create () {
 		batch = new SpriteBatch();
 		renderer = new SkeletonRenderer();
+		renderer.setPremultipliedAlpha(true);
 		debugRenderer = new SkeletonRendererDebug();
 
-		final String name = "spineboy";
+		final String name = "spineboy/spineboy";
 
 		TextureAtlas atlas = new TextureAtlas(Gdx.files.internal(name + ".atlas"));
 

+ 3 - 3
spine-libgdx/test/com/esotericsoftware/spine/NormalMapTest.java

@@ -68,13 +68,13 @@ public class NormalMapTest extends ApplicationAdapter {
 		batch.setShader(program);
 		renderer = new SkeletonRenderer();
 
-		TextureAtlas atlas = new TextureAtlas(Gdx.files.internal("spineboy-diffuse.atlas"));
+		TextureAtlas atlas = new TextureAtlas(Gdx.files.internal("spineboy/spineboy-diffuse.atlas"));
 		atlasTexture = atlas.getRegions().first().getTexture();
-		normalMapTexture = new Texture(Gdx.files.internal("spineboy-normal.png"));
+		normalMapTexture = new Texture(Gdx.files.internal("spineboy/spineboy-normal.png"));
 
 		SkeletonJson json = new SkeletonJson(atlas);
 		// json.setScale(2);
-		skeletonData = json.readSkeletonData(Gdx.files.internal("spineboy.json"));
+		skeletonData = json.readSkeletonData(Gdx.files.internal("spineboy/spineboy.json"));
 		animation = skeletonData.findAnimation("walk");
 
 		skeleton = new Skeleton(skeletonData);

+ 363 - 50
spine-libgdx/test/com/esotericsoftware/spine/SkeletonTest.java

@@ -28,9 +28,13 @@
 
 package com.esotericsoftware.spine;
 
+import static com.badlogic.gdx.scenes.scene2d.actions.Actions.*;
+
 import com.badlogic.gdx.ApplicationAdapter;
 import com.badlogic.gdx.Gdx;
 import com.badlogic.gdx.InputAdapter;
+import com.badlogic.gdx.InputMultiplexer;
+import com.badlogic.gdx.Preferences;
 import com.badlogic.gdx.backends.lwjgl.LwjglApplication;
 import com.badlogic.gdx.files.FileHandle;
 import com.badlogic.gdx.graphics.Color;
@@ -42,33 +46,64 @@ import com.badlogic.gdx.graphics.g2d.PolygonSpriteBatch;
 import com.badlogic.gdx.graphics.g2d.TextureAtlas;
 import com.badlogic.gdx.graphics.g2d.TextureAtlas.AtlasRegion;
 import com.badlogic.gdx.graphics.g2d.TextureAtlas.TextureAtlasData;
+import com.badlogic.gdx.scenes.scene2d.Actor;
+import com.badlogic.gdx.scenes.scene2d.InputEvent;
+import com.badlogic.gdx.scenes.scene2d.InputListener;
+import com.badlogic.gdx.scenes.scene2d.Stage;
+import com.badlogic.gdx.scenes.scene2d.Touchable;
+import com.badlogic.gdx.scenes.scene2d.ui.CheckBox;
+import com.badlogic.gdx.scenes.scene2d.ui.Label;
+import com.badlogic.gdx.scenes.scene2d.ui.List;
+import com.badlogic.gdx.scenes.scene2d.ui.ScrollPane;
+import com.badlogic.gdx.scenes.scene2d.ui.Slider;
+import com.badlogic.gdx.scenes.scene2d.ui.Table;
+import com.badlogic.gdx.scenes.scene2d.ui.TextButton;
+import com.badlogic.gdx.scenes.scene2d.ui.WidgetGroup;
+import com.badlogic.gdx.scenes.scene2d.ui.Window;
+import com.badlogic.gdx.scenes.scene2d.utils.ChangeListener;
+import com.badlogic.gdx.scenes.scene2d.utils.ClickListener;
 import com.badlogic.gdx.utils.Array;
 
+import java.awt.FileDialog;
+import java.awt.Frame;
+import java.io.File;
+
 public class SkeletonTest extends ApplicationAdapter {
+	UI ui;
+
 	PolygonSpriteBatch batch;
-	float time;
 	SkeletonRenderer renderer;
 	SkeletonRendererDebug debugRenderer;
-
 	SkeletonData skeletonData;
 	Skeleton skeleton;
-	Animation animation;
-	Array<Event> events = new Array();
+	AnimationState state;
+	int skeletonX, skeletonY;
+	FileHandle skeletonFile;
+	long lastModified;
+	float lastModifiedCheck;
 
 	public void create () {
+		ui = new UI();
 		batch = new PolygonSpriteBatch();
 		renderer = new SkeletonRenderer();
 		debugRenderer = new SkeletonRendererDebug();
+		skeletonX = (int)(ui.window.getWidth() + (Gdx.graphics.getWidth() - ui.window.getWidth()) / 2);
+		skeletonY = Gdx.graphics.getHeight() / 4;
+
+		loadSkeleton(Gdx.files.internal(Gdx.app.getPreferences("spine-skeletontest")
+			.getString("lastFile", "spineboy/spineboy.json")));
+	}
 
-		final String name = "goblins"; // "spineboy";
+	void loadSkeleton (FileHandle skeletonFile) {
+		if (skeletonFile == null) return;
 
 		// A regular texture atlas would normally usually be used. This returns a white image for images not found in the atlas.
 		Pixmap pixmap = new Pixmap(32, 32, Format.RGBA8888);
-		pixmap.setColor(Color.WHITE);
+		pixmap.setColor(new Color(1, 1, 1, 0.33f));
 		pixmap.fill();
 		final AtlasRegion fake = new AtlasRegion(new Texture(pixmap), 0, 0, 32, 32);
 		pixmap.dispose();
-		FileHandle atlasFile = Gdx.files.internal(name + ".atlas");
+		FileHandle atlasFile = skeletonFile.sibling(skeletonFile.nameWithoutExtension() + ".atlas");
 		TextureAtlasData data = !atlasFile.exists() ? null : new TextureAtlasData(atlasFile, atlasFile.parent(), false);
 		TextureAtlas atlas = new TextureAtlas(data) {
 			public AtlasRegion findRegion (String name) {
@@ -77,73 +112,351 @@ public class SkeletonTest extends ApplicationAdapter {
 			}
 		};
 
-		if (true) {
-			System.out.println("JSON");
-			SkeletonJson json = new SkeletonJson(atlas);
-			// json.setScale(2);
-			skeletonData = json.readSkeletonData(Gdx.files.internal(name + ".json"));
-		} else {
-			System.out.println("Binary");
-			SkeletonBinary binary = new SkeletonBinary(atlas);
-			// binary.setScale(2);
-			skeletonData = binary.readSkeletonData(Gdx.files.internal(name + ".skel"));
+		try {
+			if (skeletonFile.extension().equalsIgnoreCase("json")) {
+				SkeletonJson json = new SkeletonJson(atlas);
+				json.setScale(ui.scaleSlider.getValue());
+				skeletonData = json.readSkeletonData(skeletonFile);
+			} else {
+				SkeletonBinary binary = new SkeletonBinary(atlas);
+				binary.setScale(ui.scaleSlider.getValue());
+				skeletonData = binary.readSkeletonData(skeletonFile);
+			}
+		} catch (Exception ex) {
+			ex.printStackTrace();
+			ui.toast("Error loading skeleton: spineboy");
+			lastModifiedCheck = 5;
+			return;
 		}
-		animation = skeletonData.findAnimation("walk");
 
 		skeleton = new Skeleton(skeletonData);
-		if (name.equals("goblins")) skeleton.setSkin("goblin");
 		skeleton.setToSetupPose();
 		skeleton = new Skeleton(skeleton);
 		skeleton.updateWorldTransform();
 
-		Gdx.input.setInputProcessor(new InputAdapter() {
-			public boolean touchDown (int screenX, int screenY, int pointer, int button) {
-				keyDown(0);
-				return true;
-			}
+		state = new AnimationState(new AnimationStateData(skeletonData));
 
-			public boolean keyDown (int keycode) {
-				if (name.equals("goblins")) {
-					skeleton.setSkin(skeleton.getSkin().getName().equals("goblin") ? "goblingirl" : "goblin");
-					skeleton.setSlotsToSetupPose();
-				}
-				return true;
-			}
-		});
+		this.skeletonFile = skeletonFile;
+		Preferences prefs = Gdx.app.getPreferences("spine-skeletontest");
+		prefs.putString("lastFile", skeletonFile.path());
+		prefs.flush();
+		lastModified = skeletonFile.lastModified();
+		lastModifiedCheck = 0.250f;
+
+		// Populate UI.
+
+		ui.skeletonLabel.setText(skeletonFile.name());
+		{
+			Array<String> items = new Array();
+			for (Skin skin : skeletonData.getSkins())
+				items.add(skin.getName());
+			ui.skinList.setItems(items);
+		}
+		{
+			Array<String> items = new Array();
+			for (Animation animation : skeletonData.getAnimations())
+				items.add(animation.getName());
+			ui.animationList.setItems(items);
+		}
+
+		// Configure skeleton from UI.
+
+		skeleton.setSkin(ui.skinList.getSelected());
+		skeleton.setSlotsToSetupPose();
+		state.setAnimation(0, ui.animationList.getSelected(), ui.loopCheckbox.isChecked());
 	}
 
 	public void render () {
-		float lastTime = time;
-		time += Gdx.graphics.getDeltaTime();
+		Gdx.gl.glClear(GL10.GL_COLOR_BUFFER_BIT);
 
-		float x = skeleton.getX() + 160 * Gdx.graphics.getDeltaTime() * (skeleton.getFlipX() ? -1 : 1);
-		if (x > Gdx.graphics.getWidth()) skeleton.setFlipX(true);
-		if (x < 0) skeleton.setFlipX(false);
-		skeleton.setX(x);
-		skeleton.setX(300);
+		if (skeleton != null) {
+			lastModifiedCheck -= Gdx.graphics.getDeltaTime();
+			if (lastModifiedCheck < 0 && lastModified != skeletonFile.lastModified()) loadSkeleton(skeletonFile);
 
-		Gdx.gl.glClear(GL10.GL_COLOR_BUFFER_BIT);
+			state.getData().setDefaultMix(ui.mixSlider.getValue());
+			renderer.setPremultipliedAlpha(ui.premultipliedCheckbox.isChecked());
 
-		events.clear();
-		animation.apply(skeleton, lastTime, time, true, events);
-		if (events.size > 0) System.out.println(events);
+			float delta = Math.min(Gdx.graphics.getDeltaTime(), 0.032f) * ui.speedSlider.getValue();
+			skeleton.update(delta);
+			if (!ui.pauseButton.isChecked()) {
+				state.update(delta);
+				state.apply(skeleton);
+			}
+			skeleton.updateWorldTransform();
+			skeleton.setX(skeletonX);
+			skeleton.setY(skeletonY);
+			skeleton.setFlipX(ui.flipXCheckbox.isChecked());
+			skeleton.setFlipY(ui.flipYCheckbox.isChecked());
 
-		skeleton.updateWorldTransform();
-		skeleton.update(Gdx.graphics.getDeltaTime());
+			batch.begin();
+			renderer.draw(batch, skeleton);
+			batch.end();
 
-		batch.begin();
-		renderer.draw(batch, skeleton);
-		batch.end();
+			debugRenderer.setBones(ui.debugBonesCheckbox.isChecked());
+			debugRenderer.setRegionAttachments(ui.debugRegionsCheckbox.isChecked());
+			debugRenderer.setBoundingBoxes(ui.debugBoundingBoxesCheckbox.isChecked());
+			debugRenderer.draw(skeleton);
+		}
 
-		//debugRenderer.draw(skeleton);
+		ui.stage.act();
+		ui.stage.draw();
 	}
 
 	public void resize (int width, int height) {
 		batch.getProjectionMatrix().setToOrtho2D(0, 0, width, height);
 		debugRenderer.getShapeRenderer().setProjectionMatrix(batch.getProjectionMatrix());
+		ui.stage.setViewport(width, height);
+		if (!ui.minimizeButton.isChecked()) ui.window.setHeight(height);
+	}
+
+	class UI {
+		Stage stage = new Stage();
+		com.badlogic.gdx.scenes.scene2d.ui.Skin skin = new com.badlogic.gdx.scenes.scene2d.ui.Skin(
+			Gdx.files.internal("skin/skin.json"));
+
+		Window window = new Window("Skeleton", skin);
+		Table root = new Table(skin);
+		TextButton browseButton = new TextButton("Browse", skin);
+		Label skeletonLabel = new Label("", skin);
+		List<String> animationList = new List(skin);
+		List<String> skinList = new List(skin);
+		CheckBox loopCheckbox = new CheckBox(" Loop", skin);
+		CheckBox premultipliedCheckbox = new CheckBox(" Premultiplied", skin);
+		Slider mixSlider = new Slider(0f, 2, 0.01f, false, skin);
+		Label mixLabel = new Label("0.3", skin);
+		Slider speedSlider = new Slider(0.1f, 3, 0.01f, false, skin);
+		Label speedLabel = new Label("1.0", skin);
+		CheckBox flipXCheckbox = new CheckBox(" X", skin);
+		CheckBox flipYCheckbox = new CheckBox(" Y", skin);
+		CheckBox debugBonesCheckbox = new CheckBox(" Bones", skin);
+		CheckBox debugRegionsCheckbox = new CheckBox(" Regions", skin);
+		CheckBox debugBoundingBoxesCheckbox = new CheckBox(" Bounds", skin);
+		Slider scaleSlider = new Slider(0.1f, 3, 0.01f, false, skin);
+		Label scaleLabel = new Label("1.0", skin);
+		TextButton pauseButton = new TextButton("Pause", skin, "toggle");
+		TextButton minimizeButton = new TextButton("-", skin);
+		TextButton bonesSetupPoseButton = new TextButton("Bones", skin);
+		TextButton slotsSetupPoseButton = new TextButton("Slots", skin);
+		TextButton setupPoseButton = new TextButton("Both", skin);
+		WidgetGroup toasts = new WidgetGroup();
+
+		public UI () {
+			// Configure widgets.
+
+			premultipliedCheckbox.setChecked(true);
+
+			loopCheckbox.setChecked(true);
+
+			scaleSlider.setValue(1);
+			scaleSlider.setSnapToValues(new float[] {1}, 0.1f);
+
+			mixSlider.setValue(0.3f);
+
+			speedSlider.setValue(1);
+			speedSlider.setSnapToValues(new float[] {1}, 0.1f);
+
+			window.setMovable(false);
+			window.setResizable(false);
+
+			minimizeButton.padTop(-2).padLeft(5);
+			minimizeButton.getColor().a = 0.66f;
+			window.getButtonTable().add(minimizeButton).size(20, 20);
+
+			// Layout.
+
+			root.pad(2, 4, 4, 4).defaults().space(6);
+			root.columnDefaults(0).top().right();
+			root.columnDefaults(1).left();
+			root.row().padTop(6);
+			root.add("Skeleton:");
+			{
+				Table table = table();
+				table.add(skeletonLabel).fillX().expandX();
+				table.add(browseButton);
+				root.add(table).fill().row();
+			}
+			root.add("Scale:");
+			{
+				Table table = table();
+				table.add(scaleLabel).width(29);
+				table.add(scaleSlider).fillX().expandX();
+				root.add(table).fill().row();
+			}
+			root.add("Flip:");
+			root.add(table(flipXCheckbox, flipYCheckbox)).row();
+			root.add("Debug:");
+			root.add(table(debugBonesCheckbox, debugRegionsCheckbox, debugBoundingBoxesCheckbox)).row();
+			root.add("Alpha:");
+			root.add(premultipliedCheckbox).row();
+			root.add("Skin:");
+			root.add(new ScrollPane(skinList, skin)).expand().fill().minHeight(75).row();
+			root.add("Setup Pose:");
+			root.add(table(bonesSetupPoseButton, slotsSetupPoseButton, setupPoseButton)).row();
+			root.add("Animation:");
+			root.add(new ScrollPane(animationList, skin)).expand().fill().minHeight(75).row();
+			root.add("Mix:");
+			{
+				Table table = table();
+				table.add(mixLabel).width(29);
+				table.add(mixSlider).fillX().expandX();
+				root.add(table).fill().row();
+			}
+			root.add("Speed:");
+			{
+				Table table = table();
+				table.add(speedLabel).width(29);
+				table.add(speedSlider).fillX().expandX();
+				root.add(table).fill().row();
+			}
+			root.add("Playback:");
+			root.add(table(pauseButton, loopCheckbox)).row();
+
+			window.add(root).expand().fill();
+			window.pack();
+			stage.addActor(window);
+
+			{
+				Table table = new Table(skin);
+				table.setFillParent(true);
+				table.setTouchable(Touchable.disabled);
+				stage.addActor(table);
+				table.pad(10).bottom().right();
+				table.add(toasts);
+				table.debug();
+			}
+
+			// Events.
+
+			window.addListener(new InputListener() {
+				public boolean touchDown (InputEvent event, float x, float y, int pointer, int button) {
+					event.cancel();
+					return true;
+				}
+			});
+
+			browseButton.addListener(new ChangeListener() {
+				public void changed (ChangeEvent event, Actor actor) {
+					FileDialog fileDialog = new FileDialog((Frame)null, "Choose skeleton file");
+					fileDialog.setMode(FileDialog.LOAD);
+					fileDialog.setVisible(true);
+					String name = fileDialog.getFile();
+					String dir = fileDialog.getDirectory();
+					if (name == null || dir == null) return;
+					loadSkeleton(new FileHandle(new File(dir, name).getAbsolutePath()));
+				}
+			});
+
+			setupPoseButton.addListener(new ChangeListener() {
+				public void changed (ChangeEvent event, Actor actor) {
+					if (skeleton != null) skeleton.setToSetupPose();
+				}
+			});
+			bonesSetupPoseButton.addListener(new ChangeListener() {
+				public void changed (ChangeEvent event, Actor actor) {
+					if (skeleton != null) skeleton.setBonesToSetupPose();
+				}
+			});
+			slotsSetupPoseButton.addListener(new ChangeListener() {
+				public void changed (ChangeEvent event, Actor actor) {
+					if (skeleton != null) skeleton.setSlotsToSetupPose();
+				}
+			});
+
+			minimizeButton.addListener(new ClickListener() {
+				public boolean touchDown (InputEvent event, float x, float y, int pointer, int button) {
+					event.cancel();
+					return super.touchDown(event, x, y, pointer, button);
+				}
+
+				public void clicked (InputEvent event, float x, float y) {
+					if (minimizeButton.isChecked()) {
+						window.getCells().get(0).setWidget(null);
+						window.setHeight(20);
+						minimizeButton.setText("+");
+					} else {
+						window.getCells().get(0).setWidget(root);
+						ui.window.setHeight(Gdx.graphics.getHeight());
+						minimizeButton.setText("-");
+					}
+				}
+			});
+
+			scaleSlider.addListener(new ChangeListener() {
+				public void changed (ChangeEvent event, Actor actor) {
+					scaleLabel.setText(Float.toString((int)(scaleSlider.getValue() * 100) / 100f));
+					if (!scaleSlider.isDragging()) loadSkeleton(skeletonFile);
+				}
+			});
+
+			speedSlider.addListener(new ChangeListener() {
+				public void changed (ChangeEvent event, Actor actor) {
+					speedLabel.setText(Float.toString((int)(speedSlider.getValue() * 100) / 100f));
+				}
+			});
+
+			mixSlider.addListener(new ChangeListener() {
+				public void changed (ChangeEvent event, Actor actor) {
+					mixLabel.setText(Float.toString((int)(mixSlider.getValue() * 100) / 100f));
+					if (state != null) state.getData().setDefaultMix(mixSlider.getValue());
+				}
+			});
+
+			animationList.addListener(new ChangeListener() {
+				public void changed (ChangeEvent event, Actor actor) {
+					if (state != null) state.setAnimation(0, animationList.getSelected(), loopCheckbox.isChecked());
+				}
+			});
+
+			skinList.addListener(new ChangeListener() {
+				public void changed (ChangeEvent event, Actor actor) {
+					if (skeleton != null) {
+						skeleton.setSkin(skinList.getSelected());
+						skeleton.setSlotsToSetupPose();
+					}
+				}
+			});
+
+			Gdx.input.setInputProcessor(new InputMultiplexer(stage, new InputAdapter() {
+				public boolean touchDown (int screenX, int screenY, int pointer, int button) {
+					touchDragged(screenX, screenY, pointer);
+					return false;
+				}
+
+				public boolean touchDragged (int screenX, int screenY, int pointer) {
+					skeletonX = screenX;
+					skeletonY = Gdx.graphics.getHeight() - screenY;
+					return false;
+				}
+			}));
+		}
+
+		private Table table (Actor... actors) {
+			Table table = new Table();
+			table.defaults().space(6);
+			table.add(actors);
+			return table;
+		}
+
+		void toast (String text) {
+			Table table = new Table();
+			table.add(new Label(text, skin));
+			table.getColor().a = 0;
+			table.pack();
+			table.setPosition(-table.getWidth(), -3 - table.getHeight());
+			table.addAction(sequence( //
+				parallel(moveBy(0, table.getHeight(), 0.3f), fadeIn(0.3f)), //
+				delay(5f), //
+				parallel(moveBy(0, table.getHeight(), 0.3f), fadeOut(0.3f)), //
+				removeActor() //
+				));
+			for (Actor actor : toasts.getChildren())
+				actor.addAction(moveBy(0, table.getHeight(), 0.3f));
+			toasts.addActor(table);
+			toasts.getParent().toFront();
+		}
 	}
 
 	public static void main (String[] args) throws Exception {
-		new LwjglApplication(new SkeletonTest());
+		new LwjglApplication(new SkeletonTest(), "SkeletonTest", 800, 600, true);
 	}
 }

+ 0 - 531
spine-libgdx/test/goblins.json

@@ -1,531 +0,0 @@
-{
-"bones": [
-	{ "name": "root" },
-	{ "name": "hip", "parent": "root", "x": 0.64, "y": 114.41 },
-	{ "name": "left upper leg", "parent": "hip", "length": 50.39, "x": 14.45, "y": 2.81, "rotation": -89.09 },
-	{ "name": "pelvis", "parent": "hip", "x": 1.41, "y": -6.57 },
-	{ "name": "right upper leg", "parent": "hip", "length": 42.45, "x": -20.07, "y": -6.83, "rotation": -97.49 },
-	{ "name": "torso", "parent": "hip", "length": 85.82, "x": -6.42, "y": 1.97, "rotation": 93.92 },
-	{ "name": "left lower leg", "parent": "left upper leg", "length": 49.89, "x": 56.34, "y": 0.98, "rotation": -16.65 },
-	{ "name": "left shoulder", "parent": "torso", "length": 35.43, "x": 74.04, "y": -20.38, "rotation": -156.96 },
-	{ "name": "neck", "parent": "torso", "length": 18.38, "x": 81.67, "y": -6.34, "rotation": -1.51 },
-	{ "name": "right lower leg", "parent": "right upper leg", "length": 58.52, "x": 42.99, "y": -0.61, "rotation": -14.34 },
-	{ "name": "right shoulder", "parent": "torso", "length": 37.24, "x": 76.02, "y": 18.14, "rotation": 133.88 },
-	{ "name": "head", "parent": "neck", "length": 68.28, "x": 20.93, "y": 11.59, "rotation": -13.92, "color": "d48387ff" },
-	{ "name": "left arm", "parent": "left shoulder", "length": 35.62, "x": 37.85, "y": -2.34, "rotation": 28.16 },
-	{ "name": "left foot", "parent": "left lower leg", "length": 46.5, "x": 58.94, "y": -7.61, "rotation": 102.43 },
-	{ "name": "right arm", "parent": "right shoulder", "length": 36.74, "x": 37.6, "y": 0.31, "rotation": 36.32 },
-	{ "name": "right foot", "parent": "right lower leg", "length": 45.45, "x": 64.88, "y": 0.04, "rotation": 110.3 },
-	{ "name": "left hand", "parent": "left arm", "length": 11.52, "x": 35.62, "y": 0.07, "rotation": 2.7 },
-	{ "name": "right hand", "parent": "right arm", "length": 15.32, "x": 36.9, "y": 0.34, "rotation": 2.35 }
-],
-"slots": [
-	{ "name": "left shoulder", "bone": "left shoulder", "attachment": "left shoulder" },
-	{ "name": "left arm", "bone": "left arm", "attachment": "left arm" },
-	{ "name": "left hand item", "bone": "left hand", "attachment": "spear" },
-	{ "name": "left hand", "bone": "left hand", "attachment": "left hand" },
-	{ "name": "left foot", "bone": "left foot", "attachment": "left foot" },
-	{ "name": "left lower leg", "bone": "left lower leg", "attachment": "left lower leg" },
-	{ "name": "left upper leg", "bone": "left upper leg", "attachment": "left upper leg" },
-	{ "name": "neck", "bone": "neck", "attachment": "neck" },
-	{ "name": "torso", "bone": "torso", "attachment": "goblin/head" },
-	{ "name": "pelvis", "bone": "pelvis", "attachment": "pelvis" },
-	{ "name": "right foot", "bone": "right foot", "attachment": "right foot" },
-	{ "name": "right lower leg", "bone": "right lower leg", "attachment": "right lower leg" },
-	{ "name": "undie straps", "bone": "pelvis", "attachment": "undie straps" },
-	{ "name": "undies", "bone": "pelvis", "attachment": "undies" },
-	{ "name": "right upper leg", "bone": "right upper leg", "attachment": "right upper leg" },
-	{ "name": "head", "bone": "head", "attachment": "head" },
-	{ "name": "eyes", "bone": "head" },
-	{ "name": "right shoulder", "bone": "right shoulder", "attachment": "right shoulder" },
-	{ "name": "right arm", "bone": "right arm", "attachment": "right arm" },
-	{ "name": "right hand item", "bone": "right hand", "attachment": "dagger" },
-	{ "name": "right hand", "bone": "right hand", "attachment": "right hand" }
-],
-"skins": {
-	"default": {
-		"left hand item": {
-			"dagger": { "x": 7.88, "y": -23.45, "rotation": 10.47, "width": 26, "height": 108 },
-			"spear": { "x": -4.55, "y": 39.2, "rotation": 13.04, "width": 22, "height": 368 }
-		},
-		"right hand item": {
-			"dagger": { "x": 6.51, "y": -24.15, "rotation": -8.06, "width": 26, "height": 108 }
-		},
-		"torso": {
-			"goblin/head": {
-				"type": "mesh",
-				"vertices": [ 87.34, -39.83, 109.98, 60.57, 174.32, 46.07, 151.68, -54.33 ],
-				"triangles": [ 1, 2, 3, 1, 3, 0 ],
-				"uvs": [ 1, 1, 0, 1, 0, 0, 1, 0 ],
-				"edges": [ 0, 2, 2, 4, 4, 6, 0, 6 ],
-				"hull": 8,
-				"width": 103,
-				"height": 66
-			}
-		}
-	},
-	"goblin": {
-		"eyes": {
-			"eyes closed": { "name": "goblin/eyes-closed", "x": 32.21, "y": -21.27, "rotation": -88.92, "width": 34, "height": 12 }
-		},
-		"left arm": {
-			"left arm": {
-				"name": "goblin/left-arm",
-				"x": 16.7,
-				"y": -1.69,
-				"scaleX": 1.057,
-				"scaleY": 1.057,
-				"rotation": 33.84,
-				"width": 37,
-				"height": 35
-			}
-		},
-		"left foot": {
-			"left foot": { "name": "goblin/left-foot", "x": 24.85, "y": 8.74, "rotation": 3.32, "width": 65, "height": 31 }
-		},
-		"left hand": {
-			"left hand": {
-				"name": "goblin/left-hand",
-				"x": 3.47,
-				"y": 3.41,
-				"scaleX": 0.892,
-				"scaleY": 0.892,
-				"rotation": 31.14,
-				"width": 36,
-				"height": 41
-			}
-		},
-		"left lower leg": {
-			"left lower leg": { "name": "goblin/left-lower-leg", "x": 23.58, "y": -2.06, "rotation": 105.75, "width": 33, "height": 70 }
-		},
-		"left shoulder": {
-			"left shoulder": { "name": "goblin/left-shoulder", "x": 15.56, "y": -2.26, "rotation": 62.01, "width": 29, "height": 44 }
-		},
-		"left upper leg": {
-			"left upper leg": { "name": "goblin/left-upper-leg", "x": 29.68, "y": -3.87, "rotation": 89.09, "width": 33, "height": 73 }
-		},
-		"neck": {
-			"neck": { "name": "goblin/neck", "x": 10.1, "y": 0.42, "rotation": -93.69, "width": 36, "height": 41 }
-		},
-		"pelvis": {
-			"pelvis": { "name": "goblin/pelvis", "x": -5.61, "y": 0.76, "width": 62, "height": 43 }
-		},
-		"right arm": {
-			"right arm": { "name": "goblin/right-arm", "x": 16.44, "y": -1.04, "rotation": 94.32, "width": 23, "height": 50 }
-		},
-		"right foot": {
-			"right foot": { "name": "goblin/right-foot", "x": 23.56, "y": 9.8, "rotation": 1.52, "width": 63, "height": 33 }
-		},
-		"right hand": {
-			"right hand": { "name": "goblin/right-hand", "x": 7.88, "y": 2.78, "rotation": 91.96, "width": 36, "height": 37 }
-		},
-		"right lower leg": {
-			"right lower leg": { "name": "goblin/right-lower-leg", "x": 25.68, "y": -3.15, "rotation": 111.83, "width": 36, "height": 76 }
-		},
-		"right shoulder": {
-			"right shoulder": { "name": "goblin/right-shoulder", "x": 15.68, "y": -1.03, "rotation": 130.65, "width": 39, "height": 45 }
-		},
-		"right upper leg": {
-			"right upper leg": { "name": "goblin/right-upper-leg", "x": 20.35, "y": 1.47, "rotation": 97.49, "width": 34, "height": 63 }
-		},
-		"torso": {
-			"torso": { "name": "goblin/torso", "x": 38.09, "y": -3.87, "rotation": -94.95, "width": 68, "height": 96 }
-		},
-		"undie straps": {
-			"undie straps": { "name": "goblin/undie-straps", "x": -3.87, "y": 13.1, "scaleX": 1.089, "width": 55, "height": 19 }
-		},
-		"undies": {
-			"undies": { "name": "goblin/undies", "x": 6.3, "y": 0.12, "rotation": 0.91, "width": 36, "height": 29 }
-		}
-	},
-	"goblingirl": {
-		"eyes": {
-			"eyes closed": { "name": "goblingirl/eyes-closed", "x": 28, "y": -25.54, "rotation": -87.04, "width": 37, "height": 21 }
-		},
-		"head": {
-			"head": { "name": "goblingirl/head", "x": 27.71, "y": -4.32, "rotation": -85.58, "width": 103, "height": 81 }
-		},
-		"left arm": {
-			"left arm": { "name": "goblingirl/left-arm", "x": 19.64, "y": -2.42, "rotation": 33.05, "width": 37, "height": 35 }
-		},
-		"left foot": {
-			"left foot": { "name": "goblingirl/left-foot", "x": 25.17, "y": 7.92, "rotation": 3.32, "width": 65, "height": 31 }
-		},
-		"left hand": {
-			"left hand": {
-				"name": "goblingirl/left-hand",
-				"x": 4.34,
-				"y": 2.39,
-				"scaleX": 0.896,
-				"scaleY": 0.896,
-				"rotation": 30.34,
-				"width": 35,
-				"height": 40
-			}
-		},
-		"left lower leg": {
-			"left lower leg": { "name": "goblingirl/left-lower-leg", "x": 25.02, "y": -0.6, "rotation": 105.75, "width": 33, "height": 70 }
-		},
-		"left shoulder": {
-			"left shoulder": { "name": "goblingirl/left-shoulder", "x": 19.8, "y": -0.42, "rotation": 61.21, "width": 28, "height": 46 }
-		},
-		"left upper leg": {
-			"left upper leg": { "name": "goblingirl/left-upper-leg", "x": 30.21, "y": -2.95, "rotation": 89.09, "width": 33, "height": 70 }
-		},
-		"neck": {
-			"neck": { "name": "goblingirl/neck", "x": 6.16, "y": -3.14, "rotation": -98.86, "width": 35, "height": 41 }
-		},
-		"pelvis": {
-			"pelvis": { "name": "goblingirl/pelvis", "x": -3.87, "y": 3.18, "width": 62, "height": 43 }
-		},
-		"right arm": {
-			"right arm": { "name": "goblingirl/right-arm", "x": 16.85, "y": -0.66, "rotation": 93.52, "width": 28, "height": 50 }
-		},
-		"right foot": {
-			"right foot": { "name": "goblingirl/right-foot", "x": 23.46, "y": 9.66, "rotation": 1.52, "width": 63, "height": 33 }
-		},
-		"right hand": {
-			"right hand": { "name": "goblingirl/right-hand", "x": 7.21, "y": 3.43, "rotation": 91.16, "width": 36, "height": 37 }
-		},
-		"right lower leg": {
-			"right lower leg": { "name": "goblingirl/right-lower-leg", "x": 26.15, "y": -3.27, "rotation": 111.83, "width": 36, "height": 76 }
-		},
-		"right shoulder": {
-			"right shoulder": { "name": "goblingirl/right-shoulder", "x": 14.46, "y": 0.45, "rotation": 129.85, "width": 39, "height": 45 }
-		},
-		"right upper leg": {
-			"right upper leg": { "name": "goblingirl/right-upper-leg", "x": 19.69, "y": 2.13, "rotation": 97.49, "width": 34, "height": 63 }
-		},
-		"torso": {
-			"torso": { "name": "goblingirl/torso", "x": 36.28, "y": -5.14, "rotation": -95.74, "width": 68, "height": 96 }
-		},
-		"undie straps": {
-			"undie straps": { "name": "goblingirl/undie-straps", "x": -1.51, "y": 14.18, "width": 55, "height": 19 }
-		},
-		"undies": {
-			"undies": { "name": "goblingirl/undies", "x": 5.4, "y": 1.7, "width": 36, "height": 29 }
-		}
-	}
-},
-"events": {
-	"test1": { "int": 1, "float": 2, "string": "three" },
-	"test2": {}
-},
-"animations": {
-	"walk": {
-		"bones": {
-			"left upper leg": {
-				"rotate": [
-					{ "time": 0, "angle": -26.55 },
-					{ "time": 0.1333, "angle": -8.78 },
-					{ "time": 0.2333, "angle": 9.51 },
-					{ "time": 0.3666, "angle": 30.74 },
-					{ "time": 0.5, "angle": 25.33 },
-					{ "time": 0.6333, "angle": 26.11 },
-					{ "time": 0.7333, "angle": -7.7 },
-					{ "time": 0.8666, "angle": -21.19 },
-					{ "time": 1, "angle": -26.55 }
-				],
-				"translate": [
-					{ "time": 0, "x": -1.32, "y": 1.7 },
-					{ "time": 0.3666, "x": -0.06, "y": 2.42 },
-					{ "time": 1, "x": -1.32, "y": 1.7 }
-				]
-			},
-			"right upper leg": {
-				"rotate": [
-					{ "time": 0, "angle": 42.45 },
-					{ "time": 0.1333, "angle": 52.1 },
-					{ "time": 0.2333, "angle": 8.53 },
-					{ "time": 0.5, "angle": -16.93 },
-					{ "time": 0.6333, "angle": 1.89 },
-					{
-						"time": 0.7333,
-						"angle": 28.06,
-						"curve": [ 0.462, 0.11, 1, 1 ]
-					},
-					{
-						"time": 0.8666,
-						"angle": 58.68,
-						"curve": [ 0.5, 0.02, 1, 1 ]
-					},
-					{ "time": 1, "angle": 42.45 }
-				],
-				"translate": [
-					{ "time": 0, "x": 6.23, "y": 0 },
-					{ "time": 0.2333, "x": 2.14, "y": 2.4 },
-					{ "time": 0.5, "x": 2.44, "y": 4.8 },
-					{ "time": 1, "x": 6.23, "y": 0 }
-				]
-			},
-			"left lower leg": {
-				"rotate": [
-					{ "time": 0, "angle": -22.98 },
-					{ "time": 0.1333, "angle": -63.5 },
-					{ "time": 0.2333, "angle": -73.76 },
-					{ "time": 0.5, "angle": 5.11 },
-					{ "time": 0.6333, "angle": -28.29 },
-					{ "time": 0.7333, "angle": 4.08 },
-					{ "time": 0.8666, "angle": 3.53 },
-					{ "time": 1, "angle": -22.98 }
-				],
-				"translate": [
-					{ "time": 0, "x": 0, "y": 0 },
-					{ "time": 0.2333, "x": 2.55, "y": -0.47 },
-					{ "time": 0.5, "x": 0, "y": 0, "curve": "stepped" },
-					{ "time": 1, "x": 0, "y": 0 }
-				]
-			},
-			"left foot": {
-				"rotate": [
-					{ "time": 0, "angle": -3.69 },
-					{ "time": 0.1333, "angle": -10.42 },
-					{ "time": 0.2333, "angle": -5.01 },
-					{ "time": 0.3666, "angle": 3.87 },
-					{ "time": 0.5, "angle": -3.87 },
-					{ "time": 0.6333, "angle": 2.78 },
-					{ "time": 0.7333, "angle": 1.68 },
-					{ "time": 0.8666, "angle": -8.54 },
-					{ "time": 1, "angle": -3.69 }
-				]
-			},
-			"right shoulder": {
-				"rotate": [
-					{
-						"time": 0,
-						"angle": 5.29,
-						"curve": [ 0.264, 0, 0.75, 1 ]
-					},
-					{ "time": 0.6333, "angle": 6.65 },
-					{ "time": 1, "angle": 5.29 }
-				]
-			},
-			"right arm": {
-				"rotate": [
-					{
-						"time": 0,
-						"angle": -4.02,
-						"curve": [ 0.267, 0, 0.804, 0.99 ]
-					},
-					{
-						"time": 0.6333,
-						"angle": 19.78,
-						"curve": [ 0.307, 0, 0.787, 0.99 ]
-					},
-					{ "time": 1, "angle": -4.02 }
-				]
-			},
-			"right hand": {
-				"rotate": [
-					{ "time": 0, "angle": 8.98 },
-					{ "time": 0.6333, "angle": 0.51 },
-					{ "time": 1, "angle": 8.98 }
-				]
-			},
-			"left shoulder": {
-				"rotate": [
-					{
-						"time": 0,
-						"angle": 6.25,
-						"curve": [ 0.339, 0, 0.683, 1 ]
-					},
-					{
-						"time": 0.5,
-						"angle": -11.78,
-						"curve": [ 0.281, 0, 0.686, 0.99 ]
-					},
-					{ "time": 1, "angle": 6.25 }
-				],
-				"translate": [
-					{ "time": 0, "x": 1.15, "y": 0.23 }
-				]
-			},
-			"left hand": {
-				"rotate": [
-					{
-						"time": 0,
-						"angle": -21.23,
-						"curve": [ 0.295, 0, 0.755, 0.98 ]
-					},
-					{
-						"time": 0.5,
-						"angle": -27.28,
-						"curve": [ 0.241, 0, 0.75, 0.97 ]
-					},
-					{ "time": 1, "angle": -21.23 }
-				]
-			},
-			"left arm": {
-				"rotate": [
-					{
-						"time": 0,
-						"angle": 28.37,
-						"curve": [ 0.339, 0, 0.683, 1 ]
-					},
-					{
-						"time": 0.5,
-						"angle": 60.09,
-						"curve": [ 0.281, 0, 0.686, 0.99 ]
-					},
-					{ "time": 1, "angle": 28.37 }
-				]
-			},
-			"torso": {
-				"rotate": [
-					{ "time": 0, "angle": -10.28 },
-					{
-						"time": 0.1333,
-						"angle": -15.38,
-						"curve": [ 0.545, 0, 0.818, 1 ]
-					},
-					{
-						"time": 0.3666,
-						"angle": -9.78,
-						"curve": [ 0.58, 0.17, 0.669, 0.99 ]
-					},
-					{
-						"time": 0.6333,
-						"angle": -15.75,
-						"curve": [ 0.235, 0.01, 0.795, 1 ]
-					},
-					{
-						"time": 0.8666,
-						"angle": -7.06,
-						"curve": [ 0.209, 0, 0.816, 0.98 ]
-					},
-					{ "time": 1, "angle": -10.28 }
-				],
-				"translate": [
-					{ "time": 0, "x": -1.29, "y": 1.68 }
-				]
-			},
-			"right foot": {
-				"rotate": [
-					{ "time": 0, "angle": -5.25 },
-					{ "time": 0.2333, "angle": -1.91 },
-					{ "time": 0.3666, "angle": -6.45 },
-					{ "time": 0.5, "angle": -5.39 },
-					{ "time": 0.7333, "angle": -11.68 },
-					{ "time": 0.8666, "angle": 0.46 },
-					{ "time": 1, "angle": -5.25 }
-				]
-			},
-			"right lower leg": {
-				"rotate": [
-					{
-						"time": 0,
-						"angle": -3.39,
-						"curve": [ 0.316, 0.01, 0.741, 0.98 ]
-					},
-					{
-						"time": 0.1333,
-						"angle": -45.53,
-						"curve": [ 0.229, 0, 0.738, 0.97 ]
-					},
-					{ "time": 0.2333, "angle": -4.83 },
-					{ "time": 0.5, "angle": -19.53 },
-					{ "time": 0.6333, "angle": -64.8 },
-					{
-						"time": 0.7333,
-						"angle": -82.56,
-						"curve": [ 0.557, 0.18, 1, 1 ]
-					},
-					{ "time": 1, "angle": -3.39 }
-				],
-				"translate": [
-					{ "time": 0, "x": 0, "y": 0, "curve": "stepped" },
-					{ "time": 0.5, "x": 0, "y": 0 },
-					{ "time": 0.6333, "x": 2.18, "y": 0.21 },
-					{ "time": 1, "x": 0, "y": 0 }
-				]
-			},
-			"hip": {
-				"rotate": [
-					{ "time": 0, "angle": 0, "curve": "stepped" },
-					{ "time": 1, "angle": 0 }
-				],
-				"translate": [
-					{ "time": 0, "x": 0, "y": -4.16 },
-					{
-						"time": 0.1333,
-						"x": 0,
-						"y": -7.05,
-						"curve": [ 0.359, 0.47, 0.646, 0.74 ]
-					},
-					{ "time": 0.3666, "x": 0, "y": 6.78 },
-					{ "time": 0.5, "x": 0, "y": -6.13 },
-					{
-						"time": 0.6333,
-						"x": 0,
-						"y": -7.05,
-						"curve": [ 0.359, 0.47, 0.646, 0.74 ]
-					},
-					{ "time": 0.8666, "x": 0, "y": 6.78 },
-					{ "time": 1, "x": 0, "y": -4.16 }
-				]
-			},
-			"neck": {
-				"rotate": [
-					{ "time": 0, "angle": 3.6 },
-					{ "time": 0.1333, "angle": 17.49 },
-					{ "time": 0.2333, "angle": 6.1 },
-					{ "time": 0.3666, "angle": 3.45 },
-					{ "time": 0.5, "angle": 5.17 },
-					{ "time": 0.6333, "angle": 18.36 },
-					{ "time": 0.7333, "angle": 6.09 },
-					{ "time": 0.8666, "angle": 2.28 },
-					{ "time": 1, "angle": 3.6 }
-				]
-			},
-			"head": {
-				"rotate": [
-					{
-						"time": 0,
-						"angle": 3.6,
-						"curve": [ 0, 0, 0.704, 1.17 ]
-					},
-					{ "time": 0.1333, "angle": -0.2 },
-					{ "time": 0.2333, "angle": 6.1 },
-					{ "time": 0.3666, "angle": 3.45 },
-					{
-						"time": 0.5,
-						"angle": 5.17,
-						"curve": [ 0, 0, 0.704, 1.61 ]
-					},
-					{ "time": 0.6666, "angle": 1.1 },
-					{ "time": 0.7333, "angle": 6.09 },
-					{ "time": 0.8666, "angle": 2.28 },
-					{ "time": 1, "angle": 3.6 }
-				]
-			}
-		},
-		"ffd": {
-			"default": {
-				"torso": {
-					"goblin/head": [
-						{ "time": 0 },
-						{
-							"time": 0.5,
-							"vertices": [ 78.53, -53.55, 96.74, 63.46, 197.1, 24.55, 144.41, -37.48 ]
-						},
-						{ "time": 1 }
-					]
-				}
-			}
-		},
-		"slots": {
-			"head": {
-				"color": [
-					{ "time": 0.1, "color": "ffffffff" },
-					{ "time": 0.8, "color": "fcff00ff" }
-				]
-			}
-		},
-		"events": [
-			{ "time": 0.4666, "name": "test1" },
-			{ "time": 0.5333, "name": "test2" },
-			{ "time": 0.9333, "name": "test1" }
-		]
-	}
-}
-}

二进制
spine-libgdx/test/goblins.png


二进制
spine-libgdx/test/goblins.skel


二进制
spine-libgdx/test/spineboy.png