Flutter游戏开发插件flame_jenny的使用

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

Flutter游戏开发插件flame_jenny的使用

flame_jenny 是一个将 jenny(对话框架)集成到 Flame 引擎中的库。它提供了许多组件,用于在游戏中显示对话。jenny 库受到 YarnSpinner 的启发,是一个用于嵌入对话、互动会话、叙述或逐步教程的框架。

安装

在开始之前,请确保你的项目已经添加了 flame_jenny 依赖。你可以在 pubspec.yaml 文件中添加以下依赖:

dependencies:
  flame: ^1.0.0
  flame_jenny: ^0.1.0

然后运行 flutter pub get 来安装这些包。

使用示例

下面是一个简单的示例,展示了如何在 Flame 游戏中使用 flame_jenny 来创建和显示对话。

1. 创建对话文件

首先,你需要创建一个 .jenn 文件来定义你的对话。例如,创建一个名为 dialogue.jenn 的文件,并添加以下内容:

title: Introduction

-> Start:
    Narrator: Welcome to the game!
    -> Continue
        Player: What is this place?
        Narrator: This is your new adventure!
        -> End

2. 加载并显示对话

接下来,在你的 Flame 游戏代码中加载并显示这个对话。

import 'package:flame/flame.dart';
import 'package:flame/game.dart';
import 'package:flame_jenny/flame_jenny.dart';
import 'package:flutter/material.dart';

class MyGame extends FlameGame with HasJenny {
  late JennyDirector director;

  @override
  Future<void> onLoad() async {
    // 加载对话文件
    final dialogueFile = await Flame.bundle.loadString('assets/dialogue.jenn');
    
    // 初始化 JennyDirector
    director = JennyDirector(dialogueFile);
    
    // 开始第一个对话
    director.startDialogue('Introduction');
  }

  @override
  void render(Canvas canvas) {
    super.render(canvas);
    // 在这里渲染对话文本或其他UI元素
    if (director.currentNode != null) {
      final textPainter = TextPainter(
        text: TextSpan(text: director.currentNode!.text),
        textDirection: TextDirection.ltr,
      )..layout();
      textPainter.paint(canvas, Offset(50, 50));
    }
  }

  @override
  void update(double dt) {
    super.update(dt);
    // 处理用户输入以推进对话
    if (director.hasNextNode && director.isWaitingForInput) {
      if (yourInputCondition()) { // 替换为实际的输入检测逻辑
        director.nextNode();
      }
    }
  }
}

void main() {
  runApp(GameWidget(game: MyGame()));
}

3. 运行游戏

确保你的对话文件被正确地放置在 assets 文件夹下,并且在 pubspec.yaml 中声明了该资源路径:

flutter:
  assets:
    - assets/dialogue.jenn

更多关于Flutter游戏开发插件flame_jenny的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter游戏开发插件flame_jenny的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


在Flutter游戏开发中,flame_jenny 是一个非常有用的插件,它提供了一系列用于处理和优化图像资源的工具,这对于提升游戏性能和视觉质量至关重要。flame_jenny 实际上是 flame 游戏引擎生态系统中的一部分,专注于图像资源的打包和处理。

以下是一个使用 flame_jenny 的简单示例,展示了如何加载和处理图像资源。请注意,由于 flame_jenny 主要是用于构建工具链(如图像打包),而不是直接在代码中运行,因此下面的例子将侧重于如何通过命令行工具使用 flame_jenny,以及在 Flutter 应用中加载处理后的图像资源。

1. 安装 flame_jenny CLI 工具

首先,你需要全局安装 flame_jenny 的命令行工具。你可以通过 Dart 的 pub 工具来完成这一步:

dart pub global activate flame_jenny

2. 使用 flame_jenny 打包图像资源

假设你有一个包含多个 PNG 图像资源的目录 assets/images,你可以使用 flame_jenny 将这些图像打包成一个精灵表(sprite sheet)和对应的 JSON 映射文件。

flame_jenny pack --input assets/images --output assets/packed --format libgdx --name my_sprite_sheet

这个命令会在 assets/packed 目录下生成两个文件:my_sprite_sheet.pngmy_sprite_sheet.json

3. 在 Flutter 应用中加载打包后的资源

接下来,在你的 Flutter 应用中,你可以使用 flame 库来加载这些打包后的资源。首先,确保你的 pubspec.yaml 文件中包含了 flame 的依赖:

dependencies:
  flame: ^x.y.z  # 请替换为最新版本号

然后,在你的 Flutter 应用代码中,你可以这样加载和使用打包后的图像资源:

import 'package:flutter/material.dart';
import 'package:flame/flame.dart';
import 'package:flame/game.dart';
import 'package:flame/sprite.dart';
import 'dart:typed_data';
import 'package:flutter/services.dart' show rootBundle;

class MyGame extends Game {
  @override
  void onLoad() async {
    // 加载精灵表图像和 JSON 映射文件
    final spriteSheetImage = await rootBundle.load('assets/packed/my_sprite_sheet.png');
    final spriteSheetData = await rootBundle.loadString('assets/packed/my_sprite_sheet.json');

    // 解析 JSON 映射文件
    final spriteSheetJson = jsonDecode(spriteSheetData);

    // 创建精灵表
    final spriteSheet = SpriteSheet.fromImageBytes(
      Uint8List.fromList(spriteSheetImage.buffer.asUint8List()),
      spriteSheetJson['frames'],
      textureWidth: spriteSheetJson['meta']['size']['w'],
      textureHeight: spriteSheetJson['meta']['size']['h'],
    );

    // 获取精灵(例如,获取第一个帧作为精灵)
    final sprite = spriteSheet.getSpriteByName(spriteSheetJson['frames'].keys.first);

    // 添加精灵到游戏画布(这里只是一个简单示例,实际游戏中你会在 update 或 render 方法中使用它)
    add(PositionedComponent(
      size: sprite.size,
      position: Vector2(100, 100),
    )
    ..sprite = sprite);
  }
}

void main() {
  Flame.images.cacheFrom('assets/packed/my_sprite_sheet.png'); // 缓存精灵表图像(可选,但推荐以提高性能)
  runApp(MaterialApp(
    home: Scaffold(
      body: GameWidget(game: MyGame()),
    ),
  ));
}

在这个示例中,我们加载了打包后的精灵表图像和 JSON 映射文件,然后使用 SpriteSheet.fromImageBytes 方法创建了一个 SpriteSheet 对象。之后,我们从精灵表中获取了一个精灵,并将其添加到了游戏画布上。

请注意,这个示例代码是为了演示目的而简化的,实际的游戏开发中你可能需要处理更多的细节,比如资源管理、游戏循环、用户输入等。希望这个例子能帮助你理解如何在 Flutter 游戏开发中使用 flame_jenny

回到顶部