Flutter纹理打包插件flame_texturepacker的使用

发布于 1周前 作者 zlyuanteng 来自 Flutter

Flutter纹理打包插件flame_texturepacker的使用

flame

flame_texturepacker

TexturePacker 是一个用于创建高效精灵表的工具。此插件允许您将由 Gdx Texture PackerCode & Web Texture Packer 生成的精灵表导入到您的 Flame 游戏中。

安装

通过 Pub 安装:

flutter pub add flame_texturepacker

使用方法

资源存储

将生成的图集文件和精灵表图像放入 assets/images/ 文件夹,并在 pubspec.yaml 文件中链接这些文件:

 assets:
   - assets/images/atlas_map.atlas
   - assets/images/sprite_sheet1.png

导入插件:

import 'package:flame_texturepacker/flame_texturepacker.dart';

加载 TextureAtlas,传递精灵表图集文件的路径:

final atlas = await atlasFromAssets('atlas_map.atlas');

文件存储

如果您使用的是文件存储,则可以这样获取图集文件:

final documentsPath = (await getApplicationDocumentsDirectory()).path;
final atlas = await atlasFromStorage('$documentsPath/atlas_map.atlas');

可以通过名称获取精灵列表,并用它来生成动画:

final spriteList = atlas.findSpritesByName('robot_walk');

final animation = SpriteAnimation.spriteList(
  spriteList,
  stepTime: 0.1,
  loop: true,
);

还可以通过名称获取单个精灵:

final jumpSprite = atlas.findSpriteByName('robot_jump')!;
final fallSprite = atlas.findSpriteByName('robot_fall')!;
final idleSprite = atlas.findSpriteByName('robot_idle')!;

支持的功能

Feature Supported
Allow Rotation YES
Multiple Pages YES
Use indices YES
Strip whitespace X NO
Strip whitespace Y NO

示例代码

以下是一个完整的示例代码,演示如何使用 flame_texturepacker 插件:

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<void> onLoad() async {
    super.onLoad();

    // Load the atlasMap.
    final atlas = await atlasFromAssets('atlas_map.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),
      ),
    );
  }
}

这个示例展示了如何加载图集、创建动画以及添加单个精灵到游戏中。希望这能帮助您更好地理解和使用 flame_texturepacker 插件。


更多关于Flutter纹理打包插件flame_texturepacker的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter纹理打包插件flame_texturepacker的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


在Flutter开发中,flame_texturepacker 是一个非常有用的插件,它允许开发者使用 Flame 引擎来打包纹理,从而提高游戏的性能和加载速度。下面是一个关于如何使用 flame_texturepacker 的代码案例。

首先,确保你的 pubspec.yaml 文件中已经添加了 flameflame_texturepacker 的依赖:

dependencies:
  flutter:
    sdk: flutter
  flame: ^1.0.0  # 请使用最新版本
  flame_texturepacker: ^1.0.0  # 请使用最新版本

然后运行 flutter pub get 来获取这些依赖。

使用 flame_texturepacker 打包纹理

  1. 准备纹理图像: 假设你有一组图像文件,例如 sprite1.png, sprite2.png, sprite3.png,它们位于项目的 assets/images/ 目录下。

  2. 配置 pubspec.yaml: 在 pubspec.yaml 中添加这些图像到 Flutter 的资产中:

    flutter:
      assets:
        - assets/images/sprite1.png
        - assets/images/sprite2.png
        - assets/images/sprite3.png
    
  3. 创建 JSON 配置文件: 创建一个名为 pack.json 的文件,用于配置纹理打包。这个文件通常包含图像文件的路径和输出打包文件的名称。示例如下:

    {
      "frames": [
        {
          "filename": "assets/images/sprite1.png",
          "frame": { "x": 0, "y": 0, "w": 100, "h": 100 }
        },
        {
          "filename": "assets/images/sprite2.png",
          "frame": { "x": 0, "y": 100, "w": 100, "h": 100 }
        },
        {
          "filename": "assets/images/sprite3.png",
          "frame": { "x": 0, "y": 200, "w": 100, "h": 100 }
        }
      ],
      "meta": {
        "app": "YourGame",
        "version": "1.0",
        "image": "output.png",
        "format": "RGBA8888",
        "size": { "w": 300, "h": 300 },
        "scale": "1"
      }
    }
    

    注意:这里的 frame 坐标和尺寸是假设值,你需要根据实际情况调整。实际上,你可能需要使用一个工具(如 TexturePacker 或其他)来生成这个 JSON 文件,因为它通常包含复杂的帧信息和元数据。

  4. 运行 flame_texturepacker: 虽然 flame_texturepacker 插件本身不提供命令行工具,但你可以通过编写一个 Dart 脚本来使用它。下面是一个简单的示例,展示了如何加载和使用打包的纹理:

    import 'package:flutter/material.dart';
    import 'package:flame/flame.dart';
    import 'package:flame/game.dart';
    import 'package:flame_texturepacker/flame_texturepacker.dart';
    
    void main() {
      runApp(MyApp());
    }
    
    class MyApp extends StatelessWidget {
      @override
      Widget build(BuildContext context) {
        return MaterialApp(
          home: Scaffold(
            appBar: AppBar(
              title: Text('Flutter Flame Texture Packer Demo'),
            ),
            body: GameWidget(game: MyGame()),
          ),
        );
      }
    }
    
    class MyGame extends BaseGame {
      late SpriteComponent sprite;
    
      @override
      Future<void> onLoad() async {
        await Flame.images.loadAll([
          'output.png',  // 这是打包后的输出图像
        ]);
    
        final pack = await SpritePack.load('pack.json', 'output.png');
        sprite = SpriteComponent.fromSpritePack(pack, 'sprite1');  // 使用 'sprite1' 标识符从打包文件中加载精灵
    
        add(sprite);
      }
    }
    

在这个示例中,SpritePack.load 方法用于加载 pack.json 和打包后的图像文件 output.png。然后,SpriteComponent.fromSpritePack 方法用于从打包文件中创建 SpriteComponent 实例。

注意:这里的 pack.jsonoutput.png 需要事先生成。通常,你会使用一个纹理打包工具(如 TexturePacker)来生成这些文件,然后将它们添加到你的 Flutter 项目中。flame_texturepacker 插件本身不提供生成这些文件的工具,但它允许你在 Flutter 应用中使用这些打包后的纹理。

这个示例仅展示了基本的用法,你可能需要根据自己的项目需求进行调整和扩展。

回到顶部