如何在 Linux 中从 Mono/C# 访问游戏杆/游戏手柄?

Posted

技术标签:

【中文标题】如何在 Linux 中从 Mono/C# 访问游戏杆/游戏手柄?【英文标题】:How to access a joystick/gamepad from Mono/C# in Linux? 【发布时间】:2013-03-20 20:38:39 【问题描述】:

我正在运行 Debian 的 Raspberry Pi 上使用 C# 开发一个机器人项目。我得到了一个与操作系统配对的 PS3 DualShock 控制器,因此它显示为操纵杆设备 /dev/input/js0。

现在我想从 C# 代码访问 DualShock 操纵杆和按钮。这似乎比我预期的更难(或至少更模糊)——我发现了对 OpenTK 的引用,它似乎至少处于昏迷状态,如果没有死的话;和 XNA,它可能会这样做,但包含的内容比我需要的要多(我担心所有这些都在我的 RPi 上工作),以及其他各种不太受支持的小型包装器项目。

作为一个同时使用 Mono、C# 和 Linux 的新手,我有点不知所措...关于在这种环境中读取 DualShock 状态的最简单/最佳方法有什么建议吗?

【问题讨论】:

你可以试试我的项目,它使用 GLFW 进行输入处理。我以前从未使用过 GLFW 来处理操纵杆输入,所以我们都可以从中学到一些东西。这是项目(您可以将 glfw 类和本机复制/粘贴到您的代码中):github.com/antonijn/Pencil.Gaming 谢谢,我一直在为其他项目寻找一个好的跨平台 C# 游戏库,但在 MonoGame 方面还没有走得太远。 Pencil.Gaming 看起来很有趣——我会试一试。我还会告诉你如何将它用于我的 Raspberry Pi 机器人项目! 【参考方案1】:

Monogame 是 XNA 的开源实现。它是跨平台的,并且确实以 Linux 为目标。你可以看看框架的Input Source Code 看看他们是怎么做的。

【讨论】:

【参考方案2】:

单声道游戏手柄事件通常是轮询的。下面是一个非常基本的代码,演示了检查按钮“A”的状态。

GamePadState gamePadState;

gamePadState = GamePad.GetState((PlayerIndex)0); //Palyer indices are from 0-3, basically indicate the gamepad index

if (gamePadState.Buttons.A == ButtonState.Pressed)

    //take action for button "A"
 

在访问其按钮/触发器/拇指杆状态值之前检查游戏手柄连接状态始终是一个好主意。

if (gamePadState.IsConnected)

    //check for button/trigger/thumbstick status

【讨论】:

【参考方案3】:

你应该看一下directinput,但那是针对windows的,但是现在有一个将它包装到c#的库。它叫做 slimDX,也许你可以让它工作

【讨论】:

它是 DirectX 的包装器,DirectX 是一种仅限 Windows 的技术;因此,研究在 Linux 上处理输入是没有用的。

以上是关于如何在 Linux 中从 Mono/C# 访问游戏杆/游戏手柄?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Linux 中从 XAMPP 访问 Windows Wamp64 www 目录以便于操作系统迁移

如何在应用程序中从网站加载 Flash 游戏?

Linux Mono C#错误:无法打开程序集'Bovine.csproj':文件不包含有效的CIL图像

如何在 iOS 中从 UIView 转移到 SKScene

在 Linux 中从 Java 或 Python 访问扫描器(或者其他的,如果它有技术动机的话)(但 Windows 会很好)

在ubuntu / Linux中从Shell脚本(启动)运行GamingAnywhere