From 2367f8832b30a5a23f2ee23ccc3887ae00dccb12 Mon Sep 17 00:00:00 2001 From: Lukas Klingsbo Date: Sun, 21 Jan 2024 11:30:32 +0100 Subject: [PATCH 01/17] feat: Transfer flame_texturepacker to monorepo --- packages/flame_texturepacker/.metadata | 10 + packages/flame_texturepacker/CHANGELOG.md | 7 + packages/flame_texturepacker/LICENSE | 22 ++ packages/flame_texturepacker/README.md | 89 +++++++ .../flame_texturepacker/analysis_options.yaml | 1 + .../flame_texturepacker/example/.metadata | 30 +++ .../flame_texturepacker/example/README.md | 4 + .../example/analysis_options.yaml | 1 + .../example/assets/FlameAtlasMap.atlas | 102 ++++++++ .../example/assets/FlameAtlasMap.png | Bin 0 -> 66114 bytes .../example/assets/FlameAtlasMap2.png | Bin 0 -> 64330 bytes .../example/assets/FlameAtlasMap3.png | Bin 0 -> 64063 bytes .../flame_texturepacker/example/lib/main.dart | 72 ++++++ .../flame_texturepacker/example/pubspec.yaml | 21 ++ .../lib/atlas/model/page.dart | 12 + .../lib/atlas/model/region.dart | 18 ++ .../atlas/model/texture_packer_sprite.dart | 128 ++++++++++ .../lib/atlas/texture_packer_atlas.dart | 224 ++++++++++++++++++ .../lib/flame_texturepacker.dart | 75 ++++++ packages/flame_texturepacker/pubspec.yaml | 23 ++ 20 files changed, 839 insertions(+) create mode 100644 packages/flame_texturepacker/.metadata create mode 100644 packages/flame_texturepacker/CHANGELOG.md create mode 100644 packages/flame_texturepacker/LICENSE create mode 100644 packages/flame_texturepacker/README.md create mode 100644 packages/flame_texturepacker/analysis_options.yaml create mode 100644 packages/flame_texturepacker/example/.metadata create mode 100644 packages/flame_texturepacker/example/README.md create mode 100644 packages/flame_texturepacker/example/analysis_options.yaml create mode 100644 packages/flame_texturepacker/example/assets/FlameAtlasMap.atlas create mode 100644 packages/flame_texturepacker/example/assets/FlameAtlasMap.png create mode 100644 packages/flame_texturepacker/example/assets/FlameAtlasMap2.png create mode 100644 packages/flame_texturepacker/example/assets/FlameAtlasMap3.png create mode 100644 packages/flame_texturepacker/example/lib/main.dart create mode 100644 packages/flame_texturepacker/example/pubspec.yaml create mode 100644 packages/flame_texturepacker/lib/atlas/model/page.dart create mode 100644 packages/flame_texturepacker/lib/atlas/model/region.dart create mode 100644 packages/flame_texturepacker/lib/atlas/model/texture_packer_sprite.dart create mode 100644 packages/flame_texturepacker/lib/atlas/texture_packer_atlas.dart create mode 100644 packages/flame_texturepacker/lib/flame_texturepacker.dart create mode 100644 packages/flame_texturepacker/pubspec.yaml diff --git a/packages/flame_texturepacker/.metadata b/packages/flame_texturepacker/.metadata new file mode 100644 index 0000000000..70a78156fc --- /dev/null +++ b/packages/flame_texturepacker/.metadata @@ -0,0 +1,10 @@ +# This file tracks properties of this Flutter project. +# Used by Flutter tool to assess capabilities and perform upgrades etc. +# +# This file should be version controlled and should not be manually edited. + +version: + revision: 2d2a1ffec95cc70a3218872a2cd3f8de4933c42f + channel: stable + +project_type: package diff --git a/packages/flame_texturepacker/CHANGELOG.md b/packages/flame_texturepacker/CHANGELOG.md new file mode 100644 index 0000000000..5024477dae --- /dev/null +++ b/packages/flame_texturepacker/CHANGELOG.md @@ -0,0 +1,7 @@ +## 2.1.0 + + - Load spritesheets as Map + +## 1.0.0 + + - Load spritesheets from TexturePacker diff --git a/packages/flame_texturepacker/LICENSE b/packages/flame_texturepacker/LICENSE new file mode 100644 index 0000000000..3897c4d092 --- /dev/null +++ b/packages/flame_texturepacker/LICENSE @@ -0,0 +1,22 @@ +MIT License + +Copyright (c) 2021 Blue Fire + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + diff --git a/packages/flame_texturepacker/README.md b/packages/flame_texturepacker/README.md new file mode 100644 index 0000000000..1f651bbb2e --- /dev/null +++ b/packages/flame_texturepacker/README.md @@ -0,0 +1,89 @@ + +

+ + flame + +

+ +

+A flame plugin to import sprite sheets generated by [Gdx Texture Packer][2] and +[Code and Web Texture Packer][1] +

+ +

+ + + + +

+ +--- + + + +# flame_texturepacker + + +## Install from Pub + +```console +flutter pub add flame_texturepacker +``` + + +## Usage + +Drop generated atlas file and sprite sheet images into the `assets/` and link the files in your +`pubspec.yaml` file: + +```yaml + assets: + - assets/spriteSheet.atlas + - assets/spriteSheet.png +``` + +Import the plugin like this: + +`import 'package:flame_texturepacker/flame_texturepacker.dart';` + +Load the TextureAtlas passing the path of the sprite sheet atlas file: + +```Dart +final atlas = await fromAtlas('FlameAtlasMap.atlas'); +``` + +Get a list of sprites ordered by their index, you can use the list to generate an animation: + +```Dart +final spriteList = atlas.findSpritesByName('robot_walk'); + +final animation = SpriteAnimation.spriteList( + spriteList, + stepTime: 0.1, + loop: true, +); +``` + +Get individual sprites by name: + +```Dart +final jumpSprite = atlas.findSpriteByName('robot_jump')!; +final fallSprite = atlas.findSpriteByName('robot_fall')!; +final idleSprite = atlas.findSpriteByName('robot_idle')!; +``` + +Full working example can be found in [example folder][3]. + +Note: Sprites used in this example can be found OpenGameArt [here][4]. + + +## Credits + +Big thanks to [Jonas Fröber][5] for the original implementation! + +[1]: https://www.codeandweb.com/texturepacker 'Code & Web Texture Packer' +[2]: https://github.com/crashinvaders/gdx-texture-packer-gui 'Gdx Texture Packer' +[3]: example/lib/main.dart 'Full working example' +[4]: https://opengameart.org/content/toon-characters-1 'Robot sprite' +[5]: https://github.com/Brixto + diff --git a/packages/flame_texturepacker/analysis_options.yaml b/packages/flame_texturepacker/analysis_options.yaml new file mode 100644 index 0000000000..92aae2f249 --- /dev/null +++ b/packages/flame_texturepacker/analysis_options.yaml @@ -0,0 +1 @@ +include: package:flame_lint/analysis_options_with_dcm.yaml diff --git a/packages/flame_texturepacker/example/.metadata b/packages/flame_texturepacker/example/.metadata new file mode 100644 index 0000000000..a57e7a1027 --- /dev/null +++ b/packages/flame_texturepacker/example/.metadata @@ -0,0 +1,30 @@ +# This file tracks properties of this Flutter project. +# Used by Flutter tool to assess capabilities and perform upgrades etc. +# +# This file should be version controlled and should not be manually edited. + +version: + revision: "2e9cb0aa71a386a91f73f7088d115c0d96654829" + channel: "stable" + +project_type: app + +# Tracks metadata for the flutter migrate command +migration: + platforms: + - platform: root + create_revision: 2e9cb0aa71a386a91f73f7088d115c0d96654829 + base_revision: 2e9cb0aa71a386a91f73f7088d115c0d96654829 + - platform: linux + create_revision: 2e9cb0aa71a386a91f73f7088d115c0d96654829 + base_revision: 2e9cb0aa71a386a91f73f7088d115c0d96654829 + + # User provided section + + # List of Local paths (relative to this file) that should be + # ignored by the migrate tool. + # + # Files that are not part of the templates will be ignored by default. + unmanaged_files: + - 'lib/main.dart' + - 'ios/Runner.xcodeproj/project.pbxproj' diff --git a/packages/flame_texturepacker/example/README.md b/packages/flame_texturepacker/example/README.md new file mode 100644 index 0000000000..9db935384d --- /dev/null +++ b/packages/flame_texturepacker/example/README.md @@ -0,0 +1,4 @@ +# flame_texturepacker example + +Simple project to showcase the usage of flame_packer by rendering a few sprites and an animation +loaded from a texture packer atlas. diff --git a/packages/flame_texturepacker/example/analysis_options.yaml b/packages/flame_texturepacker/example/analysis_options.yaml new file mode 100644 index 0000000000..92aae2f249 --- /dev/null +++ b/packages/flame_texturepacker/example/analysis_options.yaml @@ -0,0 +1 @@ +include: package:flame_lint/analysis_options_with_dcm.yaml diff --git a/packages/flame_texturepacker/example/assets/FlameAtlasMap.atlas b/packages/flame_texturepacker/example/assets/FlameAtlasMap.atlas new file mode 100644 index 0000000000..cd0c10ce80 --- /dev/null +++ b/packages/flame_texturepacker/example/assets/FlameAtlasMap.atlas @@ -0,0 +1,102 @@ + +FlameAtlasMap.png +size: 512, 512 +format: RGBA8888 +filter: Nearest, Nearest +repeat: none +robot_jump + rotate: true + xy: 196, 260 + size: 192, 256 + orig: 192, 256 + offset: 0, 0 + index: -1 +robot_walk + rotate: false + xy: 2, 196 + size: 192, 256 + orig: 192, 256 + offset: 0, 0 + index: 0 +robot_walk + rotate: true + xy: 2, 2 + size: 192, 256 + orig: 192, 256 + offset: 0, 0 + index: 5 +robot_walk + rotate: false + xy: 260, 2 + size: 192, 256 + orig: 192, 256 + offset: 0, 0 + index: 2 + +FlameAtlasMap2.png +size: 512, 512 +format: RGBA8888 +filter: Nearest, Nearest +repeat: none +robot_duck + rotate: true + xy: 2, 2 + size: 192, 256 + orig: 192, 256 + offset: 0, 0 + index: -1 +robot_fall + rotate: false + xy: 260, 2 + size: 192, 256 + orig: 192, 256 + offset: 0, 0 + index: -1 +robot_walk + rotate: false + xy: 2, 196 + size: 192, 256 + orig: 192, 256 + offset: 0, 0 + index: 7 +robot_walk + rotate: true + xy: 196, 260 + size: 192, 256 + orig: 192, 256 + offset: 0, 0 + index: 4 + +FlameAtlasMap3.png +size: 512, 512 +format: RGBA8888 +filter: Nearest, Nearest +repeat: none +robot_idle + rotate: false + xy: 2, 196 + size: 192, 256 + orig: 192, 256 + offset: 0, 0 + index: -1 +robot_walk + rotate: true + xy: 2, 2 + size: 192, 256 + orig: 192, 256 + offset: 0, 0 + index: 1 +robot_walk + rotate: true + xy: 196, 260 + size: 192, 256 + orig: 192, 256 + offset: 0, 0 + index: 6 +robot_walk + rotate: false + xy: 260, 2 + size: 192, 256 + orig: 192, 256 + offset: 0, 0 + index: 3 diff --git a/packages/flame_texturepacker/example/assets/FlameAtlasMap.png b/packages/flame_texturepacker/example/assets/FlameAtlasMap.png new file mode 100644 index 0000000000000000000000000000000000000000..def39239670b3f7d39f25e963935483299e7af65 GIT binary patch literal 66114 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 literal 0 HcmV?d00001 diff --git a/packages/flame_texturepacker/example/assets/FlameAtlasMap2.png b/packages/flame_texturepacker/example/assets/FlameAtlasMap2.png new file mode 100644 index 0000000000000000000000000000000000000000..e2b7f63394bd299088af273e42990d360105bb8f GIT binary patch literal 64330 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

ueds)jtUh%O>q$z*nAIE%t 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 literal 0 HcmV?d00001 diff --git a/packages/flame_texturepacker/example/lib/main.dart b/packages/flame_texturepacker/example/lib/main.dart new file mode 100644 index 0000000000..a63d7d2f10 --- /dev/null +++ b/packages/flame_texturepacker/example/lib/main.dart @@ -0,0 +1,72 @@ +import 'package:flame/components.dart'; +import 'package:flame/game.dart'; +import 'package:flame_texturepacker/flame_texturepacker.dart'; +import 'package:flutter/material.dart'; + +void main() { + final myGame = MyGame(); + runApp( + GameWidget( + game: myGame, + ), + ); +} + +class MyGame extends FlameGame { + @override + Future onLoad() async { + super.onLoad(); + + // Load the atlasMap. + final atlas = await fromAtlas('FlameAtlasMap.atlas'); + + // Get a list of sprites ordered by their index + final walkingSprites = atlas.findSpritesByName('robot_walk'); + + // Create animation with the list of sprites + final walkingAnimation = SpriteAnimation.spriteList( + walkingSprites, + stepTime: 0.1, + ); + + // Get individual sprites by name + final jumpSprite = atlas.findSpriteByName('robot_jump')!; + final fallSprite = atlas.findSpriteByName('robot_fall')!; + final idleSprite = atlas.findSpriteByName('robot_idle')!; + + // Get the list of all sprites in the sprite sheet + final allSprites = atlas.sprites; // ignore: unused_local_variable + + add( + SpriteComponent( + sprite: jumpSprite, + position: Vector2(200, 100), + size: Vector2(72, 96), + ), + ); + + add( + SpriteComponent( + sprite: fallSprite, + position: Vector2(300, 100), + size: Vector2(72, 96), + ), + ); + + add( + SpriteComponent( + sprite: idleSprite, + position: Vector2(400, 100), + size: Vector2(72, 96), + ), + ); + + add( + SpriteAnimationComponent( + animation: walkingAnimation, + position: Vector2(300, 200), + size: Vector2(72, 96), + ), + ); + } +} diff --git a/packages/flame_texturepacker/example/pubspec.yaml b/packages/flame_texturepacker/example/pubspec.yaml new file mode 100644 index 0000000000..3953b57114 --- /dev/null +++ b/packages/flame_texturepacker/example/pubspec.yaml @@ -0,0 +1,21 @@ +name: flame_texturepacker_example +description: An example of how to use the flame_texturepacker package. +version: 1.0.0 +publish_to: none + +environment: + sdk: ">=3.0.0 <4.0.0" + flutter: ">=3.13.0" + +dependencies: + flame: ^1.14.0 + flame_texturepacker: ^2.1.0 + flutter: + sdk: flutter + +dev_dependencies: + flame_lint: ^1.1.2 + +flutter: + assets: + - assets/ \ No newline at end of file diff --git a/packages/flame_texturepacker/lib/atlas/model/page.dart b/packages/flame_texturepacker/lib/atlas/model/page.dart new file mode 100644 index 0000000000..baa6308d07 --- /dev/null +++ b/packages/flame_texturepacker/lib/atlas/model/page.dart @@ -0,0 +1,12 @@ +import 'dart:ui'; + +class Page { + late String textureFile; + late Image texture; + late int width; + late int height; + late String format; + late String minFilter; + late String magFilter; + late String repeat; +} \ No newline at end of file diff --git a/packages/flame_texturepacker/lib/atlas/model/region.dart b/packages/flame_texturepacker/lib/atlas/model/region.dart new file mode 100644 index 0000000000..8311a4dafd --- /dev/null +++ b/packages/flame_texturepacker/lib/atlas/model/region.dart @@ -0,0 +1,18 @@ +import 'package:flame_texturepacker/atlas/model/page.dart'; + +/// Represents a region within the texture packer atlas. +class Region { + late Page page; + late String name; + late double left; + late double top; + late double width; + late double height; + late double offsetX; + late double offsetY; + late double originalWidth; + late double originalHeight; + late int degrees; + late bool rotate; + late int index; +} diff --git a/packages/flame_texturepacker/lib/atlas/model/texture_packer_sprite.dart b/packages/flame_texturepacker/lib/atlas/model/texture_packer_sprite.dart new file mode 100644 index 0000000000..253105e966 --- /dev/null +++ b/packages/flame_texturepacker/lib/atlas/model/texture_packer_sprite.dart @@ -0,0 +1,128 @@ +import 'dart:ui'; + +import 'package:flame/components.dart'; +import 'package:flame/game.dart'; +import 'package:flame/rendering.dart'; +import 'package:flame_texturepacker/atlas/model/region.dart'; + +/// {@template _texture_packer_sprite} +/// A [Sprite] extracted from a texture packer file. +/// {@endtemplate} +class TexturePackerSprite extends Sprite { + /// {@macro _texture_packer_sprite} + TexturePackerSprite(Region region) + : name = region.name, + index = region.index, + offsetX = region.offsetX, + offsetY = region.offsetY, + packedWidth = region.rotate ? region.height : region.width, + packedHeight = region.rotate ? region.width : region.height, + originalWidth = region.originalWidth, + originalHeight = region.originalHeight, + rotate = region.rotate, + degrees = region.degrees, + super( + region.page.texture, + srcPosition: Vector2(region.left, region.top), + srcSize: Vector2( + region.rotate ? region.height : region.width, + region.rotate ? region.width : region.height, + ), + ) { + decorator = Transform2DDecorator(transform); + if (region.rotate) { + transform.angle = radians(90); + } + } + + /// The number at the end of the original image file name, or -1 if none. + /// + /// When sprites are packed, if the original file name ends with a number, it + /// is stored as the index and is not considered as part of the sprite's name. + /// This is useful for keeping animation frames in order. + final int index; + + /// The name of the original image file, without the file's extension. + /// If the name ends with an underscore followed by only numbers, that part is + /// excluded: underscores denote special instructions to the texture packer. + final String name; + + /// The offset from the left of the original image to the left of the packed + /// image, after whitespace was removed for packing. + final double offsetX; + + /// The offset from the bottom of the original image to the bottom of the + /// packed image, after whitespace was removed for packing. + final double offsetY; + + /// The width of the image, after whitespace was removed for packing. + final double packedWidth; + + /// The height of the image, after whitespace was removed for packing. + final double packedHeight; + + /// The width of the image, before whitespace was removed and rotation was + /// applied for packing. + final double originalWidth; + + /// The height of the image, before whitespace was removed for packing. + final double originalHeight; + + /// If true, the region has been rotated 90 degrees counter clockwise. + final bool rotate; + + /// The degrees the region has been rotated, counter clockwise between 0 and + /// 359. Most atlas region handling deals only with 0 or 90 degree rotation + /// (enough to handle rectangles). + /// More advanced texture packing may support other rotations (eg, for tightly + /// packing polygons). + final int degrees; + + late final Decorator decorator; + final Transform2D transform = Transform2D(); + + // Used to avoid the creation of new Vector2 objects in render. + static final _tmpRenderPosition = Vector2.zero(); + static final _tmpRenderSize = Vector2.zero(); + + @override + void render( + Canvas canvas, { + Vector2? position, + Vector2? size, + Anchor anchor = Anchor.topLeft, + Paint? overridePaint, + }) { + if (position != null) { + _tmpRenderPosition.setFrom(position); + } else { + _tmpRenderPosition.setZero(); + } + + // If the sprite is rotated on the sprite sheet un-rotate it and adjust the + // size. + final unrotatedAnchor = rotate ? Anchor.bottomLeft : anchor; + + final tempSize = size ?? srcSize; + final tempWidth = rotate ? tempSize.y : tempSize.x; + final tempHeight = rotate ? tempSize.x : tempSize.y; + + _tmpRenderSize.setValues(tempWidth, tempHeight); + + _tmpRenderPosition.setValues( + _tmpRenderPosition.x - (unrotatedAnchor.x * _tmpRenderSize.x), + _tmpRenderPosition.y - (unrotatedAnchor.y * _tmpRenderSize.y), + ); + + decorator.applyChain( + (applyCanvas) => super.render( + applyCanvas, + position: _tmpRenderPosition, + size: _tmpRenderSize, + anchor: anchor, + overridePaint: overridePaint, + ), + canvas, + ); + } +} diff --git a/packages/flame_texturepacker/lib/atlas/texture_packer_atlas.dart b/packages/flame_texturepacker/lib/atlas/texture_packer_atlas.dart new file mode 100644 index 0000000000..81f20b6d5e --- /dev/null +++ b/packages/flame_texturepacker/lib/atlas/texture_packer_atlas.dart @@ -0,0 +1,224 @@ +library flame_texturepacker; + +import 'dart:convert'; + +import 'package:collection/collection.dart'; +import 'package:flame/cache.dart'; +import 'package:flame/flame.dart'; +import 'package:flame_texturepacker/atlas/model/page.dart'; +import 'package:flame_texturepacker/atlas/model/region.dart'; +import 'package:flame_texturepacker/atlas/model/texture_packer_sprite.dart'; + +final _images = Images(prefix: 'assets/'); + +class TexturePackerAtlas { + final sprites = []; + + /// Returns the first region found with the specified name. This method uses + /// string comparison to find the region, so the result should be cached + /// rather than calling this method multiple times. + TexturePackerSprite? findSpriteByName(String name) => + sprites.firstWhereOrNull((e) => e.name == name); + + /// Returns the first region found with the specified name and index. + /// This method uses string comparison to find the region, so the result + /// should be cached rather than calling this method multiple times. + TexturePackerSprite? findSpriteByNameIndex(String name, int index) { + for (final sprite in sprites) { + if (sprite.name == name && sprite.index == index) { + return sprite; + } + } + return null; + } + + /// Returns all regions with the specified name, ordered by smallest to + /// largest index. This method uses string comparison to find the regions, so + /// the result should be cached rather than calling this method multiple + /// times. + List findSpritesByName(String name) { + final matched = []; + for (final sprite in sprites) { + if (sprite.name == name) { + matched.add(sprite); + } + } + return matched; + } + + Future load(String path) async { + final atlasData = await _TextureAtlasData()._load(path); + + for (final region in atlasData.regions) { + sprites.add(TexturePackerSprite(region)); + } + return this; + } +} + +class _TextureAtlasData { + final pages = []; + final regions = []; + + Future<_TextureAtlasData> _load(String path) async { + final fileAsString = await Flame.assets.readFile(path); + + final iterator = LineSplitter.split(fileAsString).iterator; + var line = iterator.moveNextAndGet(); + var hasIndexes = false; + while (true) { + if (line == null) { + break; + } + if (line.isEmpty) { + line = iterator.moveNextAndGet(); + } + + Page? page; + while (true) { + if (line == null) { + break; + } + if (line.isEmpty) { + page = null; + line = iterator.moveNextAndGet(); + } else if (page == null) { + page = Page(); + page.textureFile = line; + final parentPath = (path.split('/')..removeLast()).join('/'); + final texturePath = '$parentPath/$line'; + page.texture = await _images.load(texturePath); + while (true) { + line = iterator.moveNextAndGet(); + if (line == null) { + break; + } + final (:count, :entry) = _readEntry(line); + if (count == 0) { + break; + } + switch (entry[0]) { + case 'size': + page.width = int.parse(entry[1]); + page.height = int.parse(entry[2]); + case 'filter': + page.minFilter = entry[1]; + page.magFilter = entry[2]; + case 'format': + page.format = entry[1]; + case 'repeat': + page.repeat = entry[1]; + } + } + pages.add(page); + } else { + final region = Region(); + region.page = page; + region.name = line.trim(); + while (true) { + line = iterator.moveNextAndGet(); + if (line == null) { + break; + } + final (:count, :entry) = _readEntry(line); + if (count == 0) { + break; + } + switch (entry[0]) { + case 'xy': + region.left = double.parse(entry[1]); + region.top = double.parse(entry[2]); + case 'size': + region.width = double.parse(entry[1]); + region.height = double.parse(entry[2]); + case 'bounds': + region.left = double.parse(entry[1]); + region.top = double.parse(entry[2]); + region.width = double.parse(entry[3]); + region.height = double.parse(entry[4]); + case 'offset': + region.offsetX = double.parse(entry[1]); + region.offsetY = double.parse(entry[2]); + case 'orig': + region.originalWidth = double.parse(entry[1]); + region.originalHeight = double.parse(entry[2]); + case 'offsets': + region.offsetX = double.parse(entry[1]); + region.offsetY = double.parse(entry[2]); + region.originalWidth = double.parse(entry[3]); + region.originalHeight = double.parse(entry[4]); + case 'rotate': + final value = entry[1]; + if (value == 'true') { + region.degrees = 90; + } else if (value == 'false') { + region.degrees = 0; + } else { + region.degrees = int.parse(value); + } + region.rotate = region.degrees == 90; + case 'index': + region.index = int.parse(entry[1]); + if (region.index != -1) { + hasIndexes = true; + } + } + } + if (region.originalWidth == 0 && region.originalHeight == 0) { + region.originalWidth = region.width; + region.originalHeight = region.height; + } + regions.add(region); + } + } + } + if (hasIndexes) { + regions.sort((region1, region2) { + var i1 = region1.index; + if (i1 == -1) { + i1 = double.maxFinite.toInt(); + } + var i2 = region2.index; + if (i2 == -1) { + i2 = double.maxFinite.toInt(); + } + return i1 - i2; + }); + } + return this; + } + + ({int count, List entry}) _readEntry(String inputLine) { + final line = inputLine.trim(); + if (line.isEmpty) { + return (count: 0, entry: []); + } + final colonIndex = line.indexOf(':'); + if (colonIndex == -1) { + return (count: 0, entry: []); + } + final entry = []; + entry.add(line.substring(0, colonIndex).trim()); + for (var i = 1, lastMatch = colonIndex + 1;; i++) { + final commaIndex = line.indexOf(',', lastMatch); + if (commaIndex == -1) { + entry.add(line.substring(lastMatch).trim()); + return (count: i, entry: entry); + } + entry.add(line.substring(lastMatch, commaIndex).trim()); + lastMatch = commaIndex + 1; + if (i == 4) { + return (count: 4, entry: entry); + } + } + } +} + +extension _IteratorExtension on Iterator { + String? moveNextAndGet() { + if (moveNext()) { + return current; + } + return null; + } +} diff --git a/packages/flame_texturepacker/lib/flame_texturepacker.dart b/packages/flame_texturepacker/lib/flame_texturepacker.dart new file mode 100644 index 0000000000..9bc8566b78 --- /dev/null +++ b/packages/flame_texturepacker/lib/flame_texturepacker.dart @@ -0,0 +1,75 @@ +library flame_texturepacker; + +import 'dart:convert'; + +import 'package:flame/extensions.dart'; +import 'package:flame/flame.dart'; +import 'package:flame/game.dart'; +import 'package:flame/sprite.dart'; +import 'package:flame_texturepacker/atlas/texture_packer_atlas.dart'; + +export 'package:flame_texturepacker/atlas/model/texture_packer_sprite.dart'; + +extension TexturepackerLoader on Game { + /// Loads the specified pack file, using the parent directory of the pack file + /// to find the page images. + Future fromAtlas(String assetsPath) async => + TexturePackerAtlas().load(assetsPath); + + @Deprecated('Please use fromAtlas() and files with extension .atlas') + Future> fromJSONAtlas(String imagePath, String dataPath) async { + final jsonFrames = await _loadJsonFrames(dataPath); + final image = await Flame.images.load(imagePath); + + final sprites = jsonFrames.values.map((value) { + return _createSprite(value as Map, image); + }); + + return sprites.toList(); + } + + @Deprecated('Please use fromAtlas() and files with extension .atlas') + Future> fromJSONAtlasAsMap( + String imagePath, + String dataPath, + ) async { + final jsonFrames = await _loadJsonFrames(dataPath); + final image = await Flame.images.load(imagePath); + final map = {}; + + jsonFrames.forEach((filename, value) { + final id = _filenameWithoutExtension(filename); + map[id] = _createSprite(value as Map, image); + }); + + return map; + } + + String _filenameWithoutExtension(String filename) { + if (!filename.contains('.')) { + return filename; + } else { + return filename.substring(0, filename.lastIndexOf('.')); + } + } + + Future> _loadJsonFrames(String dataPath) async { + final content = await Flame.assets.readFile(dataPath); + final json = jsonDecode(content) as Map; + return json['frames'] as Map; + } + + Sprite _createSprite(Map value, Image image) { + final frameData = value['frame'] as Map; + final x = frameData['x'] as int; + final y = frameData['y'] as int; + final width = frameData['w'] as int; + final height = frameData['h'] as int; + + return Sprite( + image, + srcPosition: Vector2(x.toDouble(), y.toDouble()), + srcSize: Vector2(width.toDouble(), height.toDouble()), + ); + } +} diff --git a/packages/flame_texturepacker/pubspec.yaml b/packages/flame_texturepacker/pubspec.yaml new file mode 100644 index 0000000000..57ba00e53d --- /dev/null +++ b/packages/flame_texturepacker/pubspec.yaml @@ -0,0 +1,23 @@ +name: flame_texturepacker +description: A simple plugin for the Flame Engine to import spritesheets generated by the TexturePacker tool. +version: 2.1.0 +homepage: https://github.com/flame-engine/flame/tree/main/packages/flame_texturepacker +funding: + - https://opencollective.com/blue-fire + - https://github.com/sponsors/bluefireteam + - https://patreon.com/bluefireoss + +environment: + sdk: ">=3.0.0 <4.0.0" + flutter: ">=3.13.0" + +dependencies: + collection: ^1.17.1 + flame: ^1.14.0 + flutter: + sdk: flutter + +dev_dependencies: + flame_lint: ^1.1.2 + flutter_test: + sdk: flutter From 74a6fdae3a0b4a7cb2afb1c8a160ae97db1601c6 Mon Sep 17 00:00:00 2001 From: Lukas Klingsbo Date: Sun, 21 Jan 2024 11:48:59 +0100 Subject: [PATCH 02/17] Add missing words to dictionary --- .github/.cspell/gamedev_dictionary.txt | 1 + .github/.cspell/people_usernames.txt | 1 + .github/.cspell/words_dictionary.txt | 1 + 3 files changed, 3 insertions(+) diff --git a/.github/.cspell/gamedev_dictionary.txt b/.github/.cspell/gamedev_dictionary.txt index 642d8737ef..9ed8b2856b 100644 --- a/.github/.cspell/gamedev_dictionary.txt +++ b/.github/.cspell/gamedev_dictionary.txt @@ -58,6 +58,7 @@ sublist # any sub-set of elements of a given list sublists # plural of sublist subrange # a range entirely contained on a given range SVGs # plural of SVG +texturepacker # a packed spritesheet format tileset # image with a collection of tiles. in games, tiles are small square sprites laid out in a grid to form the game map tilesets # plural of tileset tweening # the process of tween diff --git a/.github/.cspell/people_usernames.txt b/.github/.cspell/people_usernames.txt index 8ad92a409f..0a5c691d81 100644 --- a/.github/.cspell/people_usernames.txt +++ b/.github/.cspell/people_usernames.txt @@ -4,6 +4,7 @@ bluefireteam # github.com/bluefireteam erayzesen # erayzesen.itch.io erickzanardo # github.com/erickzanardo feroult # github.com/feroult +fröber # github.com/Brixto Klingsbo # github.com/spydon luanpotter # github.com/luanpotter Lukas # github.com/spydon diff --git a/.github/.cspell/words_dictionary.txt b/.github/.cspell/words_dictionary.txt index 35bff44235..6a2e1dbe39 100644 --- a/.github/.cspell/words_dictionary.txt +++ b/.github/.cspell/words_dictionary.txt @@ -34,3 +34,4 @@ tappable tappables toolset underutilize +unrotated From ee8ea8ee17ad42db61f4079269eff002dc87f846 Mon Sep 17 00:00:00 2001 From: Lukas Klingsbo Date: Sun, 21 Jan 2024 11:49:58 +0100 Subject: [PATCH 03/17] fix formatting --- packages/flame_texturepacker/lib/atlas/model/page.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/flame_texturepacker/lib/atlas/model/page.dart b/packages/flame_texturepacker/lib/atlas/model/page.dart index baa6308d07..11db65bb25 100644 --- a/packages/flame_texturepacker/lib/atlas/model/page.dart +++ b/packages/flame_texturepacker/lib/atlas/model/page.dart @@ -9,4 +9,4 @@ class Page { late String minFilter; late String magFilter; late String repeat; -} \ No newline at end of file +} From 54689a8723d7337b75147df02655ad5481bf20ef Mon Sep 17 00:00:00 2001 From: Lukas Klingsbo Date: Sun, 21 Jan 2024 19:35:58 +0100 Subject: [PATCH 04/17] Fix according to comments --- .github/.cspell/flame_dictionary.txt | 1 + .github/.cspell/gamedev_dictionary.txt | 1 - packages/flame_texturepacker/README.md | 10 +- .../{FlameAtlasMap.atlas => atlas_map.atlas} | 6 +- .../{FlameAtlasMap.png => sprite_sheet1.png} | Bin .../{FlameAtlasMap2.png => sprite_sheet2.png} | Bin .../{FlameAtlasMap3.png => sprite_sheet3.png} | Bin .../flame_texturepacker/example/lib/main.dart | 2 +- .../atlas/model/texture_packer_sprite.dart | 4 + .../lib/atlas/texture_packer_atlas.dart | 310 +++++++++--------- .../lib/flame_texturepacker.dart | 64 +--- 11 files changed, 167 insertions(+), 231 deletions(-) rename packages/flame_texturepacker/example/assets/{FlameAtlasMap.atlas => atlas_map.atlas} (96%) rename packages/flame_texturepacker/example/assets/{FlameAtlasMap.png => sprite_sheet1.png} (100%) rename packages/flame_texturepacker/example/assets/{FlameAtlasMap2.png => sprite_sheet2.png} (100%) rename packages/flame_texturepacker/example/assets/{FlameAtlasMap3.png => sprite_sheet3.png} (100%) diff --git a/.github/.cspell/flame_dictionary.txt b/.github/.cspell/flame_dictionary.txt index 49b94f2045..dd5097f531 100644 --- a/.github/.cspell/flame_dictionary.txt +++ b/.github/.cspell/flame_dictionary.txt @@ -20,6 +20,7 @@ spineboy # Name of a famous character used as an example for Spine https://en.es spineboys # Plural of spineboy Spritecow # A handy tool for locating sprites within a spritesheet http://www.spritecow.com/ Supabase # Supabase, one of our sponsors https://supabase.com/ +texturepacker # a packed spritesheet format Tilemap # What tile maps are called within Tiled vantablack # brand name for a famous super-black ink known as the darkest ever made Weasley # Ron Weasley, a character from the book Harry Potter diff --git a/.github/.cspell/gamedev_dictionary.txt b/.github/.cspell/gamedev_dictionary.txt index 9ed8b2856b..642d8737ef 100644 --- a/.github/.cspell/gamedev_dictionary.txt +++ b/.github/.cspell/gamedev_dictionary.txt @@ -58,7 +58,6 @@ sublist # any sub-set of elements of a given list sublists # plural of sublist subrange # a range entirely contained on a given range SVGs # plural of SVG -texturepacker # a packed spritesheet format tileset # image with a collection of tiles. in games, tiles are small square sprites laid out in a grid to form the game map tilesets # plural of tileset tweening # the process of tween diff --git a/packages/flame_texturepacker/README.md b/packages/flame_texturepacker/README.md index 1f651bbb2e..0b8c9d6f16 100644 --- a/packages/flame_texturepacker/README.md +++ b/packages/flame_texturepacker/README.md @@ -33,13 +33,13 @@ flutter pub add flame_texturepacker ## Usage -Drop generated atlas file and sprite sheet images into the `assets/` and link the files in your +Drop generated atlas file and sprite sheet images into the `assets/` and link the files in your `pubspec.yaml` file: ```yaml assets: - - assets/spriteSheet.atlas - - assets/spriteSheet.png + - assets/atlas_map.atlas + - assets/sprite_sheet1.png ``` Import the plugin like this: @@ -49,7 +49,7 @@ Import the plugin like this: Load the TextureAtlas passing the path of the sprite sheet atlas file: ```Dart -final atlas = await fromAtlas('FlameAtlasMap.atlas'); +final atlas = await fromAtlas('atlas_map.atlas'); ``` Get a list of sprites ordered by their index, you can use the list to generate an animation: @@ -79,7 +79,7 @@ Note: Sprites used in this example can be found OpenGameArt [here][4]. ## Credits -Big thanks to [Jonas Fröber][5] for the original implementation! +Thanks to [Jonas Fröber][5] for the original implementation. [1]: https://www.codeandweb.com/texturepacker 'Code & Web Texture Packer' [2]: https://github.com/crashinvaders/gdx-texture-packer-gui 'Gdx Texture Packer' diff --git a/packages/flame_texturepacker/example/assets/FlameAtlasMap.atlas b/packages/flame_texturepacker/example/assets/atlas_map.atlas similarity index 96% rename from packages/flame_texturepacker/example/assets/FlameAtlasMap.atlas rename to packages/flame_texturepacker/example/assets/atlas_map.atlas index cd0c10ce80..360600a142 100644 --- a/packages/flame_texturepacker/example/assets/FlameAtlasMap.atlas +++ b/packages/flame_texturepacker/example/assets/atlas_map.atlas @@ -1,5 +1,5 @@ -FlameAtlasMap.png +sprite_sheet1.png size: 512, 512 format: RGBA8888 filter: Nearest, Nearest @@ -33,7 +33,7 @@ robot_walk offset: 0, 0 index: 2 -FlameAtlasMap2.png +sprite_sheet2.png size: 512, 512 format: RGBA8888 filter: Nearest, Nearest @@ -67,7 +67,7 @@ robot_walk offset: 0, 0 index: 4 -FlameAtlasMap3.png +sprite_sheet3.png size: 512, 512 format: RGBA8888 filter: Nearest, Nearest diff --git a/packages/flame_texturepacker/example/assets/FlameAtlasMap.png b/packages/flame_texturepacker/example/assets/sprite_sheet1.png similarity index 100% rename from packages/flame_texturepacker/example/assets/FlameAtlasMap.png rename to packages/flame_texturepacker/example/assets/sprite_sheet1.png diff --git a/packages/flame_texturepacker/example/assets/FlameAtlasMap2.png b/packages/flame_texturepacker/example/assets/sprite_sheet2.png similarity index 100% rename from packages/flame_texturepacker/example/assets/FlameAtlasMap2.png rename to packages/flame_texturepacker/example/assets/sprite_sheet2.png diff --git a/packages/flame_texturepacker/example/assets/FlameAtlasMap3.png b/packages/flame_texturepacker/example/assets/sprite_sheet3.png similarity index 100% rename from packages/flame_texturepacker/example/assets/FlameAtlasMap3.png rename to packages/flame_texturepacker/example/assets/sprite_sheet3.png diff --git a/packages/flame_texturepacker/example/lib/main.dart b/packages/flame_texturepacker/example/lib/main.dart index a63d7d2f10..3fac2802ff 100644 --- a/packages/flame_texturepacker/example/lib/main.dart +++ b/packages/flame_texturepacker/example/lib/main.dart @@ -18,7 +18,7 @@ class MyGame extends FlameGame { super.onLoad(); // Load the atlasMap. - final atlas = await fromAtlas('FlameAtlasMap.atlas'); + final atlas = await fromAtlas('atlas_map.atlas'); // Get a list of sprites ordered by their index final walkingSprites = atlas.findSpritesByName('robot_walk'); diff --git a/packages/flame_texturepacker/lib/atlas/model/texture_packer_sprite.dart b/packages/flame_texturepacker/lib/atlas/model/texture_packer_sprite.dart index 253105e966..78bd5906d6 100644 --- a/packages/flame_texturepacker/lib/atlas/model/texture_packer_sprite.dart +++ b/packages/flame_texturepacker/lib/atlas/model/texture_packer_sprite.dart @@ -1,3 +1,4 @@ +import 'dart:math'; import 'dart:ui'; import 'package:flame/components.dart'; @@ -78,6 +79,9 @@ class TexturePackerSprite extends Sprite { /// packing polygons). final int degrees; + /// The [degrees] field (angle) represented as radians. + double get angle => degrees * (pi / 180); + late final Decorator decorator; final Transform2D transform = Transform2D(); diff --git a/packages/flame_texturepacker/lib/atlas/texture_packer_atlas.dart b/packages/flame_texturepacker/lib/atlas/texture_packer_atlas.dart index 81f20b6d5e..8b98519efa 100644 --- a/packages/flame_texturepacker/lib/atlas/texture_packer_atlas.dart +++ b/packages/flame_texturepacker/lib/atlas/texture_packer_atlas.dart @@ -12,24 +12,34 @@ import 'package:flame_texturepacker/atlas/model/texture_packer_sprite.dart'; final _images = Images(prefix: 'assets/'); class TexturePackerAtlas { - final sprites = []; + /// The sprites contained in this atlas. + final List sprites; + + TexturePackerAtlas(this.sprites); + + /// Loads all the sprites from the atlas that resides on the [path] and + /// returns a new [TexturePackerAtlas]. + static Future load(String path) async { + final atlasData = await _load(path); + return TexturePackerAtlas( + atlasData.regions.map(TexturePackerSprite.new).toList(), + ); + } /// Returns the first region found with the specified name. This method uses /// string comparison to find the region, so the result should be cached /// rather than calling this method multiple times. - TexturePackerSprite? findSpriteByName(String name) => - sprites.firstWhereOrNull((e) => e.name == name); + TexturePackerSprite? findSpriteByName(String name) { + return sprites.firstWhereOrNull((e) => e.name == name); + } /// Returns the first region found with the specified name and index. /// This method uses string comparison to find the region, so the result /// should be cached rather than calling this method multiple times. TexturePackerSprite? findSpriteByNameIndex(String name, int index) { - for (final sprite in sprites) { - if (sprite.name == name && sprite.index == index) { - return sprite; - } - } - return null; + return sprites.firstWhereOrNull( + (sprite) => sprite.name == name && sprite.index == index, + ); } /// Returns all regions with the specified name, ordered by smallest to @@ -37,183 +47,167 @@ class TexturePackerAtlas { /// the result should be cached rather than calling this method multiple /// times. List findSpritesByName(String name) { - final matched = []; - for (final sprite in sprites) { - if (sprite.name == name) { - matched.add(sprite); - } - } - return matched; - } - - Future load(String path) async { - final atlasData = await _TextureAtlasData()._load(path); - - for (final region in atlasData.regions) { - sprites.add(TexturePackerSprite(region)); - } - return this; + return sprites.where((sprite) => sprite.name == name).toList(); } } -class _TextureAtlasData { +Future<_TextureAtlasData> _load(String path) async { final pages = []; final regions = []; + final fileAsString = await Flame.assets.readFile(path); - Future<_TextureAtlasData> _load(String path) async { - final fileAsString = await Flame.assets.readFile(path); + final iterator = LineSplitter.split(fileAsString).iterator; + var line = iterator.moveNextAndGet(); + var hasIndexes = false; + while (true) { + if (line == null) { + break; + } + if (line.isEmpty) { + line = iterator.moveNextAndGet(); + } - final iterator = LineSplitter.split(fileAsString).iterator; - var line = iterator.moveNextAndGet(); - var hasIndexes = false; + Page? page; while (true) { if (line == null) { break; } if (line.isEmpty) { + page = null; line = iterator.moveNextAndGet(); - } - - Page? page; - while (true) { - if (line == null) { - break; - } - if (line.isEmpty) { - page = null; + } else if (page == null) { + page = Page(); + page.textureFile = line; + final parentPath = (path.split('/')..removeLast()).join('/'); + final texturePath = '$parentPath/$line'; + page.texture = await _images.load(texturePath); + while (true) { line = iterator.moveNextAndGet(); - } else if (page == null) { - page = Page(); - page.textureFile = line; - final parentPath = (path.split('/')..removeLast()).join('/'); - final texturePath = '$parentPath/$line'; - page.texture = await _images.load(texturePath); - while (true) { - line = iterator.moveNextAndGet(); - if (line == null) { - break; - } - final (:count, :entry) = _readEntry(line); - if (count == 0) { - break; - } - switch (entry[0]) { - case 'size': - page.width = int.parse(entry[1]); - page.height = int.parse(entry[2]); - case 'filter': - page.minFilter = entry[1]; - page.magFilter = entry[2]; - case 'format': - page.format = entry[1]; - case 'repeat': - page.repeat = entry[1]; - } + if (line == null) { + break; } - pages.add(page); - } else { - final region = Region(); - region.page = page; - region.name = line.trim(); - while (true) { - line = iterator.moveNextAndGet(); - if (line == null) { - break; - } - final (:count, :entry) = _readEntry(line); - if (count == 0) { - break; - } - switch (entry[0]) { - case 'xy': - region.left = double.parse(entry[1]); - region.top = double.parse(entry[2]); - case 'size': - region.width = double.parse(entry[1]); - region.height = double.parse(entry[2]); - case 'bounds': - region.left = double.parse(entry[1]); - region.top = double.parse(entry[2]); - region.width = double.parse(entry[3]); - region.height = double.parse(entry[4]); - case 'offset': - region.offsetX = double.parse(entry[1]); - region.offsetY = double.parse(entry[2]); - case 'orig': - region.originalWidth = double.parse(entry[1]); - region.originalHeight = double.parse(entry[2]); - case 'offsets': - region.offsetX = double.parse(entry[1]); - region.offsetY = double.parse(entry[2]); - region.originalWidth = double.parse(entry[3]); - region.originalHeight = double.parse(entry[4]); - case 'rotate': - final value = entry[1]; - if (value == 'true') { - region.degrees = 90; - } else if (value == 'false') { - region.degrees = 0; - } else { - region.degrees = int.parse(value); - } - region.rotate = region.degrees == 90; - case 'index': - region.index = int.parse(entry[1]); - if (region.index != -1) { - hasIndexes = true; - } - } + final (:count, :entry) = _readEntry(line); + if (count == 0) { + break; } - if (region.originalWidth == 0 && region.originalHeight == 0) { - region.originalWidth = region.width; - region.originalHeight = region.height; + switch (entry[0]) { + case 'size': + page.width = int.parse(entry[1]); + page.height = int.parse(entry[2]); + case 'filter': + page.minFilter = entry[1]; + page.magFilter = entry[2]; + case 'format': + page.format = entry[1]; + case 'repeat': + page.repeat = entry[1]; } - regions.add(region); } - } - } - if (hasIndexes) { - regions.sort((region1, region2) { - var i1 = region1.index; - if (i1 == -1) { - i1 = double.maxFinite.toInt(); + pages.add(page); + } else { + final region = Region(); + region.page = page; + region.name = line.trim(); + while (true) { + line = iterator.moveNextAndGet(); + if (line == null) { + break; + } + final (:count, :entry) = _readEntry(line); + if (count == 0) { + break; + } + switch (entry[0]) { + case 'xy': + region.left = double.parse(entry[1]); + region.top = double.parse(entry[2]); + case 'size': + region.width = double.parse(entry[1]); + region.height = double.parse(entry[2]); + case 'bounds': + region.left = double.parse(entry[1]); + region.top = double.parse(entry[2]); + region.width = double.parse(entry[3]); + region.height = double.parse(entry[4]); + case 'offset': + region.offsetX = double.parse(entry[1]); + region.offsetY = double.parse(entry[2]); + case 'orig': + region.originalWidth = double.parse(entry[1]); + region.originalHeight = double.parse(entry[2]); + case 'offsets': + region.offsetX = double.parse(entry[1]); + region.offsetY = double.parse(entry[2]); + region.originalWidth = double.parse(entry[3]); + region.originalHeight = double.parse(entry[4]); + case 'rotate': + final value = entry[1]; + if (value == 'true') { + region.degrees = 90; + } else if (value == 'false') { + region.degrees = 0; + } else { + region.degrees = int.parse(value); + } + region.rotate = region.degrees == 90; + case 'index': + region.index = int.parse(entry[1]); + if (region.index != -1) { + hasIndexes = true; + } + } } - var i2 = region2.index; - if (i2 == -1) { - i2 = double.maxFinite.toInt(); + if (region.originalWidth == 0 && region.originalHeight == 0) { + region.originalWidth = region.width; + region.originalHeight = region.height; } - return i1 - i2; - }); + regions.add(region); + } } - return this; } - - ({int count, List entry}) _readEntry(String inputLine) { - final line = inputLine.trim(); - if (line.isEmpty) { - return (count: 0, entry: []); - } - final colonIndex = line.indexOf(':'); - if (colonIndex == -1) { - return (count: 0, entry: []); - } - final entry = []; - entry.add(line.substring(0, colonIndex).trim()); - for (var i = 1, lastMatch = colonIndex + 1;; i++) { - final commaIndex = line.indexOf(',', lastMatch); - if (commaIndex == -1) { - entry.add(line.substring(lastMatch).trim()); - return (count: i, entry: entry); + if (hasIndexes) { + regions.sort((region1, region2) { + var i1 = region1.index; + if (i1 == -1) { + i1 = double.maxFinite.toInt(); } - entry.add(line.substring(lastMatch, commaIndex).trim()); - lastMatch = commaIndex + 1; - if (i == 4) { - return (count: 4, entry: entry); + var i2 = region2.index; + if (i2 == -1) { + i2 = double.maxFinite.toInt(); } + return i1 - i2; + }); + } + return (pages: pages, regions: regions); +} + +({int count, List entry}) _readEntry(String inputLine) { + final line = inputLine.trim(); + if (line.isEmpty) { + return (count: 0, entry: []); + } + final colonIndex = line.indexOf(':'); + if (colonIndex == -1) { + return (count: 0, entry: []); + } + final entry = []; + entry.add(line.substring(0, colonIndex).trim()); + for (var i = 1, lastMatch = colonIndex + 1;; i++) { + final commaIndex = line.indexOf(',', lastMatch); + if (commaIndex == -1) { + entry.add(line.substring(lastMatch).trim()); + return (count: i, entry: entry); + } + entry.add(line.substring(lastMatch, commaIndex).trim()); + lastMatch = commaIndex + 1; + if (i == 4) { + return (count: 4, entry: entry); } } } +typedef _TextureAtlasData = ({List pages, List regions}); + extension _IteratorExtension on Iterator { String? moveNextAndGet() { if (moveNext()) { diff --git a/packages/flame_texturepacker/lib/flame_texturepacker.dart b/packages/flame_texturepacker/lib/flame_texturepacker.dart index 9bc8566b78..bc222bcfd7 100644 --- a/packages/flame_texturepacker/lib/flame_texturepacker.dart +++ b/packages/flame_texturepacker/lib/flame_texturepacker.dart @@ -1,11 +1,6 @@ library flame_texturepacker; -import 'dart:convert'; - -import 'package:flame/extensions.dart'; -import 'package:flame/flame.dart'; import 'package:flame/game.dart'; -import 'package:flame/sprite.dart'; import 'package:flame_texturepacker/atlas/texture_packer_atlas.dart'; export 'package:flame_texturepacker/atlas/model/texture_packer_sprite.dart'; @@ -14,62 +9,5 @@ extension TexturepackerLoader on Game { /// Loads the specified pack file, using the parent directory of the pack file /// to find the page images. Future fromAtlas(String assetsPath) async => - TexturePackerAtlas().load(assetsPath); - - @Deprecated('Please use fromAtlas() and files with extension .atlas') - Future> fromJSONAtlas(String imagePath, String dataPath) async { - final jsonFrames = await _loadJsonFrames(dataPath); - final image = await Flame.images.load(imagePath); - - final sprites = jsonFrames.values.map((value) { - return _createSprite(value as Map, image); - }); - - return sprites.toList(); - } - - @Deprecated('Please use fromAtlas() and files with extension .atlas') - Future> fromJSONAtlasAsMap( - String imagePath, - String dataPath, - ) async { - final jsonFrames = await _loadJsonFrames(dataPath); - final image = await Flame.images.load(imagePath); - final map = {}; - - jsonFrames.forEach((filename, value) { - final id = _filenameWithoutExtension(filename); - map[id] = _createSprite(value as Map, image); - }); - - return map; - } - - String _filenameWithoutExtension(String filename) { - if (!filename.contains('.')) { - return filename; - } else { - return filename.substring(0, filename.lastIndexOf('.')); - } - } - - Future> _loadJsonFrames(String dataPath) async { - final content = await Flame.assets.readFile(dataPath); - final json = jsonDecode(content) as Map; - return json['frames'] as Map; - } - - Sprite _createSprite(Map value, Image image) { - final frameData = value['frame'] as Map; - final x = frameData['x'] as int; - final y = frameData['y'] as int; - final width = frameData['w'] as int; - final height = frameData['h'] as int; - - return Sprite( - image, - srcPosition: Vector2(x.toDouble(), y.toDouble()), - srcSize: Vector2(width.toDouble(), height.toDouble()), - ); - } + TexturePackerAtlas.load(assetsPath); } From 2b56a929341f12de3a97e8d9c18bd5c23bdccb07 Mon Sep 17 00:00:00 2001 From: Grayson Erhard Date: Mon, 22 Jan 2024 11:53:49 -0700 Subject: [PATCH 05/17] added functionality to build texture atlas from images existing in a device's storage --- .../lib/atlas/texture_packer_atlas.dart | 87 +++++++++++++++++-- .../lib/flame_texturepacker.dart | 11 ++- 2 files changed, 88 insertions(+), 10 deletions(-) diff --git a/packages/flame_texturepacker/lib/atlas/texture_packer_atlas.dart b/packages/flame_texturepacker/lib/atlas/texture_packer_atlas.dart index 8b98519efa..15b661730a 100644 --- a/packages/flame_texturepacker/lib/atlas/texture_packer_atlas.dart +++ b/packages/flame_texturepacker/lib/atlas/texture_packer_atlas.dart @@ -1,6 +1,7 @@ library flame_texturepacker; import 'dart:convert'; +import 'dart:io'; import 'package:collection/collection.dart'; import 'package:flame/cache.dart'; @@ -8,6 +9,7 @@ import 'package:flame/flame.dart'; import 'package:flame_texturepacker/atlas/model/page.dart'; import 'package:flame_texturepacker/atlas/model/region.dart'; import 'package:flame_texturepacker/atlas/model/texture_packer_sprite.dart'; +import 'package:flutter/painting.dart'; final _images = Images(prefix: 'assets/'); @@ -19,8 +21,20 @@ class TexturePackerAtlas { /// Loads all the sprites from the atlas that resides on the [path] and /// returns a new [TexturePackerAtlas]. - static Future load(String path) async { - final atlasData = await _load(path); + /// If [fromStorage] is true, the atlas will be loaded from the device's + /// storage instead of the assets folder. + static Future load( + String path, { + bool fromStorage = false, + }) async { + late final _TextureAtlasData atlasData; + + if (fromStorage) { + atlasData = await _fromStorage(path); + } else { + atlasData = await _fromAssets(path); + } + return TexturePackerAtlas( atlasData.regions.map(TexturePackerSprite.new).toList(), ); @@ -51,7 +65,35 @@ class TexturePackerAtlas { } } -Future<_TextureAtlasData> _load(String path) async { +/// Loads images from the assets folder. +/// Uses the [path] to find the image directory. +Future<_TextureAtlasData> _fromAssets(String path) async { + try { + return await _parse(path, fromStorage: false); + } on Exception catch (e) { + throw Exception('Error loading from assets: $e'); + } +} + +/// Loads images from the device's storage. +/// Uses the [path] to find the image directory. +Future<_TextureAtlasData> _fromStorage(String path) async { + try { + return await _parse(path, fromStorage: true); + } on Exception catch (e) { + throw Exception('Error loading from storage: $e'); + } +} + +/// Parses the atlas file and loads the images. +/// Uses the [path] to find the image directory. +/// Atlas will be loaded from the device's storage if [fromStorage] is true. +/// Otherwise, it will be loaded from the assets folder. +/// Returns a [_TextureAtlasData] containing the pages and regions. +Future<_TextureAtlasData> _parse( + String path, { + required bool fromStorage, +}) async { final pages = []; final regions = []; final fileAsString = await Flame.assets.readFile(path); @@ -59,19 +101,23 @@ Future<_TextureAtlasData> _load(String path) async { final iterator = LineSplitter.split(fileAsString).iterator; var line = iterator.moveNextAndGet(); var hasIndexes = false; + while (true) { if (line == null) { break; } + if (line.isEmpty) { line = iterator.moveNextAndGet(); } Page? page; + while (true) { if (line == null) { break; } + if (line.isEmpty) { page = null; line = iterator.moveNextAndGet(); @@ -80,7 +126,21 @@ Future<_TextureAtlasData> _load(String path) async { page.textureFile = line; final parentPath = (path.split('/')..removeLast()).join('/'); final texturePath = '$parentPath/$line'; - page.texture = await _images.load(texturePath); + + if (fromStorage) { + try { + final textureFile = File(texturePath); + final bytes = await textureFile.readAsBytes(); + final decodedBytes = await decodeImageFromList(bytes); + Flame.images.add(texturePath, decodedBytes); + page.texture = Flame.images.fromCache(texturePath); + } on Exception catch (e) { + throw Exception('Could not add storage file to Flame cache. $e'); + } + } else { + page.texture = await _images.load(texturePath); + } + while (true) { line = iterator.moveNextAndGet(); if (line == null) { @@ -142,6 +202,7 @@ Future<_TextureAtlasData> _load(String path) async { region.originalHeight = double.parse(entry[4]); case 'rotate': final value = entry[1]; + if (value == 'true') { region.degrees = 90; } else if (value == 'false') { @@ -149,9 +210,11 @@ Future<_TextureAtlasData> _load(String path) async { } else { region.degrees = int.parse(value); } + region.rotate = region.degrees == 90; case 'index': region.index = int.parse(entry[1]); + if (region.index != -1) { hasIndexes = true; } @@ -161,10 +224,12 @@ Future<_TextureAtlasData> _load(String path) async { region.originalWidth = region.width; region.originalHeight = region.height; } + regions.add(region); } } } + if (hasIndexes) { regions.sort((region1, region2) { var i1 = region1.index; @@ -178,28 +243,37 @@ Future<_TextureAtlasData> _load(String path) async { return i1 - i2; }); } + return (pages: pages, regions: regions); } -({int count, List entry}) _readEntry(String inputLine) { - final line = inputLine.trim(); +({int count, List entry}) _readEntry(String line) { + line = line.trim(); + if (line.isEmpty) { return (count: 0, entry: []); } + final colonIndex = line.indexOf(':'); + if (colonIndex == -1) { return (count: 0, entry: []); } + final entry = []; entry.add(line.substring(0, colonIndex).trim()); + for (var i = 1, lastMatch = colonIndex + 1;; i++) { final commaIndex = line.indexOf(',', lastMatch); + if (commaIndex == -1) { entry.add(line.substring(lastMatch).trim()); return (count: i, entry: entry); } + entry.add(line.substring(lastMatch, commaIndex).trim()); lastMatch = commaIndex + 1; + if (i == 4) { return (count: 4, entry: entry); } @@ -213,6 +287,7 @@ extension _IteratorExtension on Iterator { if (moveNext()) { return current; } + return null; } } diff --git a/packages/flame_texturepacker/lib/flame_texturepacker.dart b/packages/flame_texturepacker/lib/flame_texturepacker.dart index bc222bcfd7..892348b374 100644 --- a/packages/flame_texturepacker/lib/flame_texturepacker.dart +++ b/packages/flame_texturepacker/lib/flame_texturepacker.dart @@ -6,8 +6,11 @@ import 'package:flame_texturepacker/atlas/texture_packer_atlas.dart'; export 'package:flame_texturepacker/atlas/model/texture_packer_sprite.dart'; extension TexturepackerLoader on Game { - /// Loads the specified pack file, using the parent directory of the pack file - /// to find the page images. - Future fromAtlas(String assetsPath) async => - TexturePackerAtlas.load(assetsPath); + /// Loads the specified pack file. + /// Uses the parent directory of the pack file to find the page images. + Future fromAtlas( + String assetsPath, { + bool fromStorage = false, + }) async => + TexturePackerAtlas.load(assetsPath, fromStorage: fromStorage); } From 6f922932bd796950774c31b868322af7a0fae738 Mon Sep 17 00:00:00 2001 From: Grayson Erhard Date: Mon, 22 Jan 2024 11:59:08 -0700 Subject: [PATCH 06/17] updated documentation --- packages/flame_texturepacker/CHANGELOG.md | 4 ++++ packages/flame_texturepacker/README.md | 10 ++++++++++ packages/flame_texturepacker/pubspec.yaml | 2 +- 3 files changed, 15 insertions(+), 1 deletion(-) diff --git a/packages/flame_texturepacker/CHANGELOG.md b/packages/flame_texturepacker/CHANGELOG.md index 5024477dae..bad056e7cc 100644 --- a/packages/flame_texturepacker/CHANGELOG.md +++ b/packages/flame_texturepacker/CHANGELOG.md @@ -1,3 +1,7 @@ +## 2.2.0 + +- Build atlas from assets or device storage + ## 2.1.0 - Load spritesheets as Map diff --git a/packages/flame_texturepacker/README.md b/packages/flame_texturepacker/README.md index 0b8c9d6f16..5c3bd0497b 100644 --- a/packages/flame_texturepacker/README.md +++ b/packages/flame_texturepacker/README.md @@ -33,6 +33,8 @@ flutter pub add flame_texturepacker ## Usage +### Asset Storage + Drop generated atlas file and sprite sheet images into the `assets/` and link the files in your `pubspec.yaml` file: @@ -52,6 +54,14 @@ Load the TextureAtlas passing the path of the sprite sheet atlas file: final atlas = await fromAtlas('atlas_map.atlas'); ``` +### File Storage + +If you are using file storage, grab your atlas file like this: + +```Dart +final atlas = await fromAtlas("${(await getApplicationDocumentsDirectory()).path}/FlamAtlasMap.atlas", fromStorage: true); +``` + Get a list of sprites ordered by their index, you can use the list to generate an animation: ```Dart diff --git a/packages/flame_texturepacker/pubspec.yaml b/packages/flame_texturepacker/pubspec.yaml index 57ba00e53d..0164edec92 100644 --- a/packages/flame_texturepacker/pubspec.yaml +++ b/packages/flame_texturepacker/pubspec.yaml @@ -1,6 +1,6 @@ name: flame_texturepacker description: A simple plugin for the Flame Engine to import spritesheets generated by the TexturePacker tool. -version: 2.1.0 +version: 2.2.0 homepage: https://github.com/flame-engine/flame/tree/main/packages/flame_texturepacker funding: - https://opencollective.com/blue-fire From 8126756a9f23f55242ff30f3ea84e1029880193a Mon Sep 17 00:00:00 2001 From: Grayson Erhard Date: Mon, 22 Jan 2024 12:44:02 -0700 Subject: [PATCH 07/17] added fromStorage condition in image parse method --- .../lib/atlas/texture_packer_atlas.dart | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/packages/flame_texturepacker/lib/atlas/texture_packer_atlas.dart b/packages/flame_texturepacker/lib/atlas/texture_packer_atlas.dart index 15b661730a..241651fed7 100644 --- a/packages/flame_texturepacker/lib/atlas/texture_packer_atlas.dart +++ b/packages/flame_texturepacker/lib/atlas/texture_packer_atlas.dart @@ -96,7 +96,12 @@ Future<_TextureAtlasData> _parse( }) async { final pages = []; final regions = []; - final fileAsString = await Flame.assets.readFile(path); + late final String fileAsString; + if (fromStorage) { + fileAsString = await File(path).readAsString(); + } else { + fileAsString = await Flame.assets.readFile(path); + } final iterator = LineSplitter.split(fileAsString).iterator; var line = iterator.moveNextAndGet(); From ca355e4230f414291db377c5a81c82cb9f959f16 Mon Sep 17 00:00:00 2001 From: Grayson Erhard Date: Mon, 22 Jan 2024 12:50:13 -0700 Subject: [PATCH 08/17] angles should conform to the value provided by the packer --- .../lib/atlas/model/texture_packer_sprite.dart | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/flame_texturepacker/lib/atlas/model/texture_packer_sprite.dart b/packages/flame_texturepacker/lib/atlas/model/texture_packer_sprite.dart index 78bd5906d6..19202cdeaf 100644 --- a/packages/flame_texturepacker/lib/atlas/model/texture_packer_sprite.dart +++ b/packages/flame_texturepacker/lib/atlas/model/texture_packer_sprite.dart @@ -32,7 +32,7 @@ class TexturePackerSprite extends Sprite { ) { decorator = Transform2DDecorator(transform); if (region.rotate) { - transform.angle = radians(90); + transform.angle = radians(region.degrees.toDouble()); } } @@ -80,7 +80,7 @@ class TexturePackerSprite extends Sprite { final int degrees; /// The [degrees] field (angle) represented as radians. - double get angle => degrees * (pi / 180); + double get angle => radians(degrees.toDouble()); late final Decorator decorator; final Transform2D transform = Transform2D(); From 9a109ecc2da806937985e4144b4e08f1cc48895c Mon Sep 17 00:00:00 2001 From: Grayson Erhard Date: Mon, 22 Jan 2024 13:21:16 -0700 Subject: [PATCH 09/17] added my contributor credit --- packages/flame_texturepacker/README.md | 3 ++- packages/flame_texturepacker/pubspec.yaml | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/packages/flame_texturepacker/README.md b/packages/flame_texturepacker/README.md index 5c3bd0497b..99b512ec31 100644 --- a/packages/flame_texturepacker/README.md +++ b/packages/flame_texturepacker/README.md @@ -89,11 +89,12 @@ Note: Sprites used in this example can be found OpenGameArt [here][4]. ## Credits -Thanks to [Jonas Fröber][5] for the original implementation. +Thanks to [Jonas Fröber][5] for the original implementation and [Gnarhard][6] for the feature to build the atlas file from a device's storage. [1]: https://www.codeandweb.com/texturepacker 'Code & Web Texture Packer' [2]: https://github.com/crashinvaders/gdx-texture-packer-gui 'Gdx Texture Packer' [3]: example/lib/main.dart 'Full working example' [4]: https://opengameart.org/content/toon-characters-1 'Robot sprite' [5]: https://github.com/Brixto +[6]: https://github.com/gnarhard diff --git a/packages/flame_texturepacker/pubspec.yaml b/packages/flame_texturepacker/pubspec.yaml index 0164edec92..75e71549c3 100644 --- a/packages/flame_texturepacker/pubspec.yaml +++ b/packages/flame_texturepacker/pubspec.yaml @@ -13,7 +13,7 @@ environment: dependencies: collection: ^1.17.1 - flame: ^1.14.0 + flame: ^1.19.0 flutter: sdk: flutter From 913b6563fccfd37b4b3dd0a88953b8a1b2f21f68 Mon Sep 17 00:00:00 2001 From: Grayson Erhard Date: Mon, 22 Jan 2024 13:57:50 -0700 Subject: [PATCH 10/17] Fix according to comments --- packages/flame_texturepacker/CHANGELOG.md | 4 ---- packages/flame_texturepacker/README.md | 2 +- .../lib/atlas/model/texture_packer_sprite.dart | 5 +++-- .../flame_texturepacker/lib/atlas/texture_packer_atlas.dart | 4 ++-- packages/flame_texturepacker/pubspec.yaml | 2 +- 5 files changed, 7 insertions(+), 10 deletions(-) diff --git a/packages/flame_texturepacker/CHANGELOG.md b/packages/flame_texturepacker/CHANGELOG.md index bad056e7cc..5024477dae 100644 --- a/packages/flame_texturepacker/CHANGELOG.md +++ b/packages/flame_texturepacker/CHANGELOG.md @@ -1,7 +1,3 @@ -## 2.2.0 - -- Build atlas from assets or device storage - ## 2.1.0 - Load spritesheets as Map diff --git a/packages/flame_texturepacker/README.md b/packages/flame_texturepacker/README.md index 99b512ec31..da1980877a 100644 --- a/packages/flame_texturepacker/README.md +++ b/packages/flame_texturepacker/README.md @@ -59,7 +59,7 @@ final atlas = await fromAtlas('atlas_map.atlas'); If you are using file storage, grab your atlas file like this: ```Dart -final atlas = await fromAtlas("${(await getApplicationDocumentsDirectory()).path}/FlamAtlasMap.atlas", fromStorage: true); +final atlas = await fromAtlas("${(await getApplicationDocumentsDirectory()).path}/atlas_map.atlas", fromStorage: true); ``` Get a list of sprites ordered by their index, you can use the list to generate an animation: diff --git a/packages/flame_texturepacker/lib/atlas/model/texture_packer_sprite.dart b/packages/flame_texturepacker/lib/atlas/model/texture_packer_sprite.dart index 19202cdeaf..047bc84a0f 100644 --- a/packages/flame_texturepacker/lib/atlas/model/texture_packer_sprite.dart +++ b/packages/flame_texturepacker/lib/atlas/model/texture_packer_sprite.dart @@ -1,4 +1,3 @@ -import 'dart:math'; import 'dart:ui'; import 'package:flame/components.dart'; @@ -32,7 +31,7 @@ class TexturePackerSprite extends Sprite { ) { decorator = Transform2DDecorator(transform); if (region.rotate) { - transform.angle = radians(region.degrees.toDouble()); + transform.angle = angle; } } @@ -118,6 +117,8 @@ class TexturePackerSprite extends Sprite { _tmpRenderPosition.y - (unrotatedAnchor.y * _tmpRenderSize.y), ); + _tmpRenderSize.setValues(tempSize.x, tempSize.y); + decorator.applyChain( (applyCanvas) => super.render( applyCanvas, diff --git a/packages/flame_texturepacker/lib/atlas/texture_packer_atlas.dart b/packages/flame_texturepacker/lib/atlas/texture_packer_atlas.dart index 241651fed7..f96f5f61d6 100644 --- a/packages/flame_texturepacker/lib/atlas/texture_packer_atlas.dart +++ b/packages/flame_texturepacker/lib/atlas/texture_packer_atlas.dart @@ -71,7 +71,7 @@ Future<_TextureAtlasData> _fromAssets(String path) async { try { return await _parse(path, fromStorage: false); } on Exception catch (e) { - throw Exception('Error loading from assets: $e'); + throw Exception('Error loading $path from assets: $e'); } } @@ -81,7 +81,7 @@ Future<_TextureAtlasData> _fromStorage(String path) async { try { return await _parse(path, fromStorage: true); } on Exception catch (e) { - throw Exception('Error loading from storage: $e'); + throw Exception('Error loading $path from storage: $e'); } } diff --git a/packages/flame_texturepacker/pubspec.yaml b/packages/flame_texturepacker/pubspec.yaml index 75e71549c3..179ca5208a 100644 --- a/packages/flame_texturepacker/pubspec.yaml +++ b/packages/flame_texturepacker/pubspec.yaml @@ -1,6 +1,6 @@ name: flame_texturepacker description: A simple plugin for the Flame Engine to import spritesheets generated by the TexturePacker tool. -version: 2.2.0 +version: 2.1.0 homepage: https://github.com/flame-engine/flame/tree/main/packages/flame_texturepacker funding: - https://opencollective.com/blue-fire From e6345e52f0a1842cc7d91b1599039d5e95b9c615 Mon Sep 17 00:00:00 2001 From: Grayson Erhard Date: Thu, 25 Jan 2024 17:59:02 -0700 Subject: [PATCH 11/17] removed broken image rotation code --- .../atlas/model/texture_packer_sprite.dart | 70 ++----------------- 1 file changed, 4 insertions(+), 66 deletions(-) diff --git a/packages/flame_texturepacker/lib/atlas/model/texture_packer_sprite.dart b/packages/flame_texturepacker/lib/atlas/model/texture_packer_sprite.dart index 047bc84a0f..d8d17aea85 100644 --- a/packages/flame_texturepacker/lib/atlas/model/texture_packer_sprite.dart +++ b/packages/flame_texturepacker/lib/atlas/model/texture_packer_sprite.dart @@ -1,8 +1,4 @@ -import 'dart:ui'; - import 'package:flame/components.dart'; -import 'package:flame/game.dart'; -import 'package:flame/rendering.dart'; import 'package:flame_texturepacker/atlas/model/region.dart'; /// {@template _texture_packer_sprite} @@ -15,8 +11,8 @@ class TexturePackerSprite extends Sprite { index = region.index, offsetX = region.offsetX, offsetY = region.offsetY, - packedWidth = region.rotate ? region.height : region.width, - packedHeight = region.rotate ? region.width : region.height, + packedWidth = region.width, + packedHeight = region.height, originalWidth = region.originalWidth, originalHeight = region.originalHeight, rotate = region.rotate, @@ -24,16 +20,8 @@ class TexturePackerSprite extends Sprite { super( region.page.texture, srcPosition: Vector2(region.left, region.top), - srcSize: Vector2( - region.rotate ? region.height : region.width, - region.rotate ? region.width : region.height, - ), - ) { - decorator = Transform2DDecorator(transform); - if (region.rotate) { - transform.angle = angle; - } - } + srcSize: Vector2(region.width, region.height), + ); /// The number at the end of the original image file name, or -1 if none. /// @@ -80,54 +68,4 @@ class TexturePackerSprite extends Sprite { /// The [degrees] field (angle) represented as radians. double get angle => radians(degrees.toDouble()); - - late final Decorator decorator; - final Transform2D transform = Transform2D(); - - // Used to avoid the creation of new Vector2 objects in render. - static final _tmpRenderPosition = Vector2.zero(); - static final _tmpRenderSize = Vector2.zero(); - - @override - void render( - Canvas canvas, { - Vector2? position, - Vector2? size, - Anchor anchor = Anchor.topLeft, - Paint? overridePaint, - }) { - if (position != null) { - _tmpRenderPosition.setFrom(position); - } else { - _tmpRenderPosition.setZero(); - } - - // If the sprite is rotated on the sprite sheet un-rotate it and adjust the - // size. - final unrotatedAnchor = rotate ? Anchor.bottomLeft : anchor; - - final tempSize = size ?? srcSize; - final tempWidth = rotate ? tempSize.y : tempSize.x; - final tempHeight = rotate ? tempSize.x : tempSize.y; - - _tmpRenderSize.setValues(tempWidth, tempHeight); - - _tmpRenderPosition.setValues( - _tmpRenderPosition.x - (unrotatedAnchor.x * _tmpRenderSize.x), - _tmpRenderPosition.y - (unrotatedAnchor.y * _tmpRenderSize.y), - ); - - _tmpRenderSize.setValues(tempSize.x, tempSize.y); - - decorator.applyChain( - (applyCanvas) => super.render( - applyCanvas, - position: _tmpRenderPosition, - size: _tmpRenderSize, - anchor: anchor, - overridePaint: overridePaint, - ), - canvas, - ); - } } From 31d3593b272eafa18dc9bec3c3d7cad5f254bc39 Mon Sep 17 00:00:00 2001 From: Grayson Erhard Date: Thu, 25 Jan 2024 17:59:19 -0700 Subject: [PATCH 12/17] fixed flame version --- packages/flame_texturepacker/pubspec.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/flame_texturepacker/pubspec.yaml b/packages/flame_texturepacker/pubspec.yaml index 179ca5208a..5ded67bbf2 100644 --- a/packages/flame_texturepacker/pubspec.yaml +++ b/packages/flame_texturepacker/pubspec.yaml @@ -13,7 +13,7 @@ environment: dependencies: collection: ^1.17.1 - flame: ^1.19.0 + flame: ^1.9.1 flutter: sdk: flutter From 28f9d7bf153c8fe859b7b026b161c0211753c416 Mon Sep 17 00:00:00 2001 From: Grayson Erhard Date: Thu, 25 Jan 2024 18:22:43 -0700 Subject: [PATCH 13/17] fix analyze issue --- .../lib/atlas/texture_packer_atlas.dart | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/packages/flame_texturepacker/lib/atlas/texture_packer_atlas.dart b/packages/flame_texturepacker/lib/atlas/texture_packer_atlas.dart index f96f5f61d6..dca2148599 100644 --- a/packages/flame_texturepacker/lib/atlas/texture_packer_atlas.dart +++ b/packages/flame_texturepacker/lib/atlas/texture_packer_atlas.dart @@ -253,30 +253,30 @@ Future<_TextureAtlasData> _parse( } ({int count, List entry}) _readEntry(String line) { - line = line.trim(); + final trimmedLine = line.trim(); - if (line.isEmpty) { + if (trimmedLine.isEmpty) { return (count: 0, entry: []); } - final colonIndex = line.indexOf(':'); + final colonIndex = trimmedLine.indexOf(':'); if (colonIndex == -1) { return (count: 0, entry: []); } final entry = []; - entry.add(line.substring(0, colonIndex).trim()); + entry.add(trimmedLine.substring(0, colonIndex).trim()); for (var i = 1, lastMatch = colonIndex + 1;; i++) { - final commaIndex = line.indexOf(',', lastMatch); + final commaIndex = trimmedLine.indexOf(',', lastMatch); if (commaIndex == -1) { - entry.add(line.substring(lastMatch).trim()); + entry.add(trimmedLine.substring(lastMatch).trim()); return (count: i, entry: entry); } - entry.add(line.substring(lastMatch, commaIndex).trim()); + entry.add(trimmedLine.substring(lastMatch, commaIndex).trim()); lastMatch = commaIndex + 1; if (i == 4) { From fec5d0affe5e20623e8fb98224662db854e8f6a3 Mon Sep 17 00:00:00 2001 From: Grayson Erhard Date: Thu, 25 Jan 2024 18:25:45 -0700 Subject: [PATCH 14/17] fix linting issues in readme --- packages/flame_texturepacker/README.md | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/packages/flame_texturepacker/README.md b/packages/flame_texturepacker/README.md index da1980877a..781d5eb009 100644 --- a/packages/flame_texturepacker/README.md +++ b/packages/flame_texturepacker/README.md @@ -33,6 +33,7 @@ flutter pub add flame_texturepacker ## Usage + ### Asset Storage Drop generated atlas file and sprite sheet images into the `assets/` and link the files in your @@ -54,12 +55,14 @@ Load the TextureAtlas passing the path of the sprite sheet atlas file: final atlas = await fromAtlas('atlas_map.atlas'); ``` + ### File Storage If you are using file storage, grab your atlas file like this: ```Dart -final atlas = await fromAtlas("${(await getApplicationDocumentsDirectory()).path}/atlas_map.atlas", fromStorage: true); +final documentsPath = (await getApplicationDocumentsDirectory()).path; +final atlas = await fromAtlas("${documentsPath}/atlas_map.atlas", fromStorage: true); ``` Get a list of sprites ordered by their index, you can use the list to generate an animation: @@ -89,7 +92,8 @@ Note: Sprites used in this example can be found OpenGameArt [here][4]. ## Credits -Thanks to [Jonas Fröber][5] for the original implementation and [Gnarhard][6] for the feature to build the atlas file from a device's storage. +Thanks to [Jonas Fröber][5] for the original implementation. +Thanks to [Gnarhard][6] for the feature to build the atlas file from a device's storage. [1]: https://www.codeandweb.com/texturepacker 'Code & Web Texture Packer' [2]: https://github.com/crashinvaders/gdx-texture-packer-gui 'Gdx Texture Packer' From 8c7ce36b86119e029b9fe1b33d2f0427cf9a6ec4 Mon Sep 17 00:00:00 2001 From: Lukas Klingsbo Date: Sat, 27 Jan 2024 11:28:39 +0100 Subject: [PATCH 15/17] Add Gnarhard to the people dictionary --- .github/.cspell/people_usernames.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/.cspell/people_usernames.txt b/.github/.cspell/people_usernames.txt index 0a5c691d81..a8155a5855 100644 --- a/.github/.cspell/people_usernames.txt +++ b/.github/.cspell/people_usernames.txt @@ -5,6 +5,7 @@ erayzesen # erayzesen.itch.io erickzanardo # github.com/erickzanardo feroult # github.com/feroult fröber # github.com/Brixto +gnarhard # github.com/gnarhard Klingsbo # github.com/spydon luanpotter # github.com/luanpotter Lukas # github.com/spydon From 952faf02ef7e9925ceae7bd5216641b9b74699e6 Mon Sep 17 00:00:00 2001 From: Lukas Klingsbo Date: Sun, 28 Jan 2024 19:59:19 +0100 Subject: [PATCH 16/17] Remove unused word from dictionary --- .github/.cspell/words_dictionary.txt | 1 - 1 file changed, 1 deletion(-) diff --git a/.github/.cspell/words_dictionary.txt b/.github/.cspell/words_dictionary.txt index 6a2e1dbe39..35bff44235 100644 --- a/.github/.cspell/words_dictionary.txt +++ b/.github/.cspell/words_dictionary.txt @@ -34,4 +34,3 @@ tappable tappables toolset underutilize -unrotated From 44eb6ace7d54e2273a83175d2cf4382cb9775aee Mon Sep 17 00:00:00 2001 From: Grayson Erhard Date: Sun, 28 Jan 2024 16:06:25 -0700 Subject: [PATCH 17/17] fixes related to comments --- .../flame_texturepacker/lib/atlas/texture_packer_atlas.dart | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/packages/flame_texturepacker/lib/atlas/texture_packer_atlas.dart b/packages/flame_texturepacker/lib/atlas/texture_packer_atlas.dart index dca2148599..a8aa2fbfd0 100644 --- a/packages/flame_texturepacker/lib/atlas/texture_packer_atlas.dart +++ b/packages/flame_texturepacker/lib/atlas/texture_packer_atlas.dart @@ -27,7 +27,7 @@ class TexturePackerAtlas { String path, { bool fromStorage = false, }) async { - late final _TextureAtlasData atlasData; + final _TextureAtlasData atlasData; if (fromStorage) { atlasData = await _fromStorage(path); @@ -96,7 +96,8 @@ Future<_TextureAtlasData> _parse( }) async { final pages = []; final regions = []; - late final String fileAsString; + final String fileAsString; + if (fromStorage) { fileAsString = await File(path).readAsString(); } else {