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,一经查实,立即删除!

相关文章

【渝粤题库】国家开放大学2021春2096经济法学题目

试卷代号&#xff1a;2096 2021年春季学期期末统一考试 经济法学 试题 2021年7月 一、单项选择题&#xff08;每小题1分&#xff0c;共10分。在每小题的四个备选答案中&#xff0c;选出一个正确的答案&#xff0c;请将正确答案的序号填在括号内&#xff09; 1.能够体现经济法的…

【渝粤题库】国家开放大学2021春2108刑法学(2)题目

试卷代号&#xff1a;2108 2021年春季学期期末统一考试 刑法学(2) 试题 2021年7月 一、选择题&#xff08;每小题的备选答案中至少有一个是正确的&#xff0c;请将正确答案的序号字母填入题目括号内。多选、少选均不得分。每小题3分&#xff0c;共21分&#xff09; 1.信用卡诈骗…

如何在STS中创建Spring Boot项目

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

【渝粤题库】国家开放大学2021春2175市场营销学题目

试卷代号&#xff1a;2175 2021年春季学期期末统一考试 市场营销学 试题 2021年7月 注意事项 一、将你的学号、姓名及分校&#xff08;工作站&#xff09;名称填写在答题纸的规定栏内。考试结束后&#xff0c;把试卷和答题纸放在桌上。试卷和答题纸均不得带出考场。监考人收完考…

置信区间(confidence interval)

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

【渝粤题库】国家开放大学2021春2223物业管理财税基础题目

试卷代号&#xff1a;2223 2021年春季学期期末统一考试 物业管理财税基础 试题&#xff08;开卷&#xff09; 2021年7月 一、单项选择题&#xff08;每题2分&#xff0c;共20分) 1.以下属于零基预算优点的是( )。 A.简单、相对稳定. B.扩大了预算的适用范围&#xff0c;便于预算…

【渝粤题库】国家开放大学2021春2246社会工作概论题目

试卷代号&#xff1a;2246 2021年春季学期期末统一考试 社会工作概论 试题 2021年7月 一、单选题&#xff08;下列选项中只有一个是正确的&#xff0c;将正确的答案序号填写在括号内。共10题&#xff0c;每题2分&#xff0c;共计20分&#xff09; 1.下列选项中属于社会工作直接…

卫星运动轨道

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

【渝粤题库】国家开放大学2021春2322物流信息技术题目

试卷代号&#xff1a;2322 2021年春季学期期末统一考试 物流信息技术 试题 2021年7月 一、单项选择题&#xff08;每小题1分&#xff0c;共10分&#xff0c;将正确答案选项的字母填入括号内&#xff09; 1.全球卫星定位系统也称为( )技术。 A.EDI B.CAD C.GIS D.GPS 2.条码识读…

how2java_HOW TO:构造Java类的原型

how2java在这篇HowTo帖子中&#xff0c;我将展示如何将一个类与另一个类一起定型。 为什么这有用&#xff1f; 当您的项目中发生许多BCI时&#xff0c;让每个开发人员编写BCI代码都是不明智的。 首先&#xff0c;这不会抽象出所使用的BCI库。 鉴于Java不支持多重继承&#xff…

【渝粤题库】国家开放大学2021春2410中国古代文学(B)(2)题目

试卷代号&#xff1a;2410 2021年春季学期期末统一考试 中国古代文学(B)(2) 试题&#xff08;开卷&#xff09; 2021年7月 一、填空&#xff08;每空1分&#xff0c;共20分&#xff09; 1.“疏影横斜水清浅&#xff0c;暗香浮动月黄昏”是宋代隐士诗人__________的咏梅绝唱《山…

关于半马尔可夫(semi-markov)的一个形象解释

青蛙在荷叶上跳动&#xff0c;在每个不同的荷叶上表示不同的状态&#xff0c;从一个荷叶跳到另一个荷叶表示状态的转移&#xff0c;该转移过程只依赖于现在所处荷叶&#xff0c;而与以前呆过的荷叶无关&#xff0c;如果只考虑青蛙跳跃的时刻序列&#xff0c;这个过程就是离散时…

【渝粤题库】国家开放大学2021春2502学前儿童发展心理学题目

试卷代号&#xff1a;2502 2021年春季学期期末统一考试 学前儿童发展心理学 试题 2021年7月 一、选择题&#xff08;每题2分&#xff0c;共20分&#xff09; 1.学前儿童心理学是研究( )儿童心理发展规律的科学。 A.0-8、9岁 B.0-3岁 C.0-6岁 D.0-13、14岁 2.对一组或一个儿童进…

Java 8 Stream示例

这篇文章将帮助您了解Java 8中一些重要且经常使用的Stream操作&#xff0c;这使您使用Java编程变得容易。 让我们以传统示例为例&#xff0c;“员工和部门”。 public class Employee {private String name;private Integer age;private String city;private Department depa…

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

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

【渝粤题库】国家开放大学2021春2072人文社会科学基础(A)答案

试卷代号&#xff1a;2072 2 0 2 1年春季学期期末统一考试 人文社会科学基础(A) 试题答案及评分标准&#xff08;开卷&#xff09; &#xff08;供参考&#xff09; 2021年7月 一、名词解释&#xff08;共3道题&#xff0c;每题10分&#xff0c;共30分&#xff09; 1&#xff0…

接受拒绝采样(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;同比减少…