Flutter插件ziggurat的使用_这个包允许你用Dart构建音频游戏

Flutter插件ziggurat的使用_这个包允许你用Dart构建音频游戏

Flutter插件ziggurat描述

这个包允许你用Dart构建音频游戏。

它最初是为了制作地图而创建的,但后来扩展为提供一套通用的API来制作音频游戏。

声音

请注意,从0.50.0版本开始,Ziggurat在库中提供了完整的音频支持,通过SoundBackend类实现,并且特别地,通过SynthizerSoundBackend类处理通过Synthizer播放声音。

因此,不再需要ziggurat_sounds包,该包已停止维护。

引擎支持

为了减少我在项目中编写非创意代码的数量,我创建了Crossbow游戏引擎。


示例代码

/// 快速示例。
import 'dart:math';

import 'package:dart_sdl/dart_sdl.dart';
import 'package:dart_synthizer/dart_synthizer.dart';
import 'package:ziggurat/levels.dart';
import 'package:ziggurat/menus.dart';
import 'package:ziggurat/src/sound/backend/synthizer/buffer_cache.dart';
import 'package:ziggurat/src/sound/backend/synthizer/synthizer_sound_backend.dart';
import 'package:ziggurat/ziggurat.dart';

const sound = AssetReference.file('sound.wav');
final quitCommandTrigger = CommandTrigger.basic(
  name: 'quit',
  description: '退出游戏',
  scanCode: ScanCode.q,
  button: GameControllerButton.leftshoulder,
);
final leftCommandTrigger = CommandTrigger.basic(
  name: 'left',
  description: '减小坐标',
  scanCode: ScanCode.left,
  button: GameControllerButton.dpadLeft,
);
const rightCommandTrigger = CommandTrigger(
  name: 'right',
  description: '增大坐标',
  keyboardKey: CommandKeyboardKey(ScanCode.right),
  button: GameControllerButton.dpadRight,
);
const upCommandTrigger = CommandTrigger(
  name: 'up',
  description: '菜单向上移动',
  keyboardKey: CommandKeyboardKey(ScanCode.up),
  button: GameControllerButton.dpadUp,
);
const downCommandTrigger = CommandTrigger(
  name: 'down',
  description: '菜单向下移动',
  keyboardKey: CommandKeyboardKey(ScanCode.down),
  button: GameControllerButton.dpadDown,
);

/// 注册了一些命令的级别。
class ExcitingLevel extends Level {
  /// 创建级别。
  ExcitingLevel(final Game game)
      : coordinate = 0,
        super(game: game) {
    registerCommand(
      quitCommandTrigger.name,
      Command(
        onStart: () => game.replaceLevel(MainMenu(game)),
      ),
    );
    registerCommand(
      leftCommandTrigger.name,
      Command(
        onStart: () {
          coordinate--;
          game.outputMessage(
            Message(
              sound: sound,
              text: 'Left: $coordinate',
            ),
          );
        },
        interval: 500,
      ),
    );
    registerCommand(
      rightCommandTrigger.name,
      Command(
        onStart: () {
          coordinate++;
          game.outputMessage(
            Message(
              sound: sound,
              text: 'Right: $coordinate',
            ),
          );
        },
        interval: 500,
      ),
    );
  }

  /// X/Y坐标。
  int coordinate;
}

/// 主菜单。
class MainMenu extends Menu {
  /// 创建菜单。
  MainMenu(final Game game)
      : super(
          game: game,
          title: const Message(text: '主菜单'),
          items: [
            MenuItem(
              const Message(text: '开始游戏'),
              activator: MenuItemActivator(
                onActivate: () => game.replaceLevel(ExcitingLevel(game)),
              ),
            ),
            MenuItem(
              const Message(text: '退出游戏'),
              activator: MenuItemActivator(onActivate: game.stop),
            )
          ],
          onCancel: () => game.outputText('你不能退出此菜单。'),
          itemRumbleEffect: const RumbleEffect(duration: 100),
        );
}

Future<void> main() async {
  final sdl = Sdl()..init();
  final synthizer = Synthizer()..initialize();
  final context = synthizer.createContext();
  final random = Random();
  final bufferCache = BufferCache(
    synthizer: synthizer,
    maxSize: 1.gb,
    random: random,
  );
  final sounds = SynthizerSoundBackend(
    context: context,
    bufferCache: bufferCache,
  );
  final game = Game(
    title: 'Ziggurat 示例',
    sdl: sdl,
    soundBackend: sounds,
    triggerMap: TriggerMap([
      quitCommandTrigger,
      CommandTrigger.basic(
        name: quitCommandTrigger.name,
        description: '退出游戏',
        scanCode: ScanCode.escape,
      ),
      leftCommandTrigger,
      rightCommandTrigger,
      upCommandTrigger,
      downCommandTrigger,
    ]),
  );
  final level = MainMenu(game);
  try {
    await game.run(
      onStart: () => game.pushLevel(level),
    );
  } finally {
    sdl.quit();
    sounds.shutdown();
  }
}

代码解释

  1. 导入必要的库

    import 'dart:math';
    import 'package:dart_sdl/dart_sdl.dart';
    import 'package:dart_synthizer/dart_synthizer.dart';
    import 'package:ziggurat/levels.dart';
    import 'package:ziggurat/menus.dart';
    import 'package:ziggurat/src/sound/backend/synthizer/buffer_cache.dart';
    import 'package:ziggurat/src/sound/backend/synthizer/synthizer_sound_backend.dart';
    import 'package:ziggurat/ziggurat.dart';
    
  2. 定义命令触发器

    final quitCommandTrigger = CommandTrigger.basic(
      name: 'quit',
      description: '退出游戏',
      scanCode: ScanCode.q,
      button: GameControllerButton.leftshoulder,
    );
    
  3. 定义游戏等级

    class ExcitingLevel extends Level {
      ExcitingLevel(final Game game)
          : coordinate = 0,
            super(game: game) {
        // 注册命令
        registerCommand(
          quitCommandTrigger.name,
          Command(
            onStart: () => game.replaceLevel(MainMenu(game)),
          ),
        );
        // 其他命令...
      }
    }
    
  4. 定义主菜单

    class MainMenu extends Menu {
      MainMenu(final Game game)
          : super(
              game: game,
              title: const Message(text: '主菜单'),
              items: [
                MenuItem(
                  const Message(text: '开始游戏'),
                  activator: MenuItemActivator(
                    onActivate: () => game.replaceLevel(ExcitingLevel(game)),
                  ),
                ),
                MenuItem(
                  const Message(text: '退出游戏'),
                  activator: MenuItemActivator(onActivate: game.stop),
                )
              ],
              onCancel: () => game.outputText('你不能退出此菜单。'),
              itemRumbleEffect: const RumbleEffect(duration: 100),
            );
    }
    
  5. 运行游戏

    Future<void> main() async {
      final sdl = Sdl()..init();
      final synthizer = Synthizer()..initialize();
      final context = synthizer.createContext();
      final random = Random();
      final bufferCache = BufferCache(
        synthizer: synthizer,
        maxSize: 1.gb,
        random: random,
      );
      final sounds = SynthizerSoundBackend(
        context: context,
        bufferCache: bufferCache,
      );
      final game = Game(
        title: 'Ziggurat 示例',
        sdl: sdl,
        soundBackend: sounds,
        triggerMap: TriggerMap([
          quitCommandTrigger,
          CommandTrigger.basic(
            name: quitCommandTrigger.name,
            description: '退出游戏',
            scanCode: ScanCode.escape,
          ),
          leftCommandTrigger,
          rightCommandTrigger,
          upCommandTrigger,
          downCommandTrigger,
        ]),
      );
      final level = MainMenu(game);
      try {
        await game.run(
          onStart: () => game.pushLevel(level),
        );
      } finally {
        sdl.quit();
        sounds.shutdown();
      }
    }

更多关于Flutter插件ziggurat的使用_这个包允许你用Dart构建音频游戏的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter插件ziggurat的使用_这个包允许你用Dart构建音频游戏的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


在Flutter中,如果你遇到了一个未知功能的插件,比如名为 ziggurat 的插件,并且其文档或介绍中没有明确其功能,你可以通过查看其源代码或仓库中的示例代码来尝试理解其用途。由于 ziggurat 并非一个广为人知的Flutter插件,这里提供一个通用的方法来探索和使用这样的插件。

首先,你需要确保你的Flutter环境已经配置好,并且已经创建了一个Flutter项目。接下来,你可以按照以下步骤操作:

  1. 添加插件依赖: 在你的 pubspec.yaml 文件中添加 ziggurat 插件的依赖(假设它已经在pub.dev上发布或者你有其Git仓库路径)。

    dependencies:
      flutter:
        sdk: flutter
      ziggurat: ^x.y.z  # 替换为实际版本号或Git仓库路径
    

    如果 ziggurat 还没有发布到pub.dev,你可以使用Git路径来添加依赖,例如:

    dependencies:
      flutter:
        sdk: flutter
      ziggurat:
        git:
          url: https://github.com/user/ziggurat.git  # 替换为实际的Git仓库URL
          ref: some-branch-or-tag  # 可选,指定分支或标签
    
  2. 导入插件: 在你的Dart文件中导入该插件。

    import 'package:ziggurat/ziggurat.dart';
    
  3. 查看插件源代码或示例: 由于 ziggurat 的功能未知,你需要查看其源代码或仓库中的示例代码。通常,插件的GitHub仓库会包含README文件、示例代码和源代码。

    • 访问插件的GitHub仓库(如果有的话)。
    • 查看README文件了解插件的基本信息和用法。
    • 浏览源代码,特别是 lib 目录下的Dart文件,以理解插件提供的API和功能。
    • 查找示例代码,通常位于 example 目录下,运行示例应用以观察插件的实际效果。
  4. 尝试使用插件: 基于你对插件源代码的理解,尝试在你的Flutter应用中使用它。以下是一个假设性的代码示例,用于展示如何调用一个假定的 Ziggurat 类的方法:

    import 'package:flutter/material.dart';
    import 'package:ziggurat/ziggurat.dart';
    
    void main() {
      runApp(MyApp());
    }
    
    class MyApp extends StatelessWidget {
      @override
      Widget build(BuildContext context) {
        return MaterialApp(
          home: Scaffold(
            appBar: AppBar(
              title: Text('Ziggurat Plugin Example'),
            ),
            body: Center(
              child: ZigguratExample(),
            ),
          ),
        );
      }
    }
    
    class ZigguratExample extends StatefulWidget {
      @override
      _ZigguratExampleState createState() => _ZigguratExampleState();
    }
    
    class _ZigguratExampleState extends State<ZigguratExample> {
      String result = '';
    
      @override
      void initState() {
        super.initState();
        // 假设Ziggurat有一个名为performUnknownFunction的方法
        _performUnknownFunction();
      }
    
      void _performUnknownFunction() async {
        try {
          // 调用插件的方法,并处理结果
          var response = await Ziggurat.performUnknownFunction();
          setState(() {
            result = 'Response: $response';
          });
        } catch (e) {
          setState(() {
            result = 'Error: $e';
          });
        }
      }
    
      @override
      Widget build(BuildContext context) {
        return Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Text('Ziggurat Plugin Result'),
            Text(result),
          ],
        );
      }
    }
    

    请注意,上面的代码是一个假设性的示例,Ziggurat.performUnknownFunction() 方法及其返回值类型都是基于假设的。你需要根据实际的插件API来调整代码。

  5. 运行应用: 使用 flutter run 命令运行你的Flutter应用,并观察插件的行为和结果。

  6. 调试和修改: 如果插件的行为不符合你的预期,你可以通过调试代码、查看日志输出和修改插件调用来进一步了解其功能。

由于 ziggurat 插件的具体功能未知,上述步骤提供了一个通用的方法来探索和使用未知的Flutter插件。如果你能够访问插件的源代码或示例代码,这将极大地帮助你理解其功能。

回到顶部