Minor optimizations, clean up.

This commit is contained in:
NathanSweet 2013-12-23 15:04:37 +01:00
parent ba0d48eda8
commit 4b31d81923
20 changed files with 117 additions and 104 deletions

View File

@ -83,7 +83,7 @@ public class Bone {
_worldScaleY = scaleY; _worldScaleY = scaleY;
_worldRotation = rotation; _worldRotation = rotation;
} }
var radians:Number = _worldRotation * Math.PI / 180; var radians:Number = _worldRotation * (Math.PI / 180);
var cos:Number = Math.cos(radians); var cos:Number = Math.cos(radians);
var sin:Number = Math.sin(radians); var sin:Number = Math.sin(radians);
_m00 = cos * _worldScaleX; _m00 = cos * _worldScaleX;

View File

@ -58,7 +58,7 @@ public class Skeleton {
_bones = new Vector.<Bone>(); _bones = new Vector.<Bone>();
for each (var boneData:BoneData in data.bones) { for each (var boneData:BoneData in data.bones) {
var parent:Bone = boneData.parent == null ? null : _bones[data.bones.indexOf(boneData.parent)]; var parent:Bone = boneData.parent == null ? null : _bones[data.bones.indexOf(boneData.parent)];
_bones.push(new Bone(boneData, parent)); _bones[_bones.length] = new Bone(boneData, parent);
} }
_slots = new Vector.<Slot>(); _slots = new Vector.<Slot>();
@ -66,8 +66,8 @@ public class Skeleton {
for each (var slotData:SlotData in data.slots) { for each (var slotData:SlotData in data.slots) {
var bone:Bone = _bones[data.bones.indexOf(slotData.boneData)]; var bone:Bone = _bones[data.bones.indexOf(slotData.boneData)];
var slot:Slot = new Slot(slotData, this, bone); var slot:Slot = new Slot(slotData, this, bone);
_slots.push(slot); _slots[_slots.length] = slot;
_drawOrder.push(slot); _drawOrder[_drawOrder.length] = slot;
} }
} }

View File

@ -49,14 +49,14 @@ public class SkeletonBounds {
boundingBoxes.length = 0; boundingBoxes.length = 0;
for each (var polygon:Polygon in polygons) for each (var polygon:Polygon in polygons)
polygonPool.push(polygon); polygonPool[polygonPool.length] = polygon;
polygons.length = 0; polygons.length = 0;
for (var i:int = 0; i < slotCount; i++) { for (var i:int = 0; i < slotCount; i++) {
var slot:Slot = slots[i]; var slot:Slot = slots[i];
var boundingBox:BoundingBoxAttachment = slot.attachment as BoundingBoxAttachment; var boundingBox:BoundingBoxAttachment = slot.attachment as BoundingBoxAttachment;
if (boundingBox == null) continue; if (boundingBox == null) continue;
boundingBoxes.push(boundingBox); boundingBoxes[boundingBoxes.length] = boundingBox;
var poolCount:int = polygonPool.length; var poolCount:int = polygonPool.length;
if (poolCount > 0) { if (poolCount > 0) {
@ -64,7 +64,7 @@ public class SkeletonBounds {
polygonPool.splice(poolCount - 1, 1); polygonPool.splice(poolCount - 1, 1);
} else } else
polygon = new Polygon(); polygon = new Polygon();
polygons.push(polygon); polygons[polygons.length] = polygon;
polygon.vertices.length = boundingBox.vertices.length; polygon.vertices.length = boundingBox.vertices.length;
boundingBox.computeWorldVertices(x, y, slot.bone, polygon.vertices); boundingBox.computeWorldVertices(x, y, slot.bone, polygon.vertices);

View File

@ -48,7 +48,7 @@ public class SkeletonData {
public function addBone (bone:BoneData) : void { public function addBone (bone:BoneData) : void {
if (bone == null) if (bone == null)
throw new ArgumentError("bone cannot be null."); throw new ArgumentError("bone cannot be null.");
bones.push(bone); bones[bones.length] = bone;
} }
/** @return May be null. */ /** @return May be null. */
@ -78,7 +78,7 @@ public class SkeletonData {
public function addSlot (slot:SlotData) : void { public function addSlot (slot:SlotData) : void {
if (slot == null) if (slot == null)
throw new ArgumentError("slot cannot be null."); throw new ArgumentError("slot cannot be null.");
slots.push(slot); slots[slots.length] = slot;
} }
/** @return May be null. */ /** @return May be null. */
@ -108,7 +108,7 @@ public class SkeletonData {
public function addSkin (skin:Skin) : void { public function addSkin (skin:Skin) : void {
if (skin == null) if (skin == null)
throw new ArgumentError("skin cannot be null."); throw new ArgumentError("skin cannot be null.");
skins.push(skin); skins[skins.length] = skin;
} }
/** @return May be null. */ /** @return May be null. */
@ -126,7 +126,7 @@ public class SkeletonData {
public function addEvent (eventData:EventData) : void { public function addEvent (eventData:EventData) : void {
if (eventData == null) if (eventData == null)
throw new ArgumentError("eventData cannot be null."); throw new ArgumentError("eventData cannot be null.");
events.push(eventData); events[events.length] = eventData;
} }
/** @return May be null. */ /** @return May be null. */
@ -146,7 +146,7 @@ public class SkeletonData {
public function addAnimation (animation:Animation) : void { public function addAnimation (animation:Animation) : void {
if (animation == null) if (animation == null)
throw new ArgumentError("animation cannot be null."); throw new ArgumentError("animation cannot be null.");
animations.push(animation); animations[animations.length] = animation;
} }
/** @return May be null. */ /** @return May be null. */

View File

@ -184,8 +184,9 @@ public class SkeletonJson {
regionAttachment.updateOffset(); regionAttachment.updateOffset();
} else if (attachment is BoundingBoxAttachment) { } else if (attachment is BoundingBoxAttachment) {
var box:BoundingBoxAttachment = attachment as BoundingBoxAttachment; var box:BoundingBoxAttachment = attachment as BoundingBoxAttachment;
var vertices:Vector.<Number> = box.vertices;
for each (var point:Number in map["vertices"]) for each (var point:Number in map["vertices"])
box.vertices.push(point * scale); vertices[vertices.length] = point * scale;
} }
return attachment; return attachment;
@ -214,7 +215,7 @@ public class SkeletonJson {
readCurve(timeline, frameIndex, valueMap); readCurve(timeline, frameIndex, valueMap);
frameIndex++; frameIndex++;
} }
timelines.push(timeline); timelines[timelines.length] = timeline;
duration = Math.max(duration, timeline.frames[timeline.frameCount * 2 - 2]); duration = Math.max(duration, timeline.frames[timeline.frameCount * 2 - 2]);
} else if (timelineName == TIMELINE_TRANSLATE || timelineName == TIMELINE_SCALE) { } else if (timelineName == TIMELINE_TRANSLATE || timelineName == TIMELINE_SCALE) {
@ -236,7 +237,7 @@ public class SkeletonJson {
readCurve(timeline1, frameIndex1, valueMap1); readCurve(timeline1, frameIndex1, valueMap1);
frameIndex1++; frameIndex1++;
} }
timelines.push(timeline1); timelines[timelines.length] = timeline1;
duration = Math.max(duration, timeline1.frames[timeline1.frameCount * 3 - 3]); duration = Math.max(duration, timeline1.frames[timeline1.frameCount * 3 - 3]);
} else } else
@ -266,7 +267,7 @@ public class SkeletonJson {
readCurve(timeline2, frameIndex2, valueMap2); readCurve(timeline2, frameIndex2, valueMap2);
frameIndex2++; frameIndex2++;
} }
timelines.push(timeline2); timelines[timelines.length] = timeline2;
duration = Math.max(duration, timeline2.frames[timeline2.frameCount * 5 - 5]); duration = Math.max(duration, timeline2.frames[timeline2.frameCount * 5 - 5]);
} else if (timelineName2 == TIMELINE_ATTACHMENT) { } else if (timelineName2 == TIMELINE_ATTACHMENT) {
@ -277,7 +278,7 @@ public class SkeletonJson {
for each (var valueMap3:Object in values2) { for each (var valueMap3:Object in values2) {
timeline3.setFrame(frameIndex3++, valueMap3["time"], valueMap3["name"]); timeline3.setFrame(frameIndex3++, valueMap3["time"], valueMap3["name"]);
} }
timelines.push(timeline3); timelines[timelines.length] = timeline3;
duration = Math.max(duration, timeline3.frames[timeline3.frameCount - 1]); duration = Math.max(duration, timeline3.frames[timeline3.frameCount - 1]);
} else } else
@ -298,7 +299,7 @@ public class SkeletonJson {
event.stringValue = eventMap.hasOwnProperty("string") ? eventMap["string"] : eventData.stringValue; event.stringValue = eventMap.hasOwnProperty("string") ? eventMap["string"] : eventData.stringValue;
timeline4.setFrame(frameIndex4++, eventMap["time"], event); timeline4.setFrame(frameIndex4++, eventMap["time"], event);
} }
timelines.push(timeline4); timelines[timelines.length] = timeline4;
duration = Math.max(duration, timeline4.frames[timeline4.frameCount - 1]); duration = Math.max(duration, timeline4.frames[timeline4.frameCount - 1]);
} }
@ -334,7 +335,7 @@ public class SkeletonJson {
} }
timeline5.setFrame(frameIndex5++, drawOrderMap["time"], drawOrder); timeline5.setFrame(frameIndex5++, drawOrderMap["time"], drawOrder);
} }
timelines.push(timeline5); timelines[timelines.length] = timeline5;
duration = Math.max(duration, timeline5.frames[timeline5.frameCount - 1]); duration = Math.max(duration, timeline5.frames[timeline5.frameCount - 1]);
} }

View File

@ -99,7 +99,7 @@ public class Animation {
return step; return step;
var current:int = high >>> 1; var current:int = high >>> 1;
while (true) { while (true) {
if (values[(current + 1) * step] <= target) if (values[int((current + 1) * step)] <= target)
low = current + 1; low = current + 1;
else else
high = current; high = current;

View File

@ -139,7 +139,7 @@ public class AnimationState {
private function expandToIndex (index:int) : TrackEntry { private function expandToIndex (index:int) : TrackEntry {
if (index < _tracks.length) return _tracks[index]; if (index < _tracks.length) return _tracks[index];
while (index >= _tracks.length) while (index >= _tracks.length)
_tracks.push(null); _tracks[_tracks.length] = null;
return null; return null;
} }

View File

@ -60,7 +60,7 @@ public class AttachmentTimeline implements Timeline {
return; // Time is before first frame. return; // Time is before first frame.
var frameIndex:int; var frameIndex:int;
if (time >= frames[frames.length - 1]) // Time is after last frame. if (time >= frames[int(frames.length - 1)]) // Time is after last frame.
frameIndex = frames.length - 1; frameIndex = frames.length - 1;
else else
frameIndex = Animation.binarySearch(frames, time, 1) - 1; frameIndex = Animation.binarySearch(frames, time, 1) - 1;

View File

@ -37,7 +37,7 @@ import spine.Skeleton;
import spine.Slot; import spine.Slot;
public class ColorTimeline extends CurveTimeline { public class ColorTimeline extends CurveTimeline {
static private const LAST_FRAME_TIME:int = -5; static private const PREV_FRAME_TIME:int = -5;
static private const FRAME_R:int = 1; static private const FRAME_R:int = 1;
static private const FRAME_G:int = 2; static private const FRAME_G:int = 2;
static private const FRAME_B:int = 3; static private const FRAME_B:int = 3;
@ -55,10 +55,10 @@ public class ColorTimeline extends CurveTimeline {
public function setFrame (frameIndex:int, time:Number, r:Number, g:Number, b:Number, a:Number) : void { public function setFrame (frameIndex:int, time:Number, r:Number, g:Number, b:Number, a:Number) : void {
frameIndex *= 5; frameIndex *= 5;
frames[frameIndex] = time; frames[frameIndex] = time;
frames[frameIndex + 1] = r; frames[int(frameIndex + 1)] = r;
frames[frameIndex + 2] = g; frames[int(frameIndex + 2)] = g;
frames[frameIndex + 3] = b; frames[int(frameIndex + 3)] = b;
frames[frameIndex + 4] = a; frames[int(frameIndex + 4)] = a;
} }
override public function apply (skeleton:Skeleton, lastTime:Number, time:Number, firedEvents:Vector.<Event>, alpha:Number) : void { override public function apply (skeleton:Skeleton, lastTime:Number, time:Number, firedEvents:Vector.<Event>, alpha:Number) : void {
@ -67,29 +67,29 @@ public class ColorTimeline extends CurveTimeline {
var slot:Slot = skeleton.slots[slotIndex]; var slot:Slot = skeleton.slots[slotIndex];
if (time >= frames[frames.length - 5]) { // Time is after last frame. if (time >= frames[int(frames.length - 5)]) { // Time is after last frame.
var i:int = frames.length - 1; var i:int = frames.length - 1;
slot.r = frames[i - 3]; slot.r = frames[int(i - 3)];
slot.g = frames[i - 2]; slot.g = frames[int(i - 2)];
slot.b = frames[i - 1]; slot.b = frames[int(i - 1)];
slot.a = frames[i]; slot.a = frames[i];
return; return;
} }
// Interpolate between the last frame and the current frame. // Interpolate between the previous frame and the current frame.
var frameIndex:int = Animation.binarySearch(frames, time, 5); var frameIndex:int = Animation.binarySearch(frames, time, 5);
var lastFrameR:Number = frames[frameIndex - 4]; var prevFrameR:Number = frames[int(frameIndex - 4)];
var lastFrameG:Number = frames[frameIndex - 3]; var prevFrameG:Number = frames[int(frameIndex - 3)];
var lastFrameB:Number = frames[frameIndex - 2]; var prevFrameB:Number = frames[int(frameIndex - 2)];
var lastFrameA:Number = frames[frameIndex - 1]; var prevFrameA:Number = frames[int(frameIndex - 1)];
var frameTime:Number = frames[frameIndex]; var frameTime:Number = frames[frameIndex];
var percent:Number = 1 - (time - frameTime) / (frames[frameIndex + LAST_FRAME_TIME] - frameTime); var percent:Number = 1 - (time - frameTime) / (frames[int(frameIndex + PREV_FRAME_TIME)] - frameTime);
percent = getCurvePercent(frameIndex / 5 - 1, percent < 0 ? 0 : (percent > 1 ? 1 : percent)); percent = getCurvePercent(frameIndex / 5 - 1, percent < 0 ? 0 : (percent > 1 ? 1 : percent));
var r:Number = lastFrameR + (frames[frameIndex + FRAME_R] - lastFrameR) * percent; var r:Number = prevFrameR + (frames[int(frameIndex + FRAME_R)] - prevFrameR) * percent;
var g:Number = lastFrameG + (frames[frameIndex + FRAME_G] - lastFrameG) * percent; var g:Number = prevFrameG + (frames[int(frameIndex + FRAME_G)] - prevFrameG) * percent;
var b:Number = lastFrameB + (frames[frameIndex + FRAME_B] - lastFrameB) * percent; var b:Number = prevFrameB + (frames[int(frameIndex + FRAME_B)] - prevFrameB) * percent;
var a:Number = lastFrameA + (frames[frameIndex + FRAME_A] - lastFrameA) * percent; var a:Number = prevFrameA + (frames[int(frameIndex + FRAME_A)] - prevFrameA) * percent;
if (alpha < 1) { if (alpha < 1) {
slot.r += (r - slot.r) * alpha; slot.r += (r - slot.r) * alpha;
slot.g += (g - slot.g) * alpha; slot.g += (g - slot.g) * alpha;

View File

@ -55,11 +55,11 @@ public class CurveTimeline implements Timeline {
} }
public function setLinear (frameIndex:int) : void { public function setLinear (frameIndex:int) : void {
curves[frameIndex * 6] = LINEAR; curves[int(frameIndex * 6)] = LINEAR;
} }
public function setStepped (frameIndex:int) : void { public function setStepped (frameIndex:int) : void {
curves[frameIndex * 6] = STEPPED; curves[int(frameIndex * 6)] = STEPPED;
} }
/** Sets the control handle positions for an interpolation bezier curve used to transition from this keyframe to the next. /** Sets the control handle positions for an interpolation bezier curve used to transition from this keyframe to the next.
@ -79,11 +79,11 @@ public class CurveTimeline implements Timeline {
var tmp2y:Number = (cy1 - cy2) * 3 + 1; var tmp2y:Number = (cy1 - cy2) * 3 + 1;
var i:int = frameIndex * 6; var i:int = frameIndex * 6;
curves[i] = cx1 * pre1 + tmp1x * pre2 + tmp2x * subdiv_step3; curves[i] = cx1 * pre1 + tmp1x * pre2 + tmp2x * subdiv_step3;
curves[i + 1] = cy1 * pre1 + tmp1y * pre2 + tmp2y * subdiv_step3; curves[int(i + 1)] = cy1 * pre1 + tmp1y * pre2 + tmp2y * subdiv_step3;
curves[i + 2] = tmp1x * pre4 + tmp2x * pre5; curves[int(i + 2)] = tmp1x * pre4 + tmp2x * pre5;
curves[i + 3] = tmp1y * pre4 + tmp2y * pre5; curves[int(i + 3)] = tmp1y * pre4 + tmp2y * pre5;
curves[i + 4] = tmp2x * pre5; curves[int(i + 4)] = tmp2x * pre5;
curves[i + 5] = tmp2y * pre5; curves[int(i + 5)] = tmp2y * pre5;
} }
public function getCurvePercent (frameIndex:int, percent:Number) : Number { public function getCurvePercent (frameIndex:int, percent:Number) : Number {
@ -93,19 +93,19 @@ public class CurveTimeline implements Timeline {
return percent; return percent;
if (dfx == STEPPED) if (dfx == STEPPED)
return 0; return 0;
var dfy:Number = curves[curveIndex + 1]; var dfy:Number = curves[int(curveIndex + 1)];
var ddfx:Number = curves[curveIndex + 2]; var ddfx:Number = curves[int(curveIndex + 2)];
var ddfy:Number = curves[curveIndex + 3]; var ddfy:Number = curves[int(curveIndex + 3)];
var dddfx:Number = curves[curveIndex + 4]; var dddfx:Number = curves[int(curveIndex + 4)];
var dddfy:Number = curves[curveIndex + 5]; var dddfy:Number = curves[int(curveIndex + 5)];
var x:Number = dfx; var x:Number = dfx;
var y:Number = dfy; var y:Number = dfy;
var i:int = BEZIER_SEGMENTS - 2; var i:int = BEZIER_SEGMENTS - 2;
while (true) { while (true) {
if (x >= percent) { if (x >= percent) {
var lastX:Number = x - dfx; var prevX:Number = x - dfx;
var lastY:Number = y - dfy; var prevY:Number = y - dfy;
return lastY + (y - lastY) * (percent - lastX) / (x - lastX); return prevY + (y - prevY) * (percent - prevX) / (x - prevX);
} }
if (i == 0) if (i == 0)
break; break;

View File

@ -60,7 +60,7 @@ public class DrawOrderTimeline implements Timeline {
return; // Time is before first frame. return; // Time is before first frame.
var frameIndex:int; var frameIndex:int;
if (time >= frames[frames.length - 1]) // Time is after last frame. if (time >= frames[int(frames.length - 1)]) // Time is after last frame.
frameIndex = frames.length - 1; frameIndex = frames.length - 1;
else else
frameIndex = Animation.binarySearch(frames, time, 1) - 1; frameIndex = Animation.binarySearch(frames, time, 1) - 1;

View File

@ -62,7 +62,7 @@ public class EventTimeline implements Timeline {
if (lastTime > time) { // Fire events after last time for looped animations. if (lastTime > time) { // Fire events after last time for looped animations.
apply(skeleton, lastTime, int.MAX_VALUE, firedEvents, alpha); apply(skeleton, lastTime, int.MAX_VALUE, firedEvents, alpha);
lastTime = -1; lastTime = -1;
} else if (lastTime >= frames[frameCount - 1]) // Last time is after last frame. } else if (lastTime >= frames[int(frameCount - 1)]) // Last time is after last frame.
return; return;
if (time < frames[0]) return; // Time is before first frame. if (time < frames[0]) return; // Time is before first frame.
@ -73,12 +73,12 @@ public class EventTimeline implements Timeline {
frameIndex = Animation.binarySearch(frames, lastTime, 1); frameIndex = Animation.binarySearch(frames, lastTime, 1);
var frame:Number = frames[frameIndex]; var frame:Number = frames[frameIndex];
while (frameIndex > 0) { // Fire multiple events with the same frame. while (frameIndex > 0) { // Fire multiple events with the same frame.
if (frames[frameIndex - 1] != frame) break; if (frames[int(frameIndex - 1)] != frame) break;
frameIndex--; frameIndex--;
} }
} }
for (; frameIndex < frameCount && time >= frames[frameIndex]; frameIndex++) for (; frameIndex < frameCount && time >= frames[frameIndex]; frameIndex++)
firedEvents.push(events[frameIndex]); firedEvents[firedEvents.length] = events[frameIndex];
} }
} }

View File

@ -42,7 +42,7 @@ package spine.animation {
public function add (listener:Function) : void { public function add (listener:Function) : void {
if (listener == null) if (listener == null)
throw new ArgumentError("listener cannot be null."); throw new ArgumentError("listener cannot be null.");
_listeners.push(listener); _listeners[_listeners.length] = listener;
} }
public function remove (listener:Function) : void { public function remove (listener:Function) : void {

View File

@ -37,7 +37,7 @@ import spine.Event;
import spine.Skeleton; import spine.Skeleton;
public class RotateTimeline extends CurveTimeline { public class RotateTimeline extends CurveTimeline {
static private const LAST_FRAME_TIME:int = -2; static private const PREV_FRAME_TIME:int = -2;
static private const FRAME_VALUE:int = 1; static private const FRAME_VALUE:int = 1;
public var boneIndex:int; public var boneIndex:int;
@ -52,7 +52,7 @@ public class RotateTimeline extends CurveTimeline {
public function setFrame (frameIndex:int, time:Number, angle:Number) : void { public function setFrame (frameIndex:int, time:Number, angle:Number) : void {
frameIndex *= 2; frameIndex *= 2;
frames[frameIndex] = time; frames[frameIndex] = time;
frames[frameIndex + 1] = angle; frames[int(frameIndex + 1)] = angle;
} }
override public function apply (skeleton:Skeleton, lastTime:Number, time:Number, firedEvents:Vector.<Event>, alpha:Number) : void { override public function apply (skeleton:Skeleton, lastTime:Number, time:Number, firedEvents:Vector.<Event>, alpha:Number) : void {
@ -62,8 +62,8 @@ public class RotateTimeline extends CurveTimeline {
var bone:Bone = skeleton.bones[boneIndex]; var bone:Bone = skeleton.bones[boneIndex];
var amount:Number; var amount:Number;
if (time >= frames[frames.length - 2]) { // Time is after last frame. if (time >= frames[int(frames.length - 2)]) { // Time is after last frame.
amount = bone.data.rotation + frames[frames.length - 1] - bone.rotation; amount = bone.data.rotation + frames[int(frames.length - 1)] - bone.rotation;
while (amount > 180) while (amount > 180)
amount -= 360; amount -= 360;
while (amount < -180) while (amount < -180)
@ -72,19 +72,19 @@ public class RotateTimeline extends CurveTimeline {
return; return;
} }
// Interpolate between the last frame and the current frame. // Interpolate between the previous frame and the current frame.
var frameIndex:int = Animation.binarySearch(frames, time, 2); var frameIndex:int = Animation.binarySearch(frames, time, 2);
var lastFrameValue:Number = frames[frameIndex - 1]; var prevFrameValue:Number = frames[int(frameIndex - 1)];
var frameTime:Number = frames[frameIndex]; var frameTime:Number = frames[frameIndex];
var percent:Number = 1 - (time - frameTime) / (frames[frameIndex + LAST_FRAME_TIME] - frameTime); var percent:Number = 1 - (time - frameTime) / (frames[int(frameIndex + PREV_FRAME_TIME)] - frameTime);
percent = getCurvePercent(frameIndex / 2 - 1, percent < 0 ? 0 : (percent > 1 ? 1 : percent)); percent = getCurvePercent(frameIndex / 2 - 1, percent < 0 ? 0 : (percent > 1 ? 1 : percent));
amount = frames[frameIndex + FRAME_VALUE] - lastFrameValue; amount = frames[int(frameIndex + FRAME_VALUE)] - prevFrameValue;
while (amount > 180) while (amount > 180)
amount -= 360; amount -= 360;
while (amount < -180) while (amount < -180)
amount += 360; amount += 360;
amount = bone.data.rotation + (lastFrameValue + amount * percent) - bone.rotation; amount = bone.data.rotation + (prevFrameValue + amount * percent) - bone.rotation;
while (amount > 180) while (amount > 180)
amount -= 360; amount -= 360;
while (amount < -180) while (amount < -180)

View File

@ -46,22 +46,22 @@ public class ScaleTimeline extends TranslateTimeline {
return; // Time is before first frame. return; // Time is before first frame.
var bone:Bone = skeleton.bones[boneIndex]; var bone:Bone = skeleton.bones[boneIndex];
if (time >= frames[frames.length - 3]) { // Time is after last frame. if (time >= frames[int(frames.length - 3)]) { // Time is after last frame.
bone.scaleX += (bone.data.scaleX - 1 + frames[frames.length - 2] - bone.scaleX) * alpha; bone.scaleX += (bone.data.scaleX - 1 + frames[int(frames.length - 2)] - bone.scaleX) * alpha;
bone.scaleY += (bone.data.scaleY - 1 + frames[frames.length - 1] - bone.scaleY) * alpha; bone.scaleY += (bone.data.scaleY - 1 + frames[int(frames.length - 1)] - bone.scaleY) * alpha;
return; return;
} }
// Interpolate between the last frame and the current frame. // Interpolate between the previous frame and the current frame.
var frameIndex:int = Animation.binarySearch(frames, time, 3); var frameIndex:int = Animation.binarySearch(frames, time, 3);
var lastFrameX:Number = frames[frameIndex - 2]; var prevFrameX:Number = frames[int(frameIndex - 2)];
var lastFrameY:Number = frames[frameIndex - 1]; var prevFrameY:Number = frames[int(frameIndex - 1)];
var frameTime:Number = frames[frameIndex]; var frameTime:Number = frames[frameIndex];
var percent:Number = 1 - (time - frameTime) / (frames[frameIndex + LAST_FRAME_TIME] - frameTime); var percent:Number = 1 - (time - frameTime) / (frames[int(frameIndex + PREV_FRAME_TIME)] - frameTime);
percent = getCurvePercent(frameIndex / 3 - 1, percent < 0 ? 0 : (percent > 1 ? 1 : percent)); percent = getCurvePercent(frameIndex / 3 - 1, percent < 0 ? 0 : (percent > 1 ? 1 : percent));
bone.scaleX += (bone.data.scaleX - 1 + lastFrameX + (frames[frameIndex + FRAME_X] - lastFrameX) * percent - bone.scaleX) * alpha; bone.scaleX += (bone.data.scaleX - 1 + prevFrameX + (frames[int(frameIndex + FRAME_X)] - prevFrameX) * percent - bone.scaleX) * alpha;
bone.scaleY += (bone.data.scaleY - 1 + lastFrameY + (frames[frameIndex + FRAME_Y] - lastFrameY) * percent - bone.scaleY) * alpha; bone.scaleY += (bone.data.scaleY - 1 + prevFrameY + (frames[int(frameIndex + FRAME_Y)] - prevFrameY) * percent - bone.scaleY) * alpha;
} }
} }

View File

@ -37,7 +37,7 @@ import spine.Event;
import spine.Skeleton; import spine.Skeleton;
public class TranslateTimeline extends CurveTimeline { public class TranslateTimeline extends CurveTimeline {
static internal const LAST_FRAME_TIME:int = -3; static internal const PREV_FRAME_TIME:int = -3;
static internal const FRAME_X:int = 1; static internal const FRAME_X:int = 1;
static internal const FRAME_Y:int = 2; static internal const FRAME_Y:int = 2;
@ -53,8 +53,8 @@ public class TranslateTimeline extends CurveTimeline {
public function setFrame (frameIndex:int, time:Number, x:Number, y:Number) : void { public function setFrame (frameIndex:int, time:Number, x:Number, y:Number) : void {
frameIndex *= 3; frameIndex *= 3;
frames[frameIndex] = time; frames[frameIndex] = time;
frames[frameIndex + 1] = x; frames[int(frameIndex + 1)] = x;
frames[frameIndex + 2] = y; frames[int(frameIndex + 2)] = y;
} }
override public function apply (skeleton:Skeleton, lastTime:Number, time:Number, firedEvents:Vector.<Event>, alpha:Number) : void { override public function apply (skeleton:Skeleton, lastTime:Number, time:Number, firedEvents:Vector.<Event>, alpha:Number) : void {
@ -63,22 +63,22 @@ public class TranslateTimeline extends CurveTimeline {
var bone:Bone = skeleton.bones[boneIndex]; var bone:Bone = skeleton.bones[boneIndex];
if (time >= frames[frames.length - 3]) { // Time is after last frame. if (time >= frames[int(frames.length - 3)]) { // Time is after last frame.
bone.x += (bone.data.x + frames[frames.length - 2] - bone.x) * alpha; bone.x += (bone.data.x + frames[int(frames.length - 2)] - bone.x) * alpha;
bone.y += (bone.data.y + frames[frames.length - 1] - bone.y) * alpha; bone.y += (bone.data.y + frames[int(frames.length - 1)] - bone.y) * alpha;
return; return;
} }
// Interpolate between the last frame and the current frame. // Interpolate between the previous frame and the current frame.
var frameIndex:int = Animation.binarySearch(frames, time, 3); var frameIndex:int = Animation.binarySearch(frames, time, 3);
var lastFrameX:Number = frames[frameIndex - 2]; var prevFrameX:Number = frames[int(frameIndex - 2)];
var lastFrameY:Number = frames[frameIndex - 1]; var prevFrameY:Number = frames[int(frameIndex - 1)];
var frameTime:Number = frames[frameIndex]; var frameTime:Number = frames[frameIndex];
var percent:Number = 1 - (time - frameTime) / (frames[frameIndex + LAST_FRAME_TIME] - frameTime); var percent:Number = 1 - (time - frameTime) / (frames[int(frameIndex + PREV_FRAME_TIME)] - frameTime);
percent = getCurvePercent(frameIndex / 3 - 1, percent < 0 ? 0 : (percent > 1 ? 1 : percent)); percent = getCurvePercent(frameIndex / 3 - 1, percent < 0 ? 0 : (percent > 1 ? 1 : percent));
bone.x += (bone.data.x + lastFrameX + (frames[frameIndex + FRAME_X] - lastFrameX) * percent - bone.x) * alpha; bone.x += (bone.data.x + prevFrameX + (frames[int(frameIndex + FRAME_X)] - prevFrameX) * percent - bone.x) * alpha;
bone.y += (bone.data.y + lastFrameY + (frames[frameIndex + FRAME_Y] - lastFrameY) * percent - bone.y) * alpha; bone.y += (bone.data.y + prevFrameY + (frames[int(frameIndex + FRAME_Y)] - prevFrameY) * percent - bone.y) * alpha;
} }
} }

View File

@ -89,7 +89,7 @@ public class Atlas {
textureLoader.loadPage(page, line); textureLoader.loadPage(page, line);
pages.push(page); pages[pages.length] = page;
} else { } else {
var region:AtlasRegion = new AtlasRegion(); var region:AtlasRegion = new AtlasRegion();
@ -140,7 +140,7 @@ public class Atlas {
region.index = parseInt(reader.readValue()); region.index = parseInt(reader.readValue());
textureLoader.loadRegion(region); textureLoader.loadRegion(region);
regions.push(region); regions[regions.length] = region;
} }
} }
} }

View File

@ -50,10 +50,11 @@ public dynamic class BoundingBoxAttachment extends Attachment {
var m11:Number = bone.m11; var m11:Number = bone.m11;
var vertices:Vector.<Number> = this.vertices; var vertices:Vector.<Number> = this.vertices;
for (var i:int = 0, n:int = vertices.length; i < n; i += 2) { for (var i:int = 0, n:int = vertices.length; i < n; i += 2) {
var ii:int = i + 1;
var px:Number = vertices[i]; var px:Number = vertices[i];
var py:Number = vertices[i + 1]; var py:Number = vertices[ii];
worldVertices[i] = px * m00 + py * m01 + x; worldVertices[i] = px * m00 + py * m01 + x;
worldVertices[i + 1] = px * m10 + py * m11 + y; worldVertices[ii] = px * m10 + py * m11 + y;
} }
} }
} }

View File

@ -126,14 +126,22 @@ public dynamic class RegionAttachment extends Attachment {
var m01:Number = bone.m01; var m01:Number = bone.m01;
var m10:Number = bone.m10; var m10:Number = bone.m10;
var m11:Number = bone.m11; var m11:Number = bone.m11;
vertices[X1] = offset[X1] * m00 + offset[Y1] * m01 + x; var x1:Number = offset[X1];
vertices[Y1] = offset[X1] * m10 + offset[Y1] * m11 + y; var y1:Number = offset[Y1];
vertices[X2] = offset[X2] * m00 + offset[Y2] * m01 + x; var x2:Number = offset[X2];
vertices[Y2] = offset[X2] * m10 + offset[Y2] * m11 + y; var y2:Number = offset[Y2];
vertices[X3] = offset[X3] * m00 + offset[Y3] * m01 + x; var x3:Number = offset[X3];
vertices[Y3] = offset[X3] * m10 + offset[Y3] * m11 + y; var y3:Number = offset[Y3];
vertices[X4] = offset[X4] * m00 + offset[Y4] * m01 + x; var x4:Number = offset[X4];
vertices[Y4] = offset[X4] * m10 + offset[Y4] * m11 + y; var y4:Number = offset[Y4];
vertices[X1] = x1 * m00 + y1 * m01 + x;
vertices[Y1] = x1 * m10 + y1 * m11 + y;
vertices[X2] = x2 * m00 + y2 * m01 + x;
vertices[Y2] = x2 * m10 + y2 * m11 + y;
vertices[X3] = x3 * m00 + y3 * m01 + x;
vertices[Y3] = x3 * m10 + y3 * m11 + y;
vertices[X4] = x4 * m00 + y4 * m01 + x;
vertices[Y4] = x4 * m10 + y4 * m11 + y;
} }
} }

View File

@ -91,7 +91,10 @@ public class SkeletonSprite extends DisplayObject implements IAnimatable {
var image:SkeletonImage; var image:SkeletonImage;
image = regionAttachment.rendererObject as SkeletonImage; image = regionAttachment.rendererObject as SkeletonImage;
if (image == null) image = SkeletonImage(AtlasRegion(regionAttachment.rendererObject).rendererObject); if (image == null) {
image = SkeletonImage(AtlasRegion(regionAttachment.rendererObject).rendererObject);
regionAttachment.rendererObject = image;
}
var vertexData:VertexData = image.vertexData; var vertexData:VertexData = image.vertexData;