Flutter游戏开发插件gameolive的使用

Flutter游戏开发插件gameolive的使用

gameolive 是一个用于集成游戏并与GameOlive平台交互的插件。本文将详细介绍如何在Flutter应用中使用该插件。

开始使用

初始化插件

首先,确保你已经安装了gameolive插件。在你的pubspec.yaml文件中添加以下依赖:

dependencies:
  flutter:
    sdk: flutter
  gameolive: ^版本号

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

配置信息

在开始之前,你需要一些配置信息,包括clientIdclientSecretoperatorId等。这些信息通常由GameOlive平台提供。

示例代码

以下是一个完整的示例代码,展示了如何在Flutter应用中使用gameolive插件。

import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'dart:async';

import 'package:flutter/services.dart';
import 'package:flutter_slidable/flutter_slidable.dart';
import 'package:gameolive/GameOliveView.dart';
import 'package:gameolive/GameOliveWindow.dart';
import 'package:gameolive/controllers/base/gameolive_game_controller.dart';
import 'package:gameolive/gameolive.dart';
import 'package:gameolive/models/config.dart';
import 'package:gameolive/models/game.dart';
import 'package:gameolive/models/gamesResponse.dart';
import 'package:gameolive/models/launchConfig.dart';
import 'package:gameolive/models/playerBalance.dart';
import 'package:gameolive/models/transaction.dart';
import 'package:gameolive/shared/playmode.dart';
import 'package:get/get.dart';

import 'custom_dialog_box.dart';
import 'game_dialog_box.dart';

const clientId = "fb_game_sa-4862d2b3-fb68-4963-b47b-beec6af422a5@05cc351f-dbd0-43af-aaaf-515ffaecdd34.gol";
const clientSecret = "abc1602937927739";
const operatorId = "5f8ae3cbc34272000af1f3bf";
const server = 'https://prod-platform-service-xrfoa2ko5q-em.a.run.app';
const static = 'https://static.luckybeetlegames.com';
const walletClientId = "wallet_manager-6f18a5bb-9b2e-4ed8-b7db-abf6465256f8@4e539d5f-4dd9-4518-8e67-49e401ea0b4b.gol";
const walletClientSecret = "gol1606078109162";

void main() {
  runApp(const MyApp());
}

class MyApp extends StatefulWidget {
  const MyApp({Key? key}) : super(key: key);

  [@override](/user/override)
  State<MyApp> createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  final _scaffoldKey = GlobalKey<ScaffoldState>();

  String _platformVersion = '未知';
  final _gameolivePlugin = Gameolive();

  List<Game>? _games;
  LaunchConfig? inlineLaunchConfig;
  PlayerBalance? _playerBalance;
  String defaultPlayerId = "DEMO_USER";
  String _playerId = "DEMO_USER";
  String _playerToken = "";

  final TextEditingController _txtPlayerUid = TextEditingController();
  final TextEditingController _txtTransactionId = TextEditingController();
  final TextEditingController _txtAmount = TextEditingController();
  final TextEditingController _txtCurrency = TextEditingController();
  final TextEditingController _txtCoins = TextEditingController();
  final TextEditingController _txtRefernce = TextEditingController();
  final TextEditingController _txtRemarks = TextEditingController();

  [@override](/user/override)
  void initState() {
    super.initState();
    initPlatformState();
    initGameOlive();
  }

  // 平台消息异步执行,因此我们在异步方法中初始化。
  Future<void> initPlatformState() async {
    String platformVersion;
    // 平台消息可能会失败,因此我们使用try/catch处理PlatformException。
    // 我们还处理消息可能返回null的情况。
    try {
      platformVersion = await _gameolivePlugin.getPlatformVersion() ?? '未知平台版本';
    } on PlatformException {
      platformVersion = '获取平台版本失败。';
    }

    // 如果在异步平台消息飞行时小部件从树中移除,则我们想要丢弃回复而不是调用setState以更新我们的非存在的外观。
    if (!mounted) return;

    setState(() {
      _platformVersion = platformVersion;
    });
  }

  initGameOlive() async {
    Config config = Config(
        operatorId: operatorId,
        clientId: clientId,
        clientSecret: clientSecret,
        server: server,
        static: static);
    List<Game>? games;
    try {
      await _gameolivePlugin.init(config); // 初始化库

      GamesResponse gamesResponse = await _gameolivePlugin.getGames(10, 0, ''); // 获取前10个游戏
      games = gamesResponse.games;
    } on PlatformException {
      // 记录异常并报告studio@gameolive.com
    }

    setState(() {
      _games = games;
    });
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
          appBar: AppBar(
            title: const Text('插件示例应用'),
          ),
          body: _games == null
              ? const Text('正在执行')
              : _games!.isEmpty
                  ? const Text(
                      '此平台上没有游戏可供选择')
                  : Column(
                      children: [
                        inlineLaunchConfig == null
                            ? const SizedBox()
                            : SizedBox(
                                width: 720,
                                height: 220,
                                child: GameOliveWindow(
                                  instance: _gameolivePlugin,
                                  gameLaunchConfig: inlineLaunchConfig,
                                  onRoundStarted: (started) => {
                                    Get.snackbar(
                                      "开始 $started",
                                      "开始 $started",
                                      icon: const Icon(Icons.person,
                                          color: Colors.white),
                                      snackPosition: SnackPosition.BOTTOM,
                                    )
                                  },
                                )),
                        const SizedBox(),
                        Flexible(
                            child: ListView.builder(
                                // 让ListView知道它需要构建多少项。
                                itemCount: _games!.length,
                                // 提供一个构建函数。这是魔法发生的地方。
                                // 根据项目的类型将其转换为小部件。
                                itemBuilder: (context, index) {
                                  final item = _games![index];
                                  return Slidable(
                                    actionPane: const SlidableDrawerActionPane(),
                                    actionExtentRatio: 0.25,
                                    actions: <Widget>[
                                      IconSlideAction(
                                        caption: '游戏链接',
                                        color: Colors.blue,
                                        icon: Icons.archive,
                                        onTap: () async {
                                          LaunchConfig launchConfig = LaunchConfig();
                                          launchConfig.server = server;
                                          launchConfig.static = static;
                                          launchConfig.operatorId = operatorId;
                                          launchConfig.configId = item.configuration;
                                          launchConfig.playerId = _playerId;
                                          launchConfig.playerToken = _playerToken;

                                          String gameLink = await _gameolivePlugin.getGameUrl(launchConfig);
                                          Future.delayed(Duration.zero).then(
                                            (value) => showDialog(
                                                context: context,
                                                builder: (BuildContext context) {
                                                  return CustomDialogBox(
                                                    title: "游戏链接",
                                                    descriptions: gameLink,
                                                    text: "关闭",
                                                  );
                                                }),
                                          );
                                        },
                                      ),
                                      IconSlideAction(
                                        caption: '${_playerId == defaultPlayerId ? '注册玩家' : _playerId}: ${_playerBalance != null ? '${_playerBalance!.cash}|${_playerBalance!.currency}|${_playerBalance!.coin}' : ''}',
                                        color: Colors.indigo,
                                        icon: Icons.person_add,
                                        onTap: () {
                                          showDialog(
                                              context: context,
                                              builder: (BuildContext context) {
                                                return Dialog(
                                                  shape: RoundedRectangleBorder(
                                                      borderRadius: BorderRadius.circular(
                                                          20.0)), //这个右下角
                                                  child: Padding(
                                                    padding: const EdgeInsets.all(12.0),
                                                    child: Column(
                                                      mainAxisAlignment: MainAxisAlignment.center,
                                                      crossAxisAlignment: CrossAxisAlignment.start,
                                                      children: [
                                                        TextField(
                                                          decoration: const InputDecoration(
                                                              hintText: '玩家UID'),
                                                          controller: _txtPlayerUid,
                                                        ),
                                                        SizedBox(
                                                          width: 320.0,
                                                          child: ElevatedButton(
                                                            onPressed: () async {
                                                              try {
                                                                String playerToken = await _gameolivePlugin.getPlayerToken(_txtPlayerUid.text, PlayMode.real);

                                                                Config walletConfig = Config(
                                                                    operatorId: operatorId,
                                                                    clientId: walletClientId,
                                                                    clientSecret: walletClientSecret,
                                                                    server: server,
                                                                    static: static);
                                                                PlayerBalance pb = await _gameolivePlugin.getPlayerBalance(playerToken, _txtPlayerUid.text, PlayMode.real, walletConfig);
                                                                debugPrint("eddwdweded");

                                                                setState(() {
                                                                  _playerId = _txtPlayerUid.text;
                                                                  _playerToken = playerToken;
                                                                  _playerBalance = pb;
                                                                });

                                                              } catch (ex) {
                                                                Get.snackbar(
                                                                  '获取玩家令牌时出现异常!',
                                                                  '获取玩家令牌时出现异常!',
                                                                  icon: const Icon(Icons.person,
                                                                      color: Colors.white),
                                                                  snackPosition: SnackPosition.BOTTOM,
                                                                );
                                                              }
                                                            },
                                                            child: const Text(
                                                              "注册或登录玩家",
                                                              style: TextStyle(color: Colors.white),
                                                            ),
                                                          ),
                                                        ),
                                                        Text('当前玩家: $_playerId'),
                                                        TextField(
                                                          decoration: const InputDecoration(
                                                              hintText: '交易UID'),
                                                          controller: _txtTransactionId,
                                                        ),
                                                        TextField(
                                                          decoration: const InputDecoration(
                                                              hintText: '金额'),
                                                          controller: _txtAmount,
                                                        ),
                                                        TextField(
                                                          decoration: const InputDecoration(
                                                              hintText: '货币'),
                                                          controller: _txtCurrency,
                                                        ),
                                                        TextField(
                                                          decoration: const InputDecoration(
                                                              hintText: '硬币'),
                                                          controller: _txtCoins,
                                                        ),
                                                        TextField(
                                                          decoration: const InputDecoration(
                                                              hintText: '参考'),
                                                          controller: _txtRefernce,
                                                        ),
                                                        TextField(
                                                          decoration: const InputDecoration(
                                                              hintText: '备注'),
                                                          controller: _txtRemarks,
                                                        ),
                                                        SizedBox(
                                                          width: 320.0,
                                                          child: ElevatedButton(
                                                            onPressed: () async {
                                                              try {
                                                                Transaction trx = Transaction(
                                                                    uid: _txtTransactionId.text,
                                                                    amount: double.parse(_txtAmount.text),
                                                                    currency: _txtCurrency.text,
                                                                    coins: int.parse(_txtCoins.text),
                                                                    reference: _txtRefernce.text);
                                                                trx.remarks = _txtRemarks.text;
                                                                Config walletConfig = Config(
                                                                    operatorId: operatorId,
                                                                    clientId: walletClientId,
                                                                    clientSecret: walletClientSecret,
                                                                    server: server,
                                                                    static: static);
                                                                var newTransaction = await _gameolivePlugin.depositToPlayerAccount(_playerId, trx, walletConfig);
                                                                setState(() {
                                                                  _playerBalance = newTransaction;
                                                                });
                                                              } catch (ex) {
                                                                Get.snackbar(
                                                                  '创建玩家交易时出现异常!',
                                                                  '创建玩家交易时出现异常!',
                                                                  icon: const Icon(Icons.person,
                                                                      color: Colors.white),
                                                                  snackPosition: SnackPosition.BOTTOM,
                                                                );
                                                              }
                                                            },
                                                            child: const Text(
                                                              "向玩家钱包存款",
                                                              style: TextStyle(color: Colors.white),
                                                            ),
                                                          ),
                                                        ),
                                                      ],
                                                    ),
                                                  ),
                                                );
                                              });

                                          if (kDebugMode) {
                                            print('分享');
                                          }
                                        },
                                      ),
                                    ],
                                    secondaryActions: <Widget>[
                                      IconSlideAction(
                                        caption: '内联',
                                        color: Colors.blue,
                                        icon: Icons.more_horiz,
                                        onTap: () async {
                                          LaunchConfig launchConfig = LaunchConfig();
                                          launchConfig.server = server;
                                          launchConfig.static = static;
                                          launchConfig.operatorId = operatorId;
                                          launchConfig.configId = item.configuration;
                                          launchConfig.playerId = _playerId;
                                          launchConfig.playerToken = _playerToken;
                                          setState(() {
                                            inlineLaunchConfig = launchConfig;
                                          });
                                        },
                                      ),
                                      IconSlideAction(
                                        caption: '重定向',
                                        color: Colors.black45,
                                        icon: Icons.arrow_forward,
                                        onTap: () {
                                          LaunchConfig launchConfig = LaunchConfig();
                                          launchConfig.server = server;
                                          launchConfig.static = static;
                                          launchConfig.operatorId = operatorId;
                                          launchConfig.configId = item.configuration;
                                          launchConfig.orientation = "landscape";
                                          launchConfig.orientationOnExit = "landscape";
                                          launchConfig.currency = "DEMO";
                                          launchConfig.playerId = _playerId;
                                          launchConfig.playerToken = _playerToken;
                                          Navigator.push(
                                              context,
                                              MaterialPageRoute(
                                                builder: (context) => GameOliveView(
                                                    instance: _gameolivePlugin,
                                                    launchConfig: launchConfig,
                                                    onGoToHome: (value) {
                                                      Navigator.pop(context);
                                                    },
                                                    onBalanceChange: (balace) {
                                                      debugPrint("余额更新");
                                                    },
                                                    onUserAchievementsUpdate: (achievements) {
                                                      debugPrint("成就更新");
                                                    },
                                                    onGameOliveWindowCreated: (GameOliveGameController gamecontroller) {
                                                      gamecontroller.openGameMenu();
                                                    }),
                                              ));
                                        },
                                      ),
                                      IconSlideAction(
                                        caption: '对话框',
                                        color: Colors.indigo,
                                        icon: Icons.add_to_photos,
                                        onTap: () {
                                          LaunchConfig gameLaunchConfig = LaunchConfig();
                                          gameLaunchConfig.server = server;
                                          gameLaunchConfig.static = static;
                                          gameLaunchConfig.operatorId = operatorId;
                                          gameLaunchConfig.configId = item.configuration;
                                          gameLaunchConfig.playerId = _playerId; // 玩家唯一ID
                                          gameLaunchConfig.playerToken = _playerToken; // 玩家唯一令牌

                                          showDialog(
                                              context: context,
                                              builder: (BuildContext context) {
                                                return GameDialogBox(
                                                    instance: _gameolivePlugin,
                                                    gameLaunchConfig: gameLaunchConfig);
                                              });
                                        },
                                      ),
                                    ],
                                    child: Container(
                                      color: Colors.white,
                                      child: ListTile(
                                        leading: const Text('<'),
                                        title: Text(item.title ?? ""),
                                        trailing: const Text('滑动 >'),
                                        subtitle: Column(
                                          mainAxisAlignment: MainAxisAlignment.start,
                                          crossAxisAlignment: CrossAxisAlignment.start,
                                          children: [
                                            Text(item.configuration ?? ""),
                                            Text('启用: ${item.enabled}'),
                                            Text('标签: ${item.label}'),
                                            Text('评分: ${item.rating}'),
                                            Text('玩家数量: ${item.playerCount}'),
                                            Text('描述: ${item.description}')
                                          ],
                                        ),
                                      ),
                                    ),
                                  );
                                })),
                      ],
                    )),
    );
  }
}

解释

  1. 导入必要的包

    import 'package:flutter/foundation.dart';
    import 'package:flutter/material.dart';
    import 'dart:async';
    import 'package:flutter/services.dart';
    import 'package:flutter_slidable/flutter_slidable.dart';
    import 'package:gameolive/GameOliveView.dart';
    import 'package:gameolive/GameOliveWindow.dart';
    import 'package:gameolive/controllers/base/gameolive_game_controller.dart';
    import 'package:gameolive/gameolive.dart';
    import 'package:gameolive/models/config.dart';
    import 'package:gameolive/models/game.dart';
    import 'package:gameolive/models/gamesResponse.dart';
    import 'package:gameolive/models/launchConfig.dart';
    import 'package:gameolive/models/playerBalance.dart';
    import 'package:gameolive/models/transaction.dart';
    import 'package:gameolive/shared/playmode.dart';
    import 'package:get/get.dart';
    
  2. 配置信息

    const clientId = "fb_game_sa-4862d2b3-fb68-4963-b47b-beec6af422a5@05cc351f-dbd0-43af-aaaf-515ffaecdd34.gol";
    const clientSecret = "abc1602937927739";
    const operatorId = "5f8ae3cbc34272000af1f3bf";
    const server = 'https://prod-platform-service-xrfoa2ko5q-em.a.run.app';
    const static = 'https://static.luckybeetlegames.com';
    const walletClientId = "wallet_manager-6f18a5bb-9b2e-4ed8-b7db-abf6465256f8@4e539d5f-4dd9-4518-8e67-49e401ea0b4b.gol";
    const walletClientSecret = "gol1606078109162";
    
  3. 初始化平台状态

    Future<void> initPlatformState() async {
      String platformVersion;
      try {
        platformVersion = await _gameolivePlugin.getPlatformVersion() ?? '未知平台版本';
      } on PlatformException {
        platformVersion = '获取平台版本失败。';
      }
    
      if (!mounted) return;
    
      setState(() {
        _platformVersion = platformVersion;
      });
    }
    
  4. 初始化游戏橄榄插件

    initGameOlive() async {
      Config config = Config(
          operatorId: operatorId,
          clientId: clientId,
          clientSecret: clientSecret,
          server: server,
          static: static);
      List<Game>? games;
      try {
        await _gameolivePlugin.init(config); // 初始化库
    
        GamesResponse gamesResponse = await _gameolivePlugin.getGames(10, 0, ''); // 获取前10个游戏
        games = gamesResponse.games;
      } on PlatformException {
        // 记录异常并报告studio@gameolive.com
      }
    
      setState(() {
        _games = games;
      });
    }
    
  5. 构建UI

    [@override](/user/override)
    Widget build(BuildContext context) {
      return MaterialApp(
        home: Scaffold(
            appBar: AppBar(
              title: const Text('插件示例应用'),
            ),
            body: _games == null
                ? const Text('正在执行')
                : _games!.isEmpty
                    ? const Text('此平台上没有游戏可供选择')
                    : Column(
                        children: [
                          inlineLaunchConfig == null
                              ? const SizedBox()
                              : SizedBox(
                                  width: 720,
                                  height: 220,
                                  child: GameOliveWindow(
                                    instance: _gameolivePlugin,
                                    gameLaunchConfig: inlineLaunchConfig,
                                    onRoundStarted: (started) => {
                                      Get.snackbar(
                                        "开始 $started",
                                        "开始 $started",
                                        icon: const Icon(Icons.person,
                                            color: Colors.white),
                                        snackPosition: SnackPosition.BOTTOM,
                                      )
                                    },
                                  )),
                          const SizedBox(),
                          Flexible(
                              child: ListView.builder(
                                  itemCount: _games!.length,
                                  itemBuilder: (context, index) {
                                    final item = _games![index];
                                    return Slidable(
                                      actionPane: const SlidableDrawerActionPane(),
                                      actionExtentRatio: 0.25,
                                      actions: <Widget>[
                                        IconSlideAction(
                                          caption: '游戏链接',
                                          color: Colors.blue,
                                          icon: Icons.archive,
                                          onTap: () async {
                                            LaunchConfig launchConfig = LaunchConfig();
                                            launchConfig.server = server;
                                            launchConfig.static = static;
                                            launchConfig.operatorId = operatorId;
                                            launchConfig.configId = item.configuration;
                                            launchConfig.playerId = _playerId;
                                            launchConfig.playerToken = _playerToken;
    
                                            String gameLink = await _gameolivePlugin.getGameUrl(launchConfig);
                                            Future.delayed(Duration.zero).then(
                                              (value) => showDialog(
                                                  context: context,
                                                  builder: (BuildContext context) {
                                                    return CustomDialogBox(
                                                      title: "游戏链接",
                                                      descriptions: gameLink,
                                                      text: "关闭",
                                                    );
                                                  }),
                                            );
                                          },
                                        ),
                                        IconSlideAction(
                                          caption: '${_playerId == defaultPlayerId ? '注册玩家' : _playerId}: ${_playerBalance != null ? '${_playerBalance!.cash}|${_playerBalance!.currency}|${_playerBalance!.coin}' : ''}',
                                          color: Colors.indigo,
                                          icon: Icons.person_add,
                                          onTap: () {
                                            showDialog(
                                                context: context,
                                                builder: (BuildContext context) {
                                                  return Dialog(
                                                    shape: RoundedRectangleBorder(
                                                        borderRadius: BorderRadius.circular(
                                                            20.0)), //这个右下角
                                                    child: Padding(
                                                      padding: const EdgeInsets.all(12.0),
                                                      child: Column(
                                                        mainAxisAlignment: MainAxisAlignment.center,
                                                        crossAxisAlignment: CrossAxisAlignment.start,
                                                        children: [
                                                          TextField(
                                                            decoration: const InputDecoration(
                                                                hintText: '玩家UID'),
                                                            controller: _txtPlayerUid,
                                                          ),
                                                          SizedBox(
                                                            width: 320.0,
                                                            child: ElevatedButton(
                                                              onPressed: () async {
                                                                try {
                                                                  String playerToken = await _gameolivePlugin.getPlayerToken(_txtPlayerUid.text, PlayMode.real);
    
                                                                  Config walletConfig = Config(
                                                                      operatorId: operatorId,
                                                                      clientId: walletClientId,
                                                                      clientSecret: walletClientSecret,
                                                                      server: server,
                                                                      static: static);
                                                                  PlayerBalance pb = await _gameolivePlugin.getPlayerBalance(playerToken, _txtPlayerUid.text, PlayMode.real, walletConfig);
                                                                  debugPrint("eddwdweded");
    
                                                                  setState(() {
                                                                    _playerId = _txtPlayerUid.text;
                                                                    _playerToken = playerToken;
                                                                    _playerBalance = pb;
                                                                  });
    
                                                                } catch (ex) {
                                                                  Get.snackbar(
                                                                    '获取玩家令牌时出现异常!',
                                                                    '获取玩家令牌时出现异常!',
                                                                    icon: const Icon(Icons.person,
                                                                        color: Colors.white),
                                                                    snackPosition: SnackPosition.BOTTOM,
                                                                  );
                                                                }
                                                              },
                                                              child: const Text(
                                                                "注册或登录玩家",
                                                                style: TextStyle(color: Colors.white),
                                                              ),
                                                            ),
                                                          ),
                                                          Text('当前玩家: $_playerId'),
                                                          TextField(
                                                            decoration: const InputDecoration(
                                                                hintText: '交易UID'),
                                                            controller: _txtTransactionId,
                                                          ),
                                                          TextField(
                                                            decoration: const InputDecoration(
                                                                hintText: '金额'),
                                                            controller: _txtAmount,
                                                          ),
                                                          TextField(
                                                            decoration: const InputDecoration(
                                                                hintText: '货币'),
                                                            controller: _txtCurrency,
                                                          ),
                                                          TextField(
                                                            decoration: const InputDecoration(
                                                                hintText: '硬币'),
                                                            controller: _txtCoins,
                                                          ),
                                                          TextField(
                                                            decoration: const InputDecoration(
                                                                hintText: '参考'),
                                                            controller: _txtRefernce,
                                                          ),
                                                          TextField(
                                                            decoration: const InputDecoration(
                                                                hintText: '备注'),
                                                            controller: _txtRemarks,
                                                          ),
                                                          SizedBox(
                                                            width: 320.0,
                                                            child: ElevatedButton(
                                                              onPressed: () async {
                                                                try {
                                                                  Transaction trx = Transaction(
                                                                      uid: _txtTransactionId.text,
                                                                      amount: double.parse(_txtAmount.text),
                                                                      currency: _txtCurrency.text,
                                                                      coins: int.parse(_txtCoins.text),
                                                                      reference: _txtRefernce.text);
                                                                  trx.remarks = _txtRemarks.text;
                                                                  Config walletConfig = Config(
                                                                      operatorId: operatorId,
                                                                      clientId: walletClientId,
                                                                      clientSecret: walletClientSecret,
                                                                      server: server,
                                                                      static: static);
                                                                  var newTransaction = await _gameolivePlugin.depositToPlayerAccount(_playerId, trx, walletConfig);
                                                                  setState(() {
                                                                    _playerBalance = newTransaction;
                                                                  });
                                                                } catch (ex) {
                                                                  Get.snackbar(
                                                                    '创建玩家交易时出现异常!',
                                                                    '创建玩家交易时出现异常!',
                                                                    icon: const Icon(Icons.person,
                                                                        color: Colors.white),
                                                                    snackPosition: SnackPosition.BOTTOM,
                                                                  );
                                                                }
                                                              },
                                                              child: const Text(
                                                                "向玩家钱包存款",
                                                                style: TextStyle(color: Colors.white),
                                                              ),
                                                            ),
                                                          ),
                                                        ],
                                                      ),
                                                    ),
                                                  );
                                                });
    
                                            if (kDebugMode) {
                                              print('分享');
                                            }
                                          },
                                        ),
                                      ],
                                      secondaryActions: <Widget>[
                                        IconSlideAction(
                                          caption: '内联',
                                          color: Colors.blue,
                                          icon: Icons.more_horiz,
                                          onTap: () async {
                                            LaunchConfig launchConfig = LaunchConfig();
                                            launchConfig.server = server;
                                            launchConfig.static = static;
                                            launchConfig.operatorId = operatorId;
                                            launchConfig.configId = item.configuration;
                                            launchConfig.playerId = _playerId;
                                            launchConfig.playerToken = _playerToken;
                                            setState(() {
                                              inlineLaunchConfig = launchConfig;
                                            });
                                          },
                                        ),
                                        IconSlideAction(
                                          caption: '重定向',
                                          color: Colors.black45,
                                          icon: Icons.arrow_forward,
                                          onTap: () {
                                            LaunchConfig launchConfig = LaunchConfig();
                                            launchConfig.server = server;
                                            launchConfig.static = static;
                                            launchConfig.operatorId = operatorId;
                                            launchConfig.configId = item.configuration;
                                            launchConfig.orientation = "landscape";
                                            launchConfig.orientationOnExit = "landscape";
                                            launchConfig.currency = "DEMO";
                                            launchConfig.playerId = _playerId;
                                            launchConfig.playerToken = _playerToken;
                                            Navigator.push(
                                                context,
                                                MaterialPageRoute(
                                                  builder: (context) => GameOliveView(
                                                      instance: _gameolivePlugin,
                                                      launchConfig: launchConfig,
                                                      onGoToHome: (value) {
                                                        Navigator.pop(context);
                                                      },
                                                      onBalanceChange: (balace) {
                                                        debugPrint("余额更新");
                                                      },
                                                      onUserAchievementsUpdate: (achievements) {
                                                        debugPrint("成就更新");
                                                      },
                                                      onGameOliveWindowCreated: (GameOliveGameController gamecontroller) {
                                                        gamecontroller.openGameMenu();
                                                      }),
                                                ));
                                          },
                                        ),
                                        IconSlideAction(
                                          caption: '对话框',
                                          color: Colors.indigo,
                                          icon: Icons.add_to_photos,
                                          onTap: () {
                                            LaunchConfig gameLaunchConfig = LaunchConfig();
                                            gameLaunchConfig.server = server;
                                            gameLaunchConfig.static = static;
                                            gameLaunchConfig.operatorId = operatorId;
                                            gameLaunchConfig.configId = item.configuration;
                                            gameLaunchConfig.playerId = _playerId; // 玩家唯一ID
                                            gameLaunchConfig.playerToken = _playerToken; // 玩家唯一令牌
    
                                            showDialog(
                                                context: context,
                                                builder: (BuildContext context) {
                                                  return GameDialogBox(
                                                      instance: _gameolivePlugin,
                                                      gameLaunchConfig: gameLaunchConfig);
                                                });
                                          },
                                        ),
                                      ],
                                      child: Container(
                                        color: Colors.white,
                                        child: ListTile(
                                          leading: const Text('<'),
                                          title: Text(item.title ?? ""),
                                          trailing: const Text('滑动 >'),
                                          subtitle: Column(
                                            mainAxisAlignment: MainAxisAlignment.start,
                                            crossAxisAlignment: CrossAxisAlignment.start,
                                            children: [
                                              Text(item.configuration ?? ""),
                                              Text('启用: ${item.enabled}'),
                                              Text('标签: ${item.label}'),
                                              Text('评分: ${item.rating}'),
                                              Text('玩家数量: ${item.playerCount}'),
                                              Text('描述: ${item.description}')
                                            ],
                                          ),
                                        ),
                                      ),
                                    );
                                  })),
                        ],
                      )),
      );
    }
    

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

1 回复

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


在Flutter游戏开发中,gameolive 是一个相对较为专业的插件,用于简化游戏开发中的一些常见任务。虽然 gameolive 可能不像一些主流框架那样广泛认知,但它在某些特定场景下可以提供很大的帮助。以下是一个使用 gameolive 插件进行简单游戏开发的代码示例。

请注意,由于 gameolive 可能不是官方插件或广泛使用的第三方插件,具体的API和实现可能会有所不同。以下代码是基于假设的API结构编写的,旨在展示如何集成和使用该插件。如果 gameolive 有具体的文档或GitHub仓库,请参考官方文档获取最新和准确的API信息。

1. 添加依赖

首先,在 pubspec.yaml 文件中添加 gameolive 插件的依赖:

dependencies:
  flutter:
    sdk: flutter
  gameolive: ^x.y.z  # 替换为实际版本号

2. 导入插件

在你的 Dart 文件中导入 gameolive 插件:

import 'package:gameolive/gameolive.dart';

3. 初始化插件

在你的主文件中(通常是 main.dart),初始化 gameolive 插件:

void main() {
  WidgetsFlutterBinding.ensureInitialized();
  GameOlive.instance.init();  // 假设有一个init方法用于初始化
  runApp(MyApp());
}

4. 使用插件功能

假设 gameolive 插件提供了加载和显示精灵(sprite)的功能,以下是如何在Flutter中使用这些功能的示例:

import 'package:flutter/material.dart';
import 'package:gameolive/gameolive.dart';

class MyGameScreen extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Game Olive Example'),
      ),
      body: Center(
        child: Stack(
          children: <Widget>[
            // 假设有一个显示精灵的组件
            GameOliveSpriteWidget(
              spritePath: 'assets/sprites/hero.png',  // 精灵图片路径
              position: Offset(100, 100),  // 精灵位置
            ),
          ],
        ),
      ),
    );
  }
}

class GameOliveSpriteWidget extends StatelessWidget {
  final String spritePath;
  final Offset position;

  GameOliveSpriteWidget({required this.spritePath, required this.position});

  @override
  Widget build(BuildContext context) {
    // 假设GameOlive有一个loadSprite方法用于加载精灵
    final sprite = GameOlive.instance.loadSprite(spritePath);

    // 使用自定义绘制逻辑来显示精灵
    return CustomPaint(
      painter: GameOliveSpritePainter(sprite: sprite, position: position),
      size: Size.infinite,  // 根据需要调整大小
    );
  }
}

class GameOliveSpritePainter extends CustomPainter {
  final Sprite sprite;
  final Offset position;

  GameOliveSpritePainter({required this.sprite, required this.position});

  @override
  void paint(Canvas canvas, Size size) {
    final paint = Paint()
      ..isAntiAlias = true;

    // 假设sprite有一个drawImage方法
    canvas.drawImage(sprite.image, position.dx, position.dy, paint);
  }

  @override
  bool shouldRepaint(covariant CustomPainter oldDelegate) {
    return false;  // 根据需要调整
  }
}

// 假设Sprite是一个简单的类,包含加载的图像
class Sprite {
  late ImageProvider image;

  Sprite(String path) {
    // 加载图像,这里只是一个示例,实际可能需要异步加载
    image = AssetImage(path);
  }
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Game Olive Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MyGameScreen(),
    );
  }
}

注意事项

  1. 异步加载:实际开发中,精灵图像通常是通过异步方式加载的,你可能需要使用 ImageProviderFutureBuilder 或其他异步机制来处理。
  2. 性能优化:游戏开发中性能至关重要,确保你的精灵和绘制逻辑是高效的。
  3. 插件文档:始终参考 gameolive 插件的官方文档,因为API可能会变化,并且可能有更多的功能和最佳实践指南。

由于 gameolive 插件的具体API和实现细节未知,以上代码是基于假设编写的。请务必查阅插件的官方文档或源代码,以获取准确和最新的使用方法。

回到顶部