From 8b8a49308f866c4f805c80266318e9b9fe7180ed Mon Sep 17 00:00:00 2001 From: Daniel Halvarsson Date: Mon, 8 Mar 2021 20:19:04 +0100 Subject: [PATCH 1/6] Add import functionality for Aseprite animations Added function AsepriteHandler.importAnimation takes a path to the Aseprite .json file and returns an internal Animation object. --- .../graphics/animation/AsepriteHandler.java | 186 ++++++++++++++++++ 1 file changed, 186 insertions(+) diff --git a/src/de/gurkenlabs/litiengine/graphics/animation/AsepriteHandler.java b/src/de/gurkenlabs/litiengine/graphics/animation/AsepriteHandler.java index fe52971f5..a8f52731e 100644 --- a/src/de/gurkenlabs/litiengine/graphics/animation/AsepriteHandler.java +++ b/src/de/gurkenlabs/litiengine/graphics/animation/AsepriteHandler.java @@ -1,5 +1,191 @@ package de.gurkenlabs.litiengine.graphics.animation; +import java.io.File; +import java.io.FileReader; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.awt.Dimension; +import java.awt.image.BufferedImage; +import java.util.Set; +import java.util.Map; +import javax.imageio.ImageIO; + +import com.google.gson.JsonElement; +import com.google.gson.JsonParser; +import com.google.gson.JsonObject; + +import de.gurkenlabs.litiengine.graphics.Spritesheet; +import de.gurkenlabs.litiengine.graphics.animation.Animation; + +/** + * Offers an interface to import Aseprite JSON export format. + * Note: requires animation key frames to have same dimensions to support internal animation format. + * */ public class AsepriteHandler { + /** + * Thrown to indicate error when importing Aseprite JSON format. + * */ + public static class ImportAnimationException extends Error { + public ImportAnimationException(String message) { + super(message); + } + } + + /** + * Imports an Aseprite animation (.json + sprite sheet). + * Note: searches for sprite sheet path through .json metadata, specifically 'image' element. This should be an absolute path in system. + * + * @param jsonPath path (including filename) to Aseprite JSON. + * + * @return Animation object represented by each key frame in Aseprite sprite sheet. + * */ + public static Animation importAnimation(String jsonPath) throws IOException, FileNotFoundException, AsepriteHandler.ImportAnimationException { + + JsonElement rootElement = null; + try { rootElement = getRootJsonElement(jsonPath); } + catch(FileNotFoundException e) { + throw new FileNotFoundException("FileNotFoundException: Could not find .json file " + jsonPath); + } + + String spriteSheetPath = getSpriteSheetPath(rootElement); + File spriteSheetFile = new File(spriteSheetPath); + if(!spriteSheetFile.exists()) { + throw new FileNotFoundException("FileNotFoundException: Could not find sprite sheet file. " + + "Expected location is 'image' in .json metadata, which evaluates to: " + spriteSheetPath); + } + + Dimension keyFrameDimensions = getKeyFrameDimensions(rootElement); + Dimension spriteSheetDimensions = getSpriteSheetDimensions(rootElement); + if(areKeyFramesSameDimensions(rootElement, keyFrameDimensions)) { + + BufferedImage image = new BufferedImage((int)spriteSheetDimensions.getWidth(), + (int)spriteSheetDimensions.getHeight(), + BufferedImage.TYPE_4BYTE_ABGR); + + try { image = ImageIO.read(spriteSheetFile); } + catch(IOException e) { + throw new IOException("IOException: Could not write sprite sheet data to BufferedImage object."); + } + + Spritesheet spriteSheet = new Spritesheet(image, + spriteSheetPath, + (int)keyFrameDimensions.getWidth(), + (int)keyFrameDimensions.getHeight()); + + return new Animation(spriteSheet, false, getKeyFrameDurations(rootElement)); + } + + throw new AsepriteHandler.ImportAnimationException("AsepriteHandler.ImportAnimationException: animation key frames require same dimensions."); + } + + /** + * @param jsonPath path (including filename) to Aseprite .json file. + * + * @return root element of JSON data. + * */ + private static JsonElement getRootJsonElement(String jsonPath) throws FileNotFoundException { + + File jsonFile = new File(jsonPath); + + try { + JsonElement rootElement = JsonParser.parseReader(new FileReader(jsonFile)); + return rootElement; + } + catch(FileNotFoundException e) { throw e; } + } + + /** + * @param rootElement root element of JSON data. + * + * @return path (including filename) to animation sprite sheet. + * */ + private static String getSpriteSheetPath(JsonElement rootElement) { + + JsonElement metaData = rootElement.getAsJsonObject().get("meta"); + String spriteSheetPath = metaData.getAsJsonObject().get("image").getAsString(); + + return spriteSheetPath; + } + + /** + * @param rootElement root element of JSON data. + * + * @return dimensions of animation sprite sheet. + * */ + private static Dimension getSpriteSheetDimensions(JsonElement rootElement) { + + JsonElement metadata = rootElement.getAsJsonObject().get("meta"); + JsonObject spriteSheetSize = metadata.getAsJsonObject().get("size").getAsJsonObject(); + + int spriteSheetWidth = spriteSheetSize.get("w").getAsInt(); + int spriteSheetHeight = spriteSheetSize.get("h").getAsInt(); + + return new Dimension(spriteSheetWidth, spriteSheetHeight); + } + + /** + * @param rootElement root element of JSON data. + * + * @return dimensions of first key frame. + * */ + private static Dimension getKeyFrameDimensions(JsonElement rootElement) { + + JsonElement frames = rootElement.getAsJsonObject().get("frames"); + + JsonObject firstFrameObject = frames.getAsJsonObject().entrySet().iterator().next().getValue().getAsJsonObject(); + JsonObject frameDimensions = firstFrameObject.get("sourceSize").getAsJsonObject(); + + int frameWidth = frameDimensions.get("w").getAsInt(); + int frameHeight = frameDimensions.get("h").getAsInt(); + + return new Dimension(frameWidth, frameHeight); + } + + /** + * @param rootElement root element of JSON data. + * @param expected expected dimensions of each key frame. + * + * @return true if key frames have same duration. + * */ + private static boolean areKeyFramesSameDimensions(JsonElement rootElement, Dimension expected) { + + JsonElement frames = rootElement.getAsJsonObject().get("frames"); + + for(Map.Entry entry : frames.getAsJsonObject().entrySet()) { + JsonObject frameObject = entry.getValue().getAsJsonObject(); + JsonObject frameDimensions = frameObject.get("sourceSize").getAsJsonObject(); + + int frameWidth = frameDimensions.get("w").getAsInt(); + int frameHeight = frameDimensions.get("h").getAsInt(); + + if(frameWidth != expected.getWidth() || frameHeight != expected.getHeight()) + return false; + } + + return true; + } + + /** + * @param rootElement root element of JSON data. + * + * @return integer array representing duration of each key frame. + * */ + public static int[] getKeyFrameDurations(JsonElement rootElement) { + + JsonElement frames = rootElement.getAsJsonObject().get("frames"); + + Set> keyFrameSet = frames.getAsJsonObject().entrySet(); + + int[] keyFrameDurations = new int[keyFrameSet.size()]; + + int frameIndex = 0; + for(Map.Entry entry : keyFrameSet) { + JsonObject frameObject = entry.getValue().getAsJsonObject(); + int frameDuration = frameObject.get("duration").getAsInt(); + keyFrameDurations[frameIndex++] = frameDuration; + } + + return keyFrameDurations; + } } From 0cc51f55f203ff911c9f1aeabe20cc191583b586 Mon Sep 17 00:00:00 2001 From: Daniel Halvarsson Date: Mon, 8 Mar 2021 20:29:38 +0100 Subject: [PATCH 2/6] Add test animations used to test Aseprite import Added a new folder intended to contain test animations that can be used for testing the Aseprite import functionality. --- .../Sprite-0001-sheet.png | Bin 0 -> 246 bytes .../aseprite_test_animations/Sprite-0001.json | 40 ++++++++++++++++++ 2 files changed, 40 insertions(+) create mode 100644 tests/de/gurkenlabs/litiengine/graphics/animation/aseprite_test_animations/Sprite-0001-sheet.png create mode 100644 tests/de/gurkenlabs/litiengine/graphics/animation/aseprite_test_animations/Sprite-0001.json diff --git a/tests/de/gurkenlabs/litiengine/graphics/animation/aseprite_test_animations/Sprite-0001-sheet.png b/tests/de/gurkenlabs/litiengine/graphics/animation/aseprite_test_animations/Sprite-0001-sheet.png new file mode 100644 index 0000000000000000000000000000000000000000..44a7c127f9c5aed232b18eeecdd6217ac91ba2e4 GIT binary patch literal 246 zcmeAS@N?(olHy`uVBq!ia0vp^2|%pC!3HGX9;gigQhPmJ978f1-`+UL+ibwonz%wj z!`Q%&Eosh~18xsnq5@exHf+rN|GvXx!yh5}7gh`mejS=Ao#j9N-Cn&{#zTQ2nI)lz zp+~U6kjcOeXq?2$?fgkxl~T{wKM&7*tL^#O{!-XRal=-fSdX{!q)ctP+!%DTmo$Hn zc#{z8aI(tP+jq5O`ux{>dk-cVPBM;8{&#&|N`9}sN@eWc*lPbW|JEZ{W4~A2;oNg_ t<+3d-4=dkQ1znvnfBtTuRR`)L7y=JxPf9wqTpY+{@O1TaS?83{1ORfuVI2Sf literal 0 HcmV?d00001 diff --git a/tests/de/gurkenlabs/litiengine/graphics/animation/aseprite_test_animations/Sprite-0001.json b/tests/de/gurkenlabs/litiengine/graphics/animation/aseprite_test_animations/Sprite-0001.json new file mode 100644 index 000000000..e512f005f --- /dev/null +++ b/tests/de/gurkenlabs/litiengine/graphics/animation/aseprite_test_animations/Sprite-0001.json @@ -0,0 +1,40 @@ +{ "frames": { + "Sprite-0001 0.png": { + "frame": { "x": 0, "y": 0, "w": 32, "h": 32 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 32, "h": 32 }, + "sourceSize": { "w": 32, "h": 32 }, + "duration": 100 + }, + "Sprite-0001 1.png": { + "frame": { "x": 32, "y": 0, "w": 32, "h": 32 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 32, "h": 32 }, + "sourceSize": { "w": 32, "h": 32 }, + "duration": 100 + }, + "Sprite-0001 2.png": { + "frame": { "x": 64, "y": 0, "w": 32, "h": 32 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 32, "h": 32 }, + "sourceSize": { "w": 32, "h": 32 }, + "duration": 100 + } + }, + "meta": { + "app": "http://www.aseprite.org/", + "version": "1.1.9-dev", + "image": "tests/de/gurkenlabs/litiengine/graphics/animation/aseprite_test_animations/Sprite-0001-sheet.png", + "format": "RGBA8888", + "size": { "w": 96, "h": 32 }, + "scale": "1", + "frameTags": [ + ], + "layers": [ + { "name": "Layer 1", "opacity": 255, "blendMode": "normal" } + ] + } +} From 61ad8270ad472992399f913669d1b517854f08dd Mon Sep 17 00:00:00 2001 From: Daniel Halvarsson Date: Mon, 8 Mar 2021 20:33:44 +0100 Subject: [PATCH 3/6] Add unit test for Aseprite animation import Verifies that the import works as expected when given valid input. --- .../animation/AsepriteHandlerTests.java | 52 +++++++++++++++++++ 1 file changed, 52 insertions(+) create mode 100644 tests/de/gurkenlabs/litiengine/graphics/animation/AsepriteHandlerTests.java diff --git a/tests/de/gurkenlabs/litiengine/graphics/animation/AsepriteHandlerTests.java b/tests/de/gurkenlabs/litiengine/graphics/animation/AsepriteHandlerTests.java new file mode 100644 index 000000000..bb0438a6f --- /dev/null +++ b/tests/de/gurkenlabs/litiengine/graphics/animation/AsepriteHandlerTests.java @@ -0,0 +1,52 @@ +package de.gurkenlabs.litiengine.graphics.animation; + +import java.io.IOException; +import java.io.FileNotFoundException; +import java.awt.image.BufferedImage; + +import static org.junit.jupiter.api.Assertions.fail; +import static org.junit.jupiter.api.Assertions.assertEquals; + +import org.junit.jupiter.api.Test; + +import de.gurkenlabs.litiengine.graphics.Spritesheet; +import de.gurkenlabs.litiengine.graphics.animation.Animation; +import de.gurkenlabs.litiengine.resources.ImageFormat; + +public class AsepriteHandlerTests { + + /** + * Tests that Aseprite animation import works as expected when given valid input. + * */ + @Test + public void importAsepriteAnimationTest() { + try { + Animation animation = AsepriteHandler.importAnimation("tests/de/gurkenlabs/litiengine/graphics/animation/aseprite_test_animations/Sprite-0001.json"); + assertEquals("Sprite-0001-sheet", animation.getName()); + assertEquals(300, animation.getTotalDuration()); + for(int keyFrameDuration : animation.getKeyFrameDurations()) + assertEquals(100, keyFrameDuration); + + Spritesheet spriteSheet = animation.getSpritesheet(); + assertEquals(32, spriteSheet.getSpriteHeight()); + assertEquals(32, spriteSheet.getSpriteWidth()); + assertEquals(3, spriteSheet.getTotalNumberOfSprites()); + assertEquals(1, spriteSheet.getRows()); + assertEquals(3, spriteSheet.getColumns()); + assertEquals(ImageFormat.PNG, spriteSheet.getImageFormat()); + + BufferedImage image = spriteSheet.getImage(); + assertEquals(96, image.getWidth()); + assertEquals(32, image.getHeight()); + } + catch(FileNotFoundException e) { + fail(e.getMessage()); + } + catch(IOException e) { + fail(e.getMessage()); + } + catch(AsepriteHandler.ImportAnimationException e) { + fail(e.getMessage()); + } + } +} From 88f1d8a513483fbd1e32ea330628ba786787a8c5 Mon Sep 17 00:00:00 2001 From: Yu Zhou Date: Tue, 9 Mar 2021 08:23:47 +0100 Subject: [PATCH 4/6] Add some unit tests to verify the exceptions. --- .../animation/AsepriteHandlerTests.java | 30 +++++++++++++- .../aseprite_test_animations/Sprite-0002.json | 41 +++++++++++++++++++ .../aseprite_test_animations/Sprite-0004.json | 41 +++++++++++++++++++ 3 files changed, 110 insertions(+), 2 deletions(-) create mode 100644 tests/de/gurkenlabs/litiengine/graphics/animation/aseprite_test_animations/Sprite-0002.json create mode 100644 tests/de/gurkenlabs/litiengine/graphics/animation/aseprite_test_animations/Sprite-0004.json diff --git a/tests/de/gurkenlabs/litiengine/graphics/animation/AsepriteHandlerTests.java b/tests/de/gurkenlabs/litiengine/graphics/animation/AsepriteHandlerTests.java index bb0438a6f..8e1a89aa1 100644 --- a/tests/de/gurkenlabs/litiengine/graphics/animation/AsepriteHandlerTests.java +++ b/tests/de/gurkenlabs/litiengine/graphics/animation/AsepriteHandlerTests.java @@ -4,15 +4,16 @@ import java.io.FileNotFoundException; import java.awt.image.BufferedImage; + import static org.junit.jupiter.api.Assertions.fail; import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertThrows; import org.junit.jupiter.api.Test; - import de.gurkenlabs.litiengine.graphics.Spritesheet; import de.gurkenlabs.litiengine.graphics.animation.Animation; import de.gurkenlabs.litiengine.resources.ImageFormat; - +import de.gurkenlabs.litiengine.graphics.animation.AsepriteHandler.ImportAnimationException; public class AsepriteHandlerTests { /** @@ -49,4 +50,29 @@ public void importAsepriteAnimationTest() { fail(e.getMessage()); } } + /** + * Test that if AsepriteHandler.ImportAnimationException will be throwed if different frame dimensions are provided. + * + */ + @Test + public void ImportAnimationExceptionTest() { + + Throwable exception = assertThrows(ImportAnimationException.class, () -> AsepriteHandler.importAnimation("tests/de/gurkenlabs/litiengine/graphics/animation/aseprite_test_animations/Sprite-0002.json")); + assertEquals("AsepriteHandler.ImportAnimationException: animation key frames require same dimensions.", exception.getMessage()); + } + /** + * 1.first, we test if FileNotFoundException would be throwed if .json file cannot be found. + * 2.then we test if FileNotFoundException would be throwed if spritesheet file cannot be found. + */ + + + @Test + public void FileNotFoundExceptionTest(){ + Throwable exception_withoutJsonFile = assertThrows(FileNotFoundException.class, () -> AsepriteHandler.importAnimation("tests/de/gurkenlabs/litiengine/graphics/animation/aseprite_test_animations/Sprite-0003.json")); + assertEquals("FileNotFoundException: Could not find .json file tests/de/gurkenlabs/litiengine/graphics/animation/aseprite_test_animations/Sprite-0003.json", exception_withoutJsonFile.getMessage()); + Throwable exception_withoutSpriteSheet = assertThrows(FileNotFoundException.class, () -> AsepriteHandler.importAnimation("tests/de/gurkenlabs/litiengine/graphics/animation/aseprite_test_animations/Sprite-0004.json")); + assertEquals("FileNotFoundException: Could not find sprite sheet file. Expected location is 'image' in .json metadata, which evaluates to: tests/de/gurkenlabs/litiengine/graphics/animation/aseprite_test_animations/Sprite-0002-sheet.png", exception_withoutSpriteSheet.getMessage()); + + } + } diff --git a/tests/de/gurkenlabs/litiengine/graphics/animation/aseprite_test_animations/Sprite-0002.json b/tests/de/gurkenlabs/litiengine/graphics/animation/aseprite_test_animations/Sprite-0002.json new file mode 100644 index 000000000..a75131d7d --- /dev/null +++ b/tests/de/gurkenlabs/litiengine/graphics/animation/aseprite_test_animations/Sprite-0002.json @@ -0,0 +1,41 @@ +{ "frames": { + "Sprite-0002 0.png": { + "frame": { "x": 0, "y": 0, "w": 32, "h": 32 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 32, "h": 32 }, + "sourceSize": { "w": 32, "h": 32 }, + "duration": 100 + }, + "Sprite-0002 1.png": { + "frame": { "x": 32, "y": 0, "w": 32, "h": 32 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 32, "h": 32 }, + "sourceSize": { "w": 64, "h": 64 }, + "duration": 100 + }, + "Sprite-0002 2.png": { + "frame": { "x": 64, "y": 0, "w": 32, "h": 32 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 32, "h": 32 }, + "sourceSize": { "w": 32, "h": 32 }, + "duration": 100 + } + }, + "meta": { + "app": "http://www.aseprite.org/", + "version": "1.1.9-dev", + "image": "tests/de/gurkenlabs/litiengine/graphics/animation/aseprite_test_animations/Sprite-0001-sheet.png", + "format": "RGBA8888", + "size": { "w": 96, "h": 32 }, + "scale": "1", + "frameTags": [ + ], + "layers": [ + { "name": "Layer 1", "opacity": 255, "blendMode": "normal" } + ] + } + } + \ No newline at end of file diff --git a/tests/de/gurkenlabs/litiengine/graphics/animation/aseprite_test_animations/Sprite-0004.json b/tests/de/gurkenlabs/litiengine/graphics/animation/aseprite_test_animations/Sprite-0004.json new file mode 100644 index 000000000..d1aed4ced --- /dev/null +++ b/tests/de/gurkenlabs/litiengine/graphics/animation/aseprite_test_animations/Sprite-0004.json @@ -0,0 +1,41 @@ +{ "frames": { + "Sprite-0001 0.png": { + "frame": { "x": 0, "y": 0, "w": 32, "h": 32 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 32, "h": 32 }, + "sourceSize": { "w": 32, "h": 32 }, + "duration": 100 + }, + "Sprite-0001 1.png": { + "frame": { "x": 32, "y": 0, "w": 32, "h": 32 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 32, "h": 32 }, + "sourceSize": { "w": 32, "h": 32 }, + "duration": 100 + }, + "Sprite-0001 2.png": { + "frame": { "x": 64, "y": 0, "w": 32, "h": 32 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 32, "h": 32 }, + "sourceSize": { "w": 32, "h": 32 }, + "duration": 100 + } + }, + "meta": { + "app": "http://www.aseprite.org/", + "version": "1.1.9-dev", + "image": "tests/de/gurkenlabs/litiengine/graphics/animation/aseprite_test_animations/Sprite-0002-sheet.png", + "format": "RGBA8888", + "size": { "w": 96, "h": 32 }, + "scale": "1", + "frameTags": [ + ], + "layers": [ + { "name": "Layer 1", "opacity": 255, "blendMode": "normal" } + ] + } + } + \ No newline at end of file From e54f4457daac68be350cf5bcc445a31dc738f29e Mon Sep 17 00:00:00 2001 From: Daniel Halvarsson Date: Tue, 9 Mar 2021 18:19:53 +0100 Subject: [PATCH 5/6] Fix formatting --- .../graphics/animation/AsepriteHandlerTests.java | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/tests/de/gurkenlabs/litiengine/graphics/animation/AsepriteHandlerTests.java b/tests/de/gurkenlabs/litiengine/graphics/animation/AsepriteHandlerTests.java index 8e1a89aa1..d560af6da 100644 --- a/tests/de/gurkenlabs/litiengine/graphics/animation/AsepriteHandlerTests.java +++ b/tests/de/gurkenlabs/litiengine/graphics/animation/AsepriteHandlerTests.java @@ -4,7 +4,6 @@ import java.io.FileNotFoundException; import java.awt.image.BufferedImage; - import static org.junit.jupiter.api.Assertions.fail; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertThrows; @@ -12,8 +11,9 @@ import org.junit.jupiter.api.Test; import de.gurkenlabs.litiengine.graphics.Spritesheet; import de.gurkenlabs.litiengine.graphics.animation.Animation; -import de.gurkenlabs.litiengine.resources.ImageFormat; import de.gurkenlabs.litiengine.graphics.animation.AsepriteHandler.ImportAnimationException; +import de.gurkenlabs.litiengine.resources.ImageFormat; + public class AsepriteHandlerTests { /** @@ -50,9 +50,9 @@ public void importAsepriteAnimationTest() { fail(e.getMessage()); } } + /** * Test that if AsepriteHandler.ImportAnimationException will be throwed if different frame dimensions are provided. - * */ @Test public void ImportAnimationExceptionTest() { @@ -60,19 +60,18 @@ public void ImportAnimationExceptionTest() { Throwable exception = assertThrows(ImportAnimationException.class, () -> AsepriteHandler.importAnimation("tests/de/gurkenlabs/litiengine/graphics/animation/aseprite_test_animations/Sprite-0002.json")); assertEquals("AsepriteHandler.ImportAnimationException: animation key frames require same dimensions.", exception.getMessage()); } + /** + * Tests thrown FileNotFoundException when importing an Aseprite animation. + * * 1.first, we test if FileNotFoundException would be throwed if .json file cannot be found. * 2.then we test if FileNotFoundException would be throwed if spritesheet file cannot be found. */ - - @Test public void FileNotFoundExceptionTest(){ Throwable exception_withoutJsonFile = assertThrows(FileNotFoundException.class, () -> AsepriteHandler.importAnimation("tests/de/gurkenlabs/litiengine/graphics/animation/aseprite_test_animations/Sprite-0003.json")); assertEquals("FileNotFoundException: Could not find .json file tests/de/gurkenlabs/litiengine/graphics/animation/aseprite_test_animations/Sprite-0003.json", exception_withoutJsonFile.getMessage()); Throwable exception_withoutSpriteSheet = assertThrows(FileNotFoundException.class, () -> AsepriteHandler.importAnimation("tests/de/gurkenlabs/litiengine/graphics/animation/aseprite_test_animations/Sprite-0004.json")); assertEquals("FileNotFoundException: Could not find sprite sheet file. Expected location is 'image' in .json metadata, which evaluates to: tests/de/gurkenlabs/litiengine/graphics/animation/aseprite_test_animations/Sprite-0002-sheet.png", exception_withoutSpriteSheet.getMessage()); - } - } From 49a70213afb7b97401dd80984b477cc71d27a49b Mon Sep 17 00:00:00 2001 From: Daniel Halvarsson Date: Tue, 9 Mar 2021 18:23:42 +0100 Subject: [PATCH 6/6] Remove redundancy --- .../graphics/animation/AsepriteHandler.java | 22 +------------------ 1 file changed, 1 insertion(+), 21 deletions(-) diff --git a/src/de/gurkenlabs/litiengine/graphics/animation/AsepriteHandler.java b/src/de/gurkenlabs/litiengine/graphics/animation/AsepriteHandler.java index a8f52731e..6d00d4b8d 100644 --- a/src/de/gurkenlabs/litiengine/graphics/animation/AsepriteHandler.java +++ b/src/de/gurkenlabs/litiengine/graphics/animation/AsepriteHandler.java @@ -56,13 +56,9 @@ public static Animation importAnimation(String jsonPath) throws IOException, Fil } Dimension keyFrameDimensions = getKeyFrameDimensions(rootElement); - Dimension spriteSheetDimensions = getSpriteSheetDimensions(rootElement); if(areKeyFramesSameDimensions(rootElement, keyFrameDimensions)) { - BufferedImage image = new BufferedImage((int)spriteSheetDimensions.getWidth(), - (int)spriteSheetDimensions.getHeight(), - BufferedImage.TYPE_4BYTE_ABGR); - + BufferedImage image = null; try { image = ImageIO.read(spriteSheetFile); } catch(IOException e) { throw new IOException("IOException: Could not write sprite sheet data to BufferedImage object."); @@ -108,22 +104,6 @@ private static String getSpriteSheetPath(JsonElement rootElement) { return spriteSheetPath; } - /** - * @param rootElement root element of JSON data. - * - * @return dimensions of animation sprite sheet. - * */ - private static Dimension getSpriteSheetDimensions(JsonElement rootElement) { - - JsonElement metadata = rootElement.getAsJsonObject().get("meta"); - JsonObject spriteSheetSize = metadata.getAsJsonObject().get("size").getAsJsonObject(); - - int spriteSheetWidth = spriteSheetSize.get("w").getAsInt(); - int spriteSheetHeight = spriteSheetSize.get("h").getAsInt(); - - return new Dimension(spriteSheetWidth, spriteSheetHeight); - } - /** * @param rootElement root element of JSON data. *