電腦遊戲製作開發設計論壇 首頁 電腦遊戲製作開發設計論壇
任何可以在PC上跑的遊戲都可以討論,主要以遊戲之製作開發為主軸,希望讓台灣的遊戲人有個討論、交流、教學、經驗傳承的園地
 
 常見問題常見問題   搜尋搜尋   會員列表會員列表   會員群組會員群組   會員註冊會員註冊 
 個人資料個人資料   登入檢查您的私人訊息登入檢查您的私人訊息   登入登入 

Google
DirectInput & Xinput - 遊戲手把控制器範例

 
發表新主題   回覆主題    電腦遊戲製作開發設計論壇 首頁 -> 遊戲程式中級班:資料結構、Win32 API、各種視窗函式庫
上一篇主題 :: 下一篇主題  
發表人 內容
Director
偶而上來逛逛的過客


註冊時間: 2013-11-04
文章: 13

381.66 果凍幣

發表發表於: 2015-6-9, AM 8:15 星期二    文章主題: DirectInput & Xinput - 遊戲手把控制器範例 引言回覆

 前陣子為了在平板上面玩遊戲,買了支遊戲手把,原本朋友推薦買的是XBOX的,說是插在電腦上就可以直接用,其他的(如PS DualShock手把)就還得配合模擬器。

 當下覺得有點奇怪,怎麼會有作業系統能辨識的裝置卻不能使用? Confused

 後來因為配合平板那邊的驅動買了PS4的手把,奇妙的是把它接在電腦上玩《Ys Origin》,明明是這麼老的遊戲卻能毫無問題的使用手把。

 查了一下才知道只是裝置訊號走的協定不一樣而已,DualShock走的是DirectInput而XBOX則是DirectInput和XInput都可以。

 一般來說能走XInput就走那個比較好,尤其是XBOX手把,不然會喪失震動以及一部分按鍵的功能。

 買了手把之後開始熱衷用手把玩遊戲的我,心血來潮就寫了個綜合的手把類別,無論DirectInput或是XInput的裝置辨別方式都做好了,附帶一個統一的狀態輸出介面。

 可能很多人都做過了,但還是分享給大家參考 Very Happy


引言回覆:
Function


 1. 偵測作業系統連接的手把裝置(支援多個手把同時)
 2. 統一DirectInput及XInput的手把狀態介面




引言回覆:
Class


 Gamepad: 手把主介面
 GamepadState: 手把資訊介面




引言回覆:
Example


※輸出格式如下

 -1~1 float: Stick是搖桿,值為XY軸
  0~1 float: Trigger是板機,值為按壓幅度
  boolean: Dpad是方向鍵
  boolean: Button是按鍵陣列


代碼:

// main.cpp
//---------------------------------------------------------
// 作者: DR
// 2015/06/09
//
// DirectInput & Xinput - 遊戲手把控制範例
//---------------------------------------------------------
//
#include <iostream>
#include <thread>
#include <string>

#include <conio.h>

#include "Gamepad.h"

int main(int argc, char **argv)
{
   Gamepad wc;
   wc.CheckDevice();


   while(1){
      std::this_thread::sleep_for(std::chrono::milliseconds(1000/20));
      system("cls");

      // Check devices when user presses 'c'
      if( _kbhit() ){
         char tmpInput = _getch();
         if( tmpInput == 'c' )
            wc.CheckDevice();
      }

      if(wc.GetDeviceCount() == 0){
         std::cout << "There is no connected controller." << std::endl;
         continue;
      }

      for(unsigned int i=0 ; i<wc.GetDeviceCount() ; i++){
         GamepadState gs = wc.GetState(i);

         std::cout << "<Controller " << i << ">" << std::endl;

         std::cout << "StickL:  " << gs.StickLX << ", " << gs.StickLY << std::endl
            << "StickR:  " << gs.StickRX << ", " << gs.StickRY << std::endl
            << "Trigger: " << gs.TriggerL << ", " << gs.TriggerR << std::endl
            << "DpadU:   " << gs.DpadU << std::endl
            << "DpadR:   " << gs.DpadR << std::endl
            << "DpadD:   " << gs.DpadD << std::endl
            << "DpadL:   " << gs.DpadL << std::endl;         

         for(int i=0 ; i<32 ; i++)
            if(gs.Button[i])
               std::cout << "Button:  " << i << std::endl;

         std::cout << std::endl;
      }
   }

   return 0;
}





Gamepad.rar
 描述:
原始程式碼

下載
 檔名:  Gamepad.rar
 附件大小:  14.9 KB
 下載次數:  共 158 次

回頂端
檢視會員個人資料 發送私人訊息 發送電子郵件 參觀發表人的個人網站
還是零分
散播福音的祭司


註冊時間: 2007-09-19
文章: 164

652.83 果凍幣

發表發表於: 2015-6-22, PM 7:40 星期一    文章主題: 引言回覆

雖然沒在用DirectInput
還是先收下了 Smile
回頂端
檢視會員個人資料 發送私人訊息 參觀發表人的個人網站
從之前的文章開始顯示:   
發表新主題   回覆主題    電腦遊戲製作開發設計論壇 首頁 -> 遊戲程式中級班:資料結構、Win32 API、各種視窗函式庫 所有的時間均為 台灣時間 (GMT + 8 小時)
1頁(共1頁)

 
前往:  
無法 在這個版面發表文章
無法 在這個版面回覆文章
無法 在這個版面編輯文章
無法 在這個版面刪除文章
無法 在這個版面進行投票
可以 在這個版面附加檔案
可以 在這個版面下載檔案


Powered by phpBB © 2001, 2005 phpBB Group
正體中文語系由 phpbb-tw 維護製作