diff --git a/flixel/animation/FlxAnimationController.hx b/flixel/animation/FlxAnimationController.hx index 7af3824398..b5fe87321c 100644 --- a/flixel/animation/FlxAnimationController.hx +++ b/flixel/animation/FlxAnimationController.hx @@ -700,7 +700,7 @@ class FlxAnimationController implements IFlxDestroyable var name:String = AnimFrames[0].name; var postIndex:Int = name.indexOf(".", Prefix.length); var postFix:String = name.substring(postIndex == -1 ? name.length : postIndex, name.length); - AnimFrames.sort(FlxFrame.sortByName.bind(_, _, Prefix.length, postFix.length)); + FlxFrame.sort(AnimFrames, Prefix.length, postFix.length); for (animFrame in AnimFrames) { diff --git a/flixel/graphics/frames/FlxFrame.hx b/flixel/graphics/frames/FlxFrame.hx index e803b29018..657c0aa068 100644 --- a/flixel/graphics/frames/FlxFrame.hx +++ b/flixel/graphics/frames/FlxFrame.hx @@ -11,6 +11,7 @@ import flixel.util.FlxColor; import flixel.util.FlxDestroyUtil; import flixel.util.FlxStringUtil; import haxe.ds.Vector; +import haxe.ds.ArraySort; /** * Base class for all frame types @@ -23,17 +24,26 @@ class FlxFrame implements IFlxDestroyable private var matrix:FlxMatrix = new FlxMatrix(); /** - * Sorting function for Array#sort(), - * e.g. "tiles-001.png", "tiles-003.png", "tiles-002.png". + * Sorts an array of `FlxFrame` objects by their name, e.g. + * `["tiles-001.png", "tiles-003.png", "tiles-002.png"]` + * with `"tiles-".length == prefixLength` and `".png".length == postfixLength`. */ + public static function sort(frames:Array, prefixLength:Int, postfixLength:Int):Void + { + ArraySort.sort(frames, sortByName.bind(_, _, prefixLength, postfixLength)); + } + public static function sortByName(frame1:FlxFrame, frame2:FlxFrame, prefixLength:Int, postfixLength:Int):Int { var name1:String = frame1.name; var name2:String = frame2.name; - - var num1:Int = Std.parseInt(name1.substring(prefixLength, name1.length - postfixLength)); - var num2:Int = Std.parseInt(name2.substring(prefixLength, name2.length - postfixLength)); - + var num1:Null = Std.parseInt(name1.substring(prefixLength, name1.length - postfixLength)); + var num2:Null = Std.parseInt(name2.substring(prefixLength, name2.length - postfixLength)); + if (num1 == null) + num1 = 0; + if (num2 == null) + num2 = 0; + return num1 - num2; } diff --git a/flixel/graphics/frames/FlxTileFrames.hx b/flixel/graphics/frames/FlxTileFrames.hx index 45fb65233a..837d442aa7 100644 --- a/flixel/graphics/frames/FlxTileFrames.hx +++ b/flixel/graphics/frames/FlxTileFrames.hx @@ -238,7 +238,7 @@ class FlxTileFrames extends FlxFramesCollection var postIndex:Int = name.indexOf(".", Prefix.length); var postFix:String = name.substring(postIndex == -1 ? name.length : postIndex, name.length); - framesToAdd.sort(FlxFrame.sortByName.bind(_, _, Prefix.length, postFix.length)); + FlxFrame.sort(framesToAdd, Prefix.length, postFix.length); return FlxTileFrames.fromFrames(framesToAdd); } diff --git a/tests/unit/src/flixel/graphics/frames/FlxAtlasFramesTest.hx b/tests/unit/src/flixel/graphics/frames/FlxAtlasFramesTest.hx index 8d4572b3c6..5142cc8660 100644 --- a/tests/unit/src/flixel/graphics/frames/FlxAtlasFramesTest.hx +++ b/tests/unit/src/flixel/graphics/frames/FlxAtlasFramesTest.hx @@ -8,18 +8,17 @@ class FlxAtlasFramesTest extends FlxTest @Test function testTexturePackerJson() { - var bmd:BitmapData = new BitmapData(1, 1); + var bmd = new BitmapData(1, 1); var arrJson = '{"frames":[{"filename":"alien.png","frame":{"x":2,"y":2,"w":46,"h":16},"rotated":false,"trimmed":true,"spriteSourceSize":{"x":1,"y":0,"w":46,"h":16},"sourceSize":{"w":48,"h":16},"pivot":{"x":0.5,"y":0.5}},{"filename":"medium.png","frame":{"x":2,"y":20,"w":32,"h":32},"rotated":false,"trimmed":false,"spriteSourceSize":{"x":0,"y":0,"w":32,"h":32},"sourceSize":{"w":32,"h":32},"pivot":{"x":0.5,"y":0.5}},{"filename":"ship.png","frame":{"x":36,"y":38,"w":12,"h":8},"rotated":true,"trimmed":false,"spriteSourceSize":{"x":0,"y":0,"w":12,"h":8},"sourceSize":{"w":12,"h":8},"pivot":{"x":0.5,"y":0.5}},{"filename":"small.png","frame":{"x":36,"y":20,"w":16,"h":16},"rotated":false,"trimmed":false,"spriteSourceSize":{"x":0,"y":0,"w":16,"h":16},"sourceSize":{"w":16,"h":16},"pivot":{"x":0.5,"y":0.5}}]}'; var hashJson = '{"frames":{"alien.png":{"frame":{"x":2,"y":2,"w":46,"h":16},"rotated":false,"trimmed":true,"spriteSourceSize":{"x":1,"y":0,"w":46,"h":16},"sourceSize":{"w":48,"h":16},"pivot":{"x":0.5,"y":0.5}},"medium.png":{"frame":{"x":2,"y":20,"w":32,"h":32},"rotated":false,"trimmed":false,"spriteSourceSize":{"x":0,"y":0,"w":32,"h":32},"sourceSize":{"w":32,"h":32},"pivot":{"x":0.5,"y":0.5}},"ship.png":{"frame":{"x":36,"y":38,"w":12,"h":8},"rotated":true,"trimmed":false,"spriteSourceSize":{"x":0,"y":0,"w":12,"h":8},"sourceSize":{"w":12,"h":8},"pivot":{"x":0.5,"y":0.5}},"small.png":{"frame":{"x":36,"y":20,"w":16,"h":16},"rotated":false,"trimmed":false,"spriteSourceSize":{"x":0,"y":0,"w":16,"h":16},"sourceSize":{"w":16,"h":16},"pivot":{"x":0.5,"y":0.5}}}}'; - var atlasArray:FlxAtlasFrames = FlxAtlasFrames.fromTexturePackerJson(bmd, arrJson); - var atlasHash:FlxAtlasFrames = FlxAtlasFrames.fromTexturePackerJson(bmd, hashJson); + var atlasArray = FlxAtlasFrames.fromTexturePackerJson(bmd, arrJson); + var atlasHash = FlxAtlasFrames.fromTexturePackerJson(bmd, hashJson); Assert.areEqual(atlasArray.numFrames, atlasHash.numFrames); - var hashArr:FlxFrame; for (frameArr in atlasArray.frames) { - hashArr = atlasHash.framesHash.get(frameArr.name); + var hashArr = atlasHash.framesHash.get(frameArr.name); Assert.areEqual(frameArr.name, hashArr.name); Assert.isTrue(frameArr.sourceSize.equals(hashArr.sourceSize)); } diff --git a/tests/unit/src/flixel/graphics/frames/FlxFrameTest.hx b/tests/unit/src/flixel/graphics/frames/FlxFrameTest.hx index cb09737ac7..8af6eefbbd 100644 --- a/tests/unit/src/flixel/graphics/frames/FlxFrameTest.hx +++ b/tests/unit/src/flixel/graphics/frames/FlxFrameTest.hx @@ -1,25 +1,20 @@ package flixel.graphics.frames; +import massive.munit.Assert; + +@:access(flixel.graphics.frames.FlxFrame.new) class FlxFrameTest extends FlxTest { @Test - @:access(flixel.graphics.frames.FlxFrame.new) - function testSortByName() + function testSort() { var indices = [3, 5, 8, 1, 6]; - var frames:Array = []; var prefix = "tiles-"; var postfix = ".png"; - for (index in indices) - { - var frame = new FlxFrame(null); - frame.name = prefix + "00" + index + postfix; - frames.push(frame); - } - - frames.sort(FlxFrame.sortByName.bind(_, _, prefix.length, postfix.length)); - + var frames = [for (i in indices) createFrame(prefix + "00" + i + postfix)]; + FlxFrame.sort(frames, prefix.length, postfix.length); + var resultingIndices:Array> = []; for (frame in frames) { @@ -29,4 +24,22 @@ class FlxFrameTest extends FlxTest } FlxAssert.arraysEqual([1, 3, 5, 6, 8], resultingIndices); } + + @Test // #1926 + function testSortNoPrefix() + { + var length = 5; + var frames:Array = [for (i in 0...length) createFrame("split/" + i)]; + FlxFrame.sort(frames, 0, 0); + + for (i in 0...length) + Assert.areEqual("split/" + i, frames[i].name); + } + + function createFrame(name:String):FlxFrame + { + var frame = new FlxFrame(null); + frame.name = name; + return frame; + } } \ No newline at end of file