Flutter游戏手柄支持插件gamepads_platform_interface的使用

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

Flutter游戏手柄支持插件gamepads_platform_interface的使用

简介

gamepads 是一个Flutter插件,用于处理多个平台上的游戏手柄(或操纵杆)输入。它支持同时连接多个游戏手柄,并会自动检测和监听新连接。

快速开始

列出当前连接的游戏手柄

import 'package:gamepads/gamepads.dart';

void main() async {
  final gamepads = await Gamepads.list();
  for (var gamepad in gamepads) {
    print('Gamepad ID: ${gamepad.id}, Name: ${gamepad.name}');
  }
}

监听所有游戏手柄的输入事件

import 'package:gamepads/gamepads.dart';

void main() {
  Gamepads.events.listen((event) {
    print('Gamepad ID: ${event.gamepadId}, Key: ${event.key}, Value: ${event.value}');
  });
}

监听特定游戏手柄的输入事件

import 'package:gamepads/gamepads.dart';

void main() async {
  final gamepads = await Gamepads.list();
  if (gamepads.isNotEmpty) {
    final specificGamepadId = gamepads.first.id;
    Gamepads.eventsByGamepad(specificGamepadId).listen((event) {
      print('Gamepad ID: ${event.gamepadId}, Key: ${event.key}, Value: ${event.value}');
    });
  }
}

GamepadEvent 数据类

class GamepadEvent {
  final String gamepadId; // 游戏手柄ID
  final int timestamp; // 时间戳,以毫秒为单位
  final KeyType type; // 键类型
  final String key; // 平台相关的键标识符
  final double value; // 键的当前值
}

下一步计划

该库仍在开发中,API可能会有所变化。我们计划添加更多功能,例如:

  • 监听游戏手柄的连接/断开事件
  • 获取游戏手柄的当前状态
  • 添加对Web和移动设备的支持

如果你有兴趣帮助开发,请通过GitHub或我们的Discord服务器联系我们。

Android集成

Android实现要求应用程序的Activity将输入事件(和输入设备)转发给插件。以下是一个干净的Flutter项目的MainActivity示例,已实现所需的样板代码。

package [YOUR_PACKAGE_NAME]

import android.hardware.input.InputManager
import android.os.Handler
import android.view.InputDevice
import android.view.KeyEvent
import android.view.MotionEvent
import io.flutter.embedding.android.FlutterActivity
import org.flame_engine.gamepads_android.GamepadsCompatibleActivity

class MainActivity: FlutterActivity(), GamepadsCompatibleActivity {
    var keyListener: ((KeyEvent) -> Boolean)? = null
    var motionListener: ((MotionEvent) -> Boolean)? = null

    override fun dispatchGenericMotionEvent(motionEvent: MotionEvent): Boolean {
        return motionListener?.invoke(motionEvent) ?: false
    }
    
    override fun dispatchKeyEvent(keyEvent: KeyEvent): Boolean {
        return keyListener?.invoke(keyEvent) ?: false
    }

    override fun registerInputDeviceListener(
      listener: InputManager.InputDeviceListener, handler: Handler?) {
        val inputManager = getSystemService(INPUT_SERVICE) as InputManager
        inputManager.registerInputDeviceListener(listener, null)
    }

    override fun registerKeyEventHandler(handler: (KeyEvent) -> Boolean) {
        keyListener = handler
    }

    override fun registerMotionEventHandler(handler: (MotionEvent) -> Boolean) {
        motionListener = handler
    }
}

支持项目

你可以通过以下方式支持该项目:

  • 给项目点个星⭐
  • 通过OpenCollective捐赠
  • 通过GitHub Sponsors赞助
  • 在Patreon上成为赞助者

Donate via OpenCollective GitHub Sponsor Become a Patron


以上内容展示了如何在Flutter应用中使用gamepads插件来处理游戏手柄输入。希望这个示例对你有所帮助!


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

1 回复

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


当然,下面是一个关于如何使用Flutter的gamepads_platform_interface插件来支持游戏手柄的示例代码。这个插件是Flutter游戏手柄支持的一部分,它提供了一个平台接口,允许开发者在Flutter应用中与游戏手柄进行交互。

请注意,gamepads_platform_interface本身是一个接口定义,通常你会使用实现了这个接口的具体插件,比如gamepad插件。这里我将展示如何使用gamepad插件来检测和处理游戏手柄输入。

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

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

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

接下来,在你的Flutter应用中,你可以按照以下步骤来使用游戏手柄:

  1. 导入必要的包
import 'package:flutter/material.dart';
import 'package:gamepad/gamepad.dart';
  1. 创建一个游戏手柄监听器
class _MyHomePageState extends State<MyHomePage> {
  Gamepad? _gamepad;
  List<GamepadButton> _pressedButtons = [];

  @override
  void initState() {
    super.initState();
    _initGamepad();
  }

  @override
  void dispose() {
    _disposeGamepad();
    super.dispose();
  }

  void _initGamepad() {
    GamepadManager.instance.gamepadConnected.listen((gamepad) {
      setState(() {
        _gamepad = gamepad;
        _pressedButtons = [];
      });
      gamepad.buttonsChanged.listen((buttons) {
        setState(() {
          _pressedButtons = buttons.where((button) => button.pressed).toList();
        });
      });
    });
  }

  void _disposeGamepad() {
    _gamepad?.buttonsChanged.cancel();
    GamepadManager.instance.gamepadConnected.cancel();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Gamepad Support'),
      ),
      body: Center(
        child: _gamepad == null
            ? Text('No gamepad connected.')
            : Column(
                mainAxisAlignment: MainAxisAlignment.center,
                children: <Widget>[
                  Text('Connected Gamepad: ${_gamepad!.id}'),
                  Text('Pressed Buttons: $_pressedButtons'),
                ],
              ),
      ),
    );
  }
}
  1. 在你的主文件中使用这个状态类
import 'package:flutter/material.dart';
import 'package:your_app_name/your_gamepad_page.dart'; // 替换为你的文件名

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

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

class MyHomePage extends StatefulWidget {
  @override
  _MyHomePageState createState() => _MyHomePageState();
}

这个示例展示了如何初始化游戏手柄监听器,检测手柄连接,并处理按钮按下事件。当游戏手柄连接时,应用会显示手柄的ID和当前按下的按钮。

请注意,gamepad插件的具体API可能会随着版本更新而变化,因此请参考最新的插件文档以获取最准确的信息。此外,确保你的设备和操作系统支持游戏手柄,并且已经正确配置了手柄的驱动程序。

回到顶部