Flutter Steamworks集成插件flame_steamworks的使用

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

Flutter Steamworks集成插件flame_steamworks的使用

flame_steamworks简介

flame_steamworks 是一个允许在Flutter中通过Steam API开发游戏的包。它结合了 steamworksflame,使得开发者可以轻松地将Steam功能集成到Flutter游戏中。

注意事项

⚠️ 目前由于Dart SDK的一个问题,此包仅支持Windows平台。不过,你可以通过使用 steamworks_gen 生成特定平台的API来绕过这个问题。

功能

该库的目标是尽可能全面地覆盖Steam API的功能。Steam API的功能可以分为以下三类:

  • 初始化和通用API
  • 异步回调
  • 异步调用结果

你可以从Steam官方文档中获取这些功能的详细信息。

要求

你需要 steam_api.dllsteam_api.lib 文件才能使用此包。你可以通过登录Steam合作伙伴页面下载SteamWorks SDK,或者直接使用示例项目中的文件。如果你选择从Steam下载,这些文件位于 redistributable_bin 文件夹下。

使用方法

Flame Game实例

首先,我们需要创建一个游戏实例。以下是创建游戏实例的代码:

import 'package:flame/game.dart';
import 'package:flame/keyboard.dart';
import 'package:flame_steamworks/flame_steamworks.dart';

class GameInstance extends FlameGame with KeyboardEvents, HasSteamClient {
  GameInstance() {
    init();  // 初始化Steam API
  }
}

注册回调

HasSteamClient 混入提供了一个简单的API来注册回调。你可以在代码的任何地方注册回调。例如,注册未读聊天消息更改的回调:

class GameInstance extends FlameGame with KeyboardEvents, HasSteamClient {
  GameInstance() {
    init();
    registerCallback<UnreadChatMessagesChanged>((data) {
      // 处理未读聊天消息更改
    });
  }
}

注册调用结果

HasSteamClient 混入还提供了一个简单的API来注册调用结果。调用结果与回调不同,在订阅调用结果之前,你需要先发起请求并订阅该请求的结果。例如,当按下空格键时,请求用户统计数据并订阅其结果:

class GameInstance extends FlameGame with KeyboardEvents, HasSteamClient {
  [@override](/user/override)
  KeyEventResult onKeyEvent(
    RawKeyEvent event,
    Set<LogicalKeyboardKey> keysPressed,
  ) {
    bool isKeyDown = event is RawKeyDownEvent;
    bool isSpace = keysPressed.contains(LogicalKeyboardKey.space);

    if (isSpace && isKeyDown) {
      CSteamId steamId = steamClient.steamUser.getSteamId();
      SteamApiCall callId = steamClient.steamUserStats.requestUserStats(steamId);

      registerCallResult<UserStatsReceived>(
        callId,
        (ptrUserStatus, hasFailed) {
          print("User stats received");
          print("GameId: ${ptrUserStatus.gameId}");
          print("SteamIdUser: ${ptrUserStatus.steamIdUser}");
        },
      );

      return KeyEventResult.handled;
    }
    return KeyEventResult.ignored;
  }
}

已发布的游戏

以下是使用此包在Steam上发布的部分游戏:

  • Omnichess

完整示例Demo

以下是一个完整的示例Demo,展示了如何使用 flame_steamworks 创建一个简单的Flutter游戏,并集成Steam API。

main.dart

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

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

game.dart

import 'package:flame/game.dart';
import 'package:flame/keyboard.dart';
import 'package:flame_steamworks/flame_steamworks.dart';

class GameInstance extends FlameGame with KeyboardEvents, HasSteamClient {
  GameInstance() {
    init();  // 初始化Steam API
  }

  [@override](/user/override)
  KeyEventResult onKeyEvent(
    RawKeyEvent event,
    Set<LogicalKeyboardKey> keysPressed,
  ) {
    bool isKeyDown = event is RawKeyDownEvent;
    bool isSpace = keysPressed.contains(LogicalKeyboardKey.space);

    if (isSpace && isKeyDown) {
      CSteamId steamId = steamClient.steamUser.getSteamId();
      SteamApiCall callId = steamClient.steamUserStats.requestUserStats(steamId);

      registerCallResult<UserStatsReceived>(
        callId,
        (ptrUserStatus, hasFailed) {
          print("User stats received");
          print("GameId: ${ptrUserStatus.gameId}");
          print("SteamIdUser: ${ptrUserStatus.steamIdUser}");
        },
      );

      return KeyEventResult.handled;
    }
    return KeyEventResult.ignored;
  }

  [@override](/user/override)
  void onLoad() {
    super.onLoad();
    // 注册未读聊天消息更改的回调
    registerCallback<UnreadChatMessagesChanged>((data) {
      print("Unread chat messages changed: ${data.unreadCount}");
    });
  }
}

更多关于Flutter Steamworks集成插件flame_steamworks的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter Steamworks集成插件flame_steamworks的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,以下是一个关于如何在Flutter项目中使用flame_steamworks插件的基本示例。flame_steamworks是一个Flutter插件,它允许你在Flutter应用中集成Steamworks的功能,通常用于游戏开发中的成就、统计、云存储等功能。

请注意,为了运行下面的代码,你需要确保你的Flutter环境已经设置好,并且已经添加了flame_steamworks依赖。此外,由于Steamworks涉及到Steam平台,你需要有Steam开发者账号并设置相应的应用。

1. 添加依赖

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

dependencies:
  flutter:
    sdk: flutter
  flame_steamworks: ^最新版本号 # 请替换为实际可用的最新版本号

然后运行flutter pub get来安装依赖。

2. 初始化Steamworks

在你的Flutter应用的入口文件(通常是main.dart)中,你需要初始化Steamworks。

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

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

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

class SteamworksDemo extends StatefulWidget {
  @override
  _SteamworksDemoState createState() => _SteamworksDemoState();
}

class _SteamworksDemoState extends State<SteamworksDemo> {
  Steamworks? steamworks;

  @override
  void initState() {
    super.initState();
    // 初始化Steamworks
    Steamworks.init(
      appId: '你的Steam应用ID', // 替换为你的Steam应用ID
      onInitialized: (steamworksInstance) {
        setState(() {
          steamworks = steamworksInstance;
          // 在这里可以处理Steamworks初始化后的逻辑
        });
      },
      onError: (error) {
        // 处理初始化错误
        print('Steamworks initialization error: $error');
      },
    );
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Flutter Steamworks Demo'),
      ),
      body: Center(
        child: steamworks == null
            ? Text('Initializing Steamworks...')
            : Column(
                mainAxisAlignment: MainAxisAlignment.center,
                children: [
                  Text('Steamworks Initialized'),
                  // 在这里添加其他使用Steamworks功能的UI组件
                ],
              ),
      ),
    );
  }
}

3. 使用Steamworks功能

一旦Steamworks初始化完成,你就可以使用它的各种功能了。例如,获取用户的SteamID:

// 在Steamworks初始化完成后,你可以调用这些方法
if (steamworks != null) {
  steamworks!.getUserId().then((userId) {
    print('Steam User ID: $userId');
  }).catchError((error) {
    print('Error getting user ID: $error');
  });
}

或者,检查某个成就是否解锁:

// 假设成就的名称为"ACH_EXAMPLE"
if (steamworks != null) {
  steamworks!.isAchievementUnlocked('ACH_EXAMPLE').then((isUnlocked) {
    print('Is achievement unlocked? $isUnlocked');
  }).catchError((error) {
    print('Error checking achievement: $error');
  });
}

注意事项

  1. Steamworks API密钥:确保你的Steamworks API密钥已经正确配置,并且你的应用已经在Steamworks平台上注册。
  2. 权限和安全性:处理用户数据和Steamworks API调用时,要注意权限和安全性问题。
  3. 错误处理:在调用Steamworks功能时,总是添加错误处理逻辑,以处理可能出现的各种错误情况。

这只是一个基本的示例,flame_steamworks插件提供了更多功能,你可以参考其官方文档来获取更多详细信息和高级用法。

回到顶部