java steam_Java,Steam控制器和我

java steam

您是否想过是否可以将现有的东西用于新的东西? 我看了一些所谓的“蒸汽控制器”(从现在开始为SC)的镜头,并看着我的游戏手柄。 问我自己是否有可能以类似蒸汽的方式使用它,我找到了一些Java库并创建了一个项目,今天想与您共享。

SteamController 当然,在SC发行之前很久就有很多输入设备(尤其是游戏控制器),但是它具有一个新特性,使其与众不同。

它有两个触摸板,可以模拟鼠标或键盘的输入,以便能够(实际上几乎)玩每个游戏。 如一些早期视频所示,通过使用这种兼容模式,即使像益智游戏“ Portal”之类的鼠标密集型游戏也似乎可以玩。
steamworkshop_webupload_previewfile_172072817_preview 作为游戏发烧友和Java程序员,我如何使用这样的东西(我已经拥有的XBOX控制器)来接近它?

一个名为“ StrangeCtrl”的小工具看到了世界的亮光。 与控制器对话需要一些JNI(例如,因为JVM中没有USB子系统),但是其余部分则用纯Java编写。 它位于系统托盘中,并且针对每个配置文件进行了手动配置,尽管也可以构建一个GUI。

它的依存关系是2.0.5版中的“ net.java.jinput.JInput”(仍适用于Windows 8.1)和我编写的一个小助手(“ com.xafero.SuperLoader” v0.1)。 现在,我将解释在此过程中采取的步骤。

第一步:我们如何让Java与我的控制器对话?

幸运的是,BSD许可的JInput项目正是这样做的。 例如,它连接到Microsoft的XInput接口,并用它获取的本机数据填充某些Java数据结构。 也涵盖Linux和Mac OS X,不用担心。

所以我插入了游戏手柄(一个兼容XBOX的控制器),方法似乎很清楚:

  1. 得到控制器
  2. 得到他们的输入事件
  3. 并将它们转换为键盘和鼠标的虚拟事件。

三大操作系统的库的本机组件以Java归档文件提供(至少每个Maven)。 但是,您可能已经知道,java.lang.System仅加载文件系统上直接可用的文件。

第二步:那么如何解决这个烦人的局限性呢?

快速搜索后,我发现wcmatthysen的“ mx-native-loader”似乎很有用,因为它声称可以提取JAR并加载本地内容。 但这没有用,因为JInput的库被打包到几个“ jinput-platform-***。jar”文件中,而不是如该加载程序所建议的那样在META-INF / lib下打包了一大块。

因此,名为“ SuperLoader”的新帮助程序库可以在以下情况下工作:

  1. 为所有讨厌的本机库创建一个临时目录,例如,借助系统属性“ java.io.tmpdir”。 用户也可以直接指定它,因为它实际上并不重要。
  2. 从已经加载的JAR中获取所有讨厌的库; 遍历所有类路径的URL并通过使用过滤器将其提取或排除其中的大多数。
  3. 扩展现有的库路径; 另一个库没有做的一件事,并且手动进行非常烦人,因此应该扩展系统属性“ java.library.path”。
  4. 强制JVM更新系统路径; 可以通过将系统类加载器的“ sys_paths”字段重置为null来实现。 这迫使System类在您下次请求库时真正欣赏新情况。

现在,该应用程序将所有本机库预加载到一个临时文件夹中,例如,当要求JInput提供控制器列表时,不必为使用JAR文件而对其进行更改。 它完全可以像任何人一样使用System.loadLibrary。

第三步:可以模拟什么?

我们终于要阅读游戏手柄的事件,那么我们该怎么办呢? 使用AWT的Robot类,自Java早期以来就可以模拟按键或鼠标移动等。 尽管机器人需要一个人来指定应该在其上工作的桌面,但它在多显示器系统上也可以正常工作。 唯一的区别是它生成的所有事件的偏移量–如果要单击PC屏幕的特定区域,这一点尤其重要。

到目前为止已实现的命令是:

  • MouseMoveCmd –水平或垂直移动鼠标一定量
  • MouseClickCmd –在当前屏幕位置单击给定的鼠标按钮
  • KeyComboCmd –按一些键并以相反的顺序释放它们

为了实现某种程度的可扩展性,有一个接口可以接受机器人生成虚拟事件,当前图形设备以及JInput给出的值:

public interface ICommand {void execute(Robot rbt, GraphicsDevice dev, float value);
}

它的抽象实现“ AbstractCmd”提供了一个接受一个字符串的构造函数。 作为处理的第一步,来自配置文件的原始字符串被一个空白分隔为一个字符串数组。

第四步:我们可以使用哪种配置格式?

有很多流行的格式,例如YAML,JSON等。但是Java已经为我们提供了一种简单的方法来实现这一目标。 因此,使用Java属性机制的XML变体来解析配置文件。 要使用与命令连接的字符串构建实际的地图,请使用“ com.xafero.strangectrl.cmd.ConfigUtils”类

  • 加载配置,
  • 遍历所有条目,
    • 通过每个条目的值搜索命令,
  • 并生成用于转换传入事件的实际地图。

第五步:实际工作

辅助类“ ControllerPoller”是一个定期执行的TimerTask,负责从任意数量的控制器中收集新的JInput事件,并将每一个新内容通知调用者:

public void run() {
for (Controller controller : controllers) {
if (!controller.poll()) continue;
EventQueue queue = controller.getEventQueue();
Event event = new Event();
while (queue.getNextEvent(event))
callback.onNewEvent(this, controller, event);
}
}

调用方(在这种情况下,位于系统托盘中的所谓“ App”)仅实现回调接口,并在发生任何输入时免费获取所有信息:

public static interface IControllerCallback {
void onNewEvent(ControllerPoller p, Controller c, Event e);
}

“应用程序”的左侧是搜索与传入游戏手柄事件相关联的命令,并使用正确的参数执行这些命令。 现在我们可以用它来控制某些游戏,也许是波斯王子之类的旧游戏,或者是其他无法通过游戏手柄玩的游戏。 但是,让我们走开...

除了游戏以外的示例:如何为行动受限的人配置它?

为了仅显示另一个可能的应用程序领域,让我们为无法同时按下两个键的用户进行配置。 一个示例应用程序应该是Web浏览器。 在配置文件中,有以下设置:

<!-- Button A means now left mouse click -->
<entry key="Button 0">mouseClick 1</entry>
<!-- Button B will open a new tab -->
<entry key="Button 1">keyCombo CONTROL T</entry>
<!-- Button X will close an existing tab -->
<entry key="Button 2">keyCombo CONTROL W</entry>

此示例中的浏览器不必知道游戏控制器,因为操作系统将产生新的虚拟输入事件,并且将按要求运行。 通过使用Java并成为FOSS,该工具还可以进行自定义并且易于以各种方式理解(与模拟输入设备否则必须使用某些C / C ++代码相比)。

资源和链接

源代码位于https://github.com/xafero/StrangeCtrl 。 随时使用,共享或修改任何方面(根据GPL v3许可)。

有关更多信息,请参见:

  • JInput- https: //java.net/projects/jinput
  • AWT机器人-http: //docs.oracle.com/javase/6/docs/api/java/awt/Robot.html

参考: Java,Steam控制器和Java,来自我们JCG合作伙伴 Xafero的Java Advent Calendar博客。

翻译自: https://www.javacodegeeks.com/2014/01/java-the-steam-controller-and-me.html

java steam

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/345636.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何在STS中创建Spring Boot项目

你好朋友&#xff0c; 在本教程中&#xff0c;我们将逐步介绍如何在STS&#xff08;Spring工具套件&#xff09;中创建Spring Boot项目。 步骤1&#xff1a; 如果您尚未从相应的操作系统的以下链接中下载Spring工具套件&#xff0c;请下载&#xff1a; https://spring.io/to…

置信区间(confidence interval)

要理解置信区间&#xff0c;就要从统计学最基本最核心的思想去思考&#xff0c;那就是用样本估计总体。 置信水平(Confidence level)是指总体参数值落在样本统计值某一区内的概率&#xff1b; 而置信区间&#xff08;confidence interval&#xff09;是指在某一置信水平下&…

卫星运动轨道

地球的自转轴与地球公转平面并不垂直&#xff0c;因此&#xff0c;黄道面和地球赤道面并不重合&#xff0c;而是有大约23.4的夹角&#xff0c;通常被称为黄赤交角&#xff0c;也称为转轴倾角、倾角&#xff08;obliquity&#xff09;或轴交角&#xff08;axial inclination&…

随机过程:指数分布、泊松过程、更新过程(renewal process)+大数定律

笔记主要基于中文版《应用随机过程 Introduction to Probability Models 》(Sheldon M. Ross)&#xff0c;只有非常少的一部分是我自己的注解。写这个笔记的目的是自己复习用&#xff0c;阅读需要一定的微积分和概率论基础。本人为初学者&#xff0c;且全部为自学&#xff0c;如…

接受拒绝采样(Acceptance-Rejection Sampling)

我们所说的抽样&#xff0c;其实是指从一个概率分布中生成观察值&#xff08;observations&#xff09;的方法。而这个分布通常是由其概率密度函数&#xff08;PDF&#xff09;来表示的。而且&#xff0c; 即使在已知PDF的情况下&#xff0c;让计算机自动生成观测值也不是一件容…

gradle文件不识别_识别Gradle约定

gradle文件不识别通过约定进行配置具有许多优点&#xff0c;尤其是在简洁方面&#xff0c;因为开发人员不需要显式配置通过约定隐式配置的内容。 但是&#xff0c;在利用约定进行配置时&#xff0c;需要注意这些约定。 这些约定可能已记录在案&#xff0c;但是当我可以编程方式…

Telesat、OneWeb及SpaceX三个全球宽带低轨卫星星座系统的技术对比

编者按&#xff1a;本文来自微信公众号“卫星与网络”&#xff08;ID&#xff1a;satnetdy&#xff09;&#xff0c;作者Inigo del Portilloa,*, Bruce G. Cameronb, Edward F. Crawleyc&#xff0c;编译 刘帅军、胡月梅&#xff08;中科院软件所&#xff09;&#xff0c;36氪经…

腾讯人均每月薪酬成本超8万元,员工总数首次超10万

11月10日&#xff0c;腾讯在23岁“生日”即将到来之际发布2021年第三季度业绩报告。财报显示&#xff0c;第三季度腾讯总收入为人民币1424亿元&#xff08;220亿美元 &#xff09;&#xff0c;同比增长13%&#xff1b;净利润(Non-IFRS&#xff09;317.5亿元&#xff0c;同比减少…

低轨卫星通信系统发展综述

最近几年低轨移动通信领域风起云涌&#xff0c;Iridium、OneWeb、Boeing、SpaceX 这些商业航天的 独角兽 都先后实施或宣布自己在这一领域雄心勃勃的计划。 通信、导航和遥感是卫星应用领域的三驾马车&#xff0c;简称 通导遥。鉴于任务特性&#xff0c;通信卫星和导航卫星通常…

创建您的第一个servlet

在本教程中&#xff0c;我们将学习如何使用Servlet创建非常基本的Web应用程序。 Servlet是一类&#xff0c;扩展了服务器拦截和响应传入请求的功能。 Servlet是一个Web组件&#xff0c;可在服务器上进行编写&#xff0c;构建和部署&#xff0c;以创建动态Web页面。 首先&…

StarLink星座最新动态及星间组网动态路由探讨

StarLink星座最新动态及星间组网动态路由探讨 2020-06-24 11:50 StarLink星座最新动态及星间组网动态路由探讨 作者 | 刘帅军、徐帆江、刘立祥、范媛媛、王大鹏 &#xff08;中国科学院软件研究所&#xff0c;天基综合信息系统重点实验室&#xff09; 一 概述 自2020年6月开…

累计分布函数CDF、互补累计分布函数CCDF、期望Expection

1 CDF 累积分布函数(Cumulative Distribution Function&#xff0c;CDF)&#xff0c;又叫分布函数&#xff0c;是概率密度函数的积分&#xff0c;能完整描述一个实随机变量X的概率分布。一般以大写CDF标记,&#xff0c;与概率密度函数probability density function&#xff08…

markov chain, MRP MDP

在强化学习中&#xff0c;马尔科夫决策过程&#xff08;Markov decision process, MDP&#xff09;是对完全可观测的环境进行描述的&#xff0c;也就是说观测到的状态内容完整地决定了决策的需要的特征。几乎所有的强化学习问题都可以转化为MDP。本讲是理解强化学习问题的理论基…

(网络)流和会话

流:指具有相同五元组(源IP,源端口,目的IP,目的端口,协议)的所有包 会话:指由双向流组成的所有包(源和目的互换)

Filtration, σ-algebras

1. Filtration filtration在钱敏平老师和龚光鲁老师的《随机过程论》中直接称其为非降的KaTeX parse error: Undefined control sequence: \sigmma at position 1: \̲s̲i̲g̲m̲m̲a̲代数族。如图。 一般叫σ\sigmaσ-代数流或σ\sigmaσ-域流 在鞅论中的花体FtF_tFt​&…

gradle 命令行_Gradle命令行便利

gradle 命令行在我的《用Gradle构建Java的gradle tasks 》一文中&#xff0c;我简要提到了使用Gradle的“ gradle tasks ”命令来查看特定Gradle构建的可用任务。 在这篇文章中&#xff0c;我将对这一简短提及进行更多的扩展&#xff0c;并查看一些相关的Gradle命令行便利。 Gr…

怎样更好地理解并记忆泰勒展开式

本段的核心思想是仿造。当我们想要仿造一个东西的时候&#xff0c;无形之中都会按照上文提到的思路&#xff0c;即先保证大体上相似&#xff0c;再保证局部相似&#xff0c;再保证细节相似&#xff0c;再保证更细微的地方相似……不断地细化下去&#xff0c;无穷次细化以后&…

新的DMN编辑器预览

Workbench 7.13.0.Final于10月16日星期二发布&#xff0c;此版本带来了许多有趣的功能和重要的修复程序。 亮点之一是作为技术预览功能的新DMN编辑器&#xff0c;该功能仍在开发中&#xff0c;但您可以开始使用。 在本文中&#xff0c;您将学习如何启用DMN编辑器预览&#xff…

指数矩阵(exponential matrix)

类似于指数ex……e^x……ex……的本质是一种近似&#xff0c;eAt……e^{At}……eAt……是同样原理。 http://www.mashangxue123.com/%E7%BA%BF%E6%80%A7%E4%BB%A3%E6%95%B0/1756604500.html

Boole‘s,Doob‘s inequality,中心极限定理Central Limit Theorem,Kolmogorov extension theorem, Lebesgue‘s domin

1. Boole’s inequality In probability theory, Boole’s inequality, also known as the union bound, says that for any finite or countable set of events, the probability that at least one of the events happens is no greater than the sum of the probabilities …