Browse Source

Fixed parsing animations with no bone timelines.

NathanSweet 12 years ago
parent
commit
4ea3a8a632
1 changed files with 49 additions and 47 deletions
  1. 49 47
      spine-libgdx/src/com/esotericsoftware/spine/SkeletonJson.java

+ 49 - 47
spine-libgdx/src/com/esotericsoftware/spine/SkeletonJson.java

@@ -195,54 +195,56 @@ public class SkeletonJson {
 		float duration = 0;
 		float duration = 0;
 
 
 		OrderedMap<String, ?> bonesMap = (OrderedMap)map.get("bones");
 		OrderedMap<String, ?> bonesMap = (OrderedMap)map.get("bones");
-		for (Entry<String, ?> entry : bonesMap.entries()) {
-			String boneName = entry.key;
-			int boneIndex = skeletonData.findBoneIndex(boneName);
-			if (boneIndex == -1) throw new SerializationException("Bone not found: " + boneName);
-
-			OrderedMap<?, ?> timelineMap = (OrderedMap)entry.value;
-			for (Entry timelineEntry : timelineMap.entries()) {
-				Array<OrderedMap> values = (Array)timelineEntry.value;
-				String timelineName = (String)timelineEntry.key;
-				if (timelineName.equals(TIMELINE_ROTATE)) {
-					RotateTimeline timeline = new RotateTimeline(values.size);
-					timeline.setBoneIndex(boneIndex);
-
-					int keyframeIndex = 0;
-					for (OrderedMap valueMap : values) {
-						float time = (Float)valueMap.get("time");
-						timeline.setFrame(keyframeIndex, time, (Float)valueMap.get("angle"));
-						readCurve(timeline, keyframeIndex, valueMap);
-						keyframeIndex++;
-					}
-					timelines.add(timeline);
-					duration = Math.max(duration, timeline.getFrames()[timeline.getFrameCount() * 2 - 2]);
-
-				} else if (timelineName.equals(TIMELINE_TRANSLATE) || timelineName.equals(TIMELINE_SCALE)) {
-					TranslateTimeline timeline;
-					float timelineScale = 1;
-					if (timelineName.equals(TIMELINE_SCALE))
-						timeline = new ScaleTimeline(values.size);
-					else {
-						timeline = new TranslateTimeline(values.size);
-						timelineScale = scale;
-					}
-					timeline.setBoneIndex(boneIndex);
-
-					int keyframeIndex = 0;
-					for (OrderedMap valueMap : values) {
-						float time = (Float)valueMap.get("time");
-						Float x = (Float)valueMap.get("x"), y = (Float)valueMap.get("y");
-						timeline
-							.setFrame(keyframeIndex, time, x == null ? 0 : (x * timelineScale), y == null ? 0 : (y * timelineScale));
-						readCurve(timeline, keyframeIndex, valueMap);
-						keyframeIndex++;
-					}
-					timelines.add(timeline);
-					duration = Math.max(duration, timeline.getFrames()[timeline.getFrameCount() * 3 - 3]);
+		if (bonesMap != null) {
+			for (Entry<String, ?> entry : bonesMap.entries()) {
+				String boneName = entry.key;
+				int boneIndex = skeletonData.findBoneIndex(boneName);
+				if (boneIndex == -1) throw new SerializationException("Bone not found: " + boneName);
+
+				OrderedMap<?, ?> timelineMap = (OrderedMap)entry.value;
+				for (Entry timelineEntry : timelineMap.entries()) {
+					Array<OrderedMap> values = (Array)timelineEntry.value;
+					String timelineName = (String)timelineEntry.key;
+					if (timelineName.equals(TIMELINE_ROTATE)) {
+						RotateTimeline timeline = new RotateTimeline(values.size);
+						timeline.setBoneIndex(boneIndex);
 
 
-				} else
-					throw new RuntimeException("Invalid timeline type for a bone: " + timelineName + " (" + boneName + ")");
+						int keyframeIndex = 0;
+						for (OrderedMap valueMap : values) {
+							float time = (Float)valueMap.get("time");
+							timeline.setFrame(keyframeIndex, time, (Float)valueMap.get("angle"));
+							readCurve(timeline, keyframeIndex, valueMap);
+							keyframeIndex++;
+						}
+						timelines.add(timeline);
+						duration = Math.max(duration, timeline.getFrames()[timeline.getFrameCount() * 2 - 2]);
+
+					} else if (timelineName.equals(TIMELINE_TRANSLATE) || timelineName.equals(TIMELINE_SCALE)) {
+						TranslateTimeline timeline;
+						float timelineScale = 1;
+						if (timelineName.equals(TIMELINE_SCALE))
+							timeline = new ScaleTimeline(values.size);
+						else {
+							timeline = new TranslateTimeline(values.size);
+							timelineScale = scale;
+						}
+						timeline.setBoneIndex(boneIndex);
+
+						int keyframeIndex = 0;
+						for (OrderedMap valueMap : values) {
+							float time = (Float)valueMap.get("time");
+							Float x = (Float)valueMap.get("x"), y = (Float)valueMap.get("y");
+							timeline.setFrame(keyframeIndex, time, x == null ? 0 : (x * timelineScale), y == null ? 0
+								: (y * timelineScale));
+							readCurve(timeline, keyframeIndex, valueMap);
+							keyframeIndex++;
+						}
+						timelines.add(timeline);
+						duration = Math.max(duration, timeline.getFrames()[timeline.getFrameCount() * 3 - 3]);
+
+					} else
+						throw new RuntimeException("Invalid timeline type for a bone: " + timelineName + " (" + boneName + ")");
+				}
 			}
 			}
 		}
 		}