日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > java >内容正文

java

Java,Steam控制器和我

發(fā)布時間:2023/12/3 java 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Java,Steam控制器和我 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

您是否想過是否可以將現(xiàn)有的東西用于新的東西? 我看了一些所謂的“蒸汽控制器”(從現(xiàn)在開始為SC)的鏡頭,并看著我的游戲手柄。 問我自己是否有可能以類似蒸汽的方式使用它,我找到了一些Java庫并創(chuàng)建了一個項目,今天想與您共享。

當(dāng)然,早在SC發(fā)行之前就已經(jīng)有很多輸入設(shè)備(尤其是游戲控制器),但是它具有一個新特性,使其與眾不同。

它具有兩個觸摸板,它們可以模擬鼠標(biāo)或鍵盤的輸入,以便能夠(實際上幾乎)玩每個游戲。 如一些早期視頻所示,通過使用這種兼容模式,即使像益智游戲“ Portal”之類的鼠標(biāo)密集型游戲也似乎可以玩。
作為游戲發(fā)燒友和Java程序員,我如何使用這樣的東西(我已經(jīng)擁有的XBOX控制器)來接近它?

一個名為“ StrangeCtrl”的小工具看到了世界的亮光。 與控制器對話需要一些JNI(例如,因為JVM中沒有USB子系統(tǒng)),但是其余部分則是用純Java編寫的。 它位于系統(tǒng)托盤中,并且針對每個配置文件進行了手動配置,盡管也可以構(gòu)建一個GUI。

它的依存關(guān)系是2.0.5版中的“ net.java.jinput.JInput”(仍適用于Windows 8.1)和我編寫的一個小助手(“ com.xafero.SuperLoader” v0.1)。 現(xiàn)在,我將解釋在此過程中采取的步驟。

第一步:我們?nèi)绾巫孞ava與我的控制器對話?

幸運的是,BSD許可的JInput項目正是這樣做的。 例如,它連接到Microsoft的XInput接口,并用它獲取的本機數(shù)據(jù)填充某些Java數(shù)據(jù)結(jié)構(gòu)。 也涵蓋Linux和Mac OS X,不用擔(dān)心。

因此,我插入了游戲手柄(一個兼容XBOX的控制器),方法似乎很清楚:

  • 得到控制器
  • 得到他們的輸入事件
  • 并將它們轉(zhuǎn)換為鍵盤和鼠標(biāo)的虛擬事件。
  • 三大操作系統(tǒng)的庫的本機組件均以Java歸檔文件(至少每個Maven)提供。 但是,您可能已經(jīng)知道,java.lang.System僅加載文件系統(tǒng)上直接可用的文件。

    第二步:那么如何解決這個煩人的局限性呢?

    快速搜索后,我發(fā)現(xiàn)wcmatthysen的“ mx-native-loader”似乎很有用,因為它聲稱可以提取JAR并加載本地內(nèi)容。 但這沒有用,因為JInput的庫被打包到幾個“ jinput-platform-***。jar”文件中,而不是像該加載器所建議的那樣,被打包在META-INF / lib下的一個大塊文件中。

    因此,名為“ SuperLoader”的新幫助程序庫可以在以下情況下工作:

  • 為所有討厭的本機庫創(chuàng)建一個臨時目錄,例如,借助系統(tǒng)屬性“ java.io.tmpdir”。 用戶也可以直接指定它,因為它實際上并不重要。
  • 從已經(jīng)加載的JAR中獲取所有討厭的庫; 遍歷所有類路徑的URL,并使用過濾器將其提取或排除其中的大多數(shù)。
  • 擴展現(xiàn)有的庫路徑; 另一個庫沒有做的一件事,并且手動進行非常煩人,因此應(yīng)擴展系統(tǒng)屬性“ java.library.path”。
  • 強制JVM更新系統(tǒng)路徑; 可以通過將系統(tǒng)類加載器的“ sys_paths”字段重置為null來實現(xiàn)。 這迫使System類在您下次請求庫時真正欣賞新情況。
  • 現(xiàn)在,該應(yīng)用程序?qū)⑺斜緳C庫預(yù)加載到一個臨時文件夾中,例如,當(dāng)要求JInput提供控制器列表時,不必為使用JAR文件而對其進行更改。 它完全可以像任何人一樣使用System.loadLibrary。

    第三步:可以模擬什么?

    我們終于要閱讀游戲手柄的事件了,那么我們該怎么辦呢? 使用AWT的Robot類,自Java早期以來就可以模擬按鍵或鼠標(biāo)移動等。 盡管機器人需要一個人來指定應(yīng)該在其上工作的桌面,但它在多顯示器系統(tǒng)上也可以正常工作。 唯一的區(qū)別是它生成的所有事件的偏移量–如果要單擊PC屏幕的特定區(qū)域,這一點尤其重要。

    到目前為止已實現(xiàn)的命令是:

    • MouseMoveCmd –水平或垂直移動鼠標(biāo)一定量
    • MouseClickCmd –在當(dāng)前屏幕位置單擊給定的鼠標(biāo)按鈕
    • KeyComboCmd –按一些鍵并以相反的順序釋放它們

    為了實現(xiàn)某種程度的可擴展性,有一個接口可以接受機器人生成虛擬事件,當(dāng)前圖形設(shè)備以及JInput給定的值:

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

    它的抽象實現(xiàn)“ AbstractCmd”提供了一個接受一個字符串的構(gòu)造函數(shù)。 作為處理的第一步,來自配置文件的原始字符串被一個空白分隔為一個字符串?dāng)?shù)組。

    第四步:我們可以使用哪種配置格式?

    有很多流行的格式,例如YAML,JSON等。但是Java已經(jīng)為我們提供了一種簡單的方法來實現(xiàn)這一目標(biāo)。 因此,使用Java屬性機制的XML變體來解析配置文件。 要使用與命令連接的字符串來構(gòu)建實際地圖,請使用類“ com.xafero.strangectrl.cmd.ConfigUtils”

    • 加載配置,
    • 遍歷所有條目,
      • 通過每個條目的值搜索命令,
    • 并生成用于轉(zhuǎn)換傳入事件的實際地圖。

    第五步:實際工作

    輔助類“ ControllerPoller”是一個定期執(zhí)行的TimerTask,負責(zé)從任意數(shù)量的控制器中收集新的JInput事件,并將每個新內(nèi)容通知調(diào)用者:

    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); } }

    調(diào)用方(在這種情況下,位于系統(tǒng)托盤中的所謂“ App”)僅實現(xiàn)回調(diào)接口,并在發(fā)生任何輸入時免費獲取所有信息:

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

    “應(yīng)用程序”的左側(cè)是搜索與傳入游戲手柄事件相關(guān)聯(lián)的命令,并使用正確的參數(shù)執(zhí)行這些命令。 現(xiàn)在我們可以用它來控制某些游戲,也許是波斯王子之類的舊游戲,或者是其他無法通過游戲手柄玩的游戲。 但是,讓我們走開...

    除了游戲以外的示例:如何為行動受限的人配置它?

    為了僅顯示另一個可能的應(yīng)用領(lǐng)域,讓我們?yōu)闊o法同時按下兩個鍵的用戶進行配置。 一個示例應(yīng)用程序應(yīng)該是Web瀏覽器。 在配置文件中,有以下設(shè)置:

    <!-- 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>

    此示例中的瀏覽器不必知道游戲控制器,因為操作系統(tǒng)將產(chǎn)生新的虛擬輸入事件,并且將按要求運行。 通過使用Java并成為FOSS,該工具還可以進行自定義并且易于以各種方式理解(與模擬輸入設(shè)備否則必須使用某些C / C ++代碼相比)。

    資源和鏈接

    源代碼位于https://github.com/xafero/StrangeCtrl 。 隨時使用,共享或修改任何方面(根據(jù)GPL v3許可)。

    有關(guān)更多信息,請參見:

    • 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

    總結(jié)

    以上是生活随笔為你收集整理的Java,Steam控制器和我的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。