2010-10-14 87 views
16

我在Google上搜索了這一點,但是我提出的唯一的東西是過時的,並且不起作用。使用C#.NET從遊戲杆中獲取輸入信息

有沒有人有關於如何使用C#.NET獲取遊戲杆數據的任何信息?

+0

誰寫的是我的一個朋友的傢伙。他表示,它不適用於現代.NET。我現在正在通過IM與他交談。 – chris12892 2010-10-14 03:07:25

+0

我從來沒有將遊戲杆編程爲接口設備,但我作爲用戶的理解是,遊戲杆控件映射到鍵盤和鼠標控件(即:當我爲HL2配置Logitech USB PS2樣式控制器時,我將每個按鈕映射到控制器到一個鍵或鼠標按鈕) – 2010-10-14 03:14:57

+0

5年後,當我現在谷歌相同的問題,我發現這個問題提到過時和不工作: – Spiked3 2015-05-19 16:14:20

回答

12

一:使用SlimDX

二:它看起來像這樣(其中GamepadDevice是我自己的包裝,代碼縮小到相關部分)。

查找操縱桿/墊的GUID:

public virtual IList<GamepadDevice> Available() 
    { 
     IList<GamepadDevice> result = new List<GamepadDevice>(); 
     DirectInput dinput = new DirectInput(); 
     foreach (DeviceInstance di in dinput.GetDevices(DeviceClass.GameController, DeviceEnumerationFlags.AttachedOnly)) 
     { 
      GamepadDevice dev = new GamepadDevice(); 
      dev.Guid = di.InstanceGuid; 
      dev.Name = di.InstanceName; 
      result.Add(dev); 
     } 
     return result; 
    } 

一旦用戶從列表中選擇,獲得遊戲手柄:

private void acquire(System.Windows.Forms.Form parent) 
    { 
     DirectInput dinput = new DirectInput(); 

     pad = new Joystick(dinput, this.Device.Guid); 
     foreach (DeviceObjectInstance doi in pad.GetObjects(ObjectDeviceType.Axis)) 
     { 
      pad.GetObjectPropertiesById((int)doi.ObjectType).SetRange(-5000, 5000); 
     } 

     pad.Properties.AxisMode = DeviceAxisMode.Absolute; 
     pad.SetCooperativeLevel(parent, (CooperativeLevel.Nonexclusive | CooperativeLevel.Background)); 
     pad.Acquire(); 
    } 

輪詢墊看起來是這樣的:

 JoystickState state = new JoystickState(); 

     if (pad.Poll().IsFailure) 
     { 
      result.Disconnect = true; 
      return result; 
     } 

     if (pad.GetCurrentState(ref state).IsFailure) 
     { 
      result.Disconnect = true; 
      return result; 
     } 

     result.X = state.X/5000.0f; 
     result.Y = state.Y/5000.0f; 
     int ispressed = 0; 
     bool[] buttons = state.GetButtons(); 
+1

由於人們仍然閱讀這個答案,我應該注意到,我後來切換到RawInput:http://stackoverflow.com/a/12988935/184998 – 2013-01-13 21:06:04

+0

到目前爲止我已經獲得作品的部分,我沒有跳過集合級別的呼叫。我在Windows 7.回答其他地方說,微軟建議你使用RawInput而不是DirectInput – Maslow 2016-01-30 16:46:42

4

壞消息是微軟似乎不再支持DirectX的NET庫,而是專注於XNA。我不在GameDev工作,所以我不需要使用XNA,但是如果您開發電腦遊戲,您可以嘗試。好消息是還有其他方法。一個是SlimDX這個新框架可以幫助你從C#中使用DirectX。另一種方法是直接將「Microsoft.DirectX.dll」和「Microsoft.DirectX.DirectInput.dll」的引用添加到您的項目中。你可以找到它們「.. \ Windows \ Microsoft.NET \ DirectX for Managed Code \」。如果你打算使用最後一種方法,這裏是一個鏈接to codeproject,你可以在這裏閱讀如何使用操縱桿。

編輯: 如果您的應用程序基於NET版本更新,然後2.0應用程序可能會掛起。要解決這個問題變的配置文件,並添加這樣的:

<startup useLegacyV2RuntimeActivationPolicy="true"> 
22

既然這是我在谷歌上研究C#遊戲杆/遊戲手柄輸入的熱門,我雖然我應該爲他人發表迴應。

我發現的最簡單的方法是使用SharpDX和DirectInput。您可以通過的NuGet(SharpDX.DirectInput)

安裝它之後,它只是調用幾個方法的問題:

Sample code from SharpDX

static void Main() 
{ 
    // Initialize DirectInput 
    var directInput = new DirectInput(); 

    // Find a Joystick Guid 
    var joystickGuid = Guid.Empty; 

    foreach (var deviceInstance in directInput.GetDevices(DeviceType.Gamepad, 
       DeviceEnumerationFlags.AllDevices)) 
     joystickGuid = deviceInstance.InstanceGuid; 

    // If Gamepad not found, look for a Joystick 
    if (joystickGuid == Guid.Empty) 
     foreach (var deviceInstance in directInput.GetDevices(DeviceType.Joystick, 
       DeviceEnumerationFlags.AllDevices)) 
      joystickGuid = deviceInstance.InstanceGuid; 

    // If Joystick not found, throws an error 
    if (joystickGuid == Guid.Empty) 
    { 
     Console.WriteLine("No joystick/Gamepad found."); 
     Console.ReadKey(); 
     Environment.Exit(1); 
    } 

    // Instantiate the joystick 
    var joystick = new Joystick(directInput, joystickGuid); 

    Console.WriteLine("Found Joystick/Gamepad with GUID: {0}", joystickGuid); 

    // Query all suported ForceFeedback effects 
    var allEffects = joystick.GetEffects(); 
    foreach (var effectInfo in allEffects) 
     Console.WriteLine("Effect available {0}", effectInfo.Name); 

    // Set BufferSize in order to use buffered data. 
    joystick.Properties.BufferSize = 128; 

    // Acquire the joystick 
    joystick.Acquire(); 

    // Poll events from joystick 
    while (true) 
    { 
     joystick.Poll(); 
     var datas = joystick.GetBufferedData(); 
     foreach (var state in datas) 
      Console.WriteLine(state); 
    } 
} 

我希望這有助於。

我甚至得到了這個與DualShock3和MotioninJoy驅動程序一起工作。

+0

這是最容易實現的。感謝你! – 2018-02-11 08:12:12

0

谷歌在這裏引導我,雖然不是這個問題的要求,OpenTK是Windows和Linux(在單聲道)支持下的一個很好的選擇。

OpenTK docs,此代碼對樹莓派+ Raspbian +單聲道3.12.0:

for (int i = 0; i < 4; i++) 
{ 
    var state = Joystick.GetState(i); 
    if (state.IsConnected) 
    { 
     float x = state.GetAxis(JoystickAxis.Axis0); 
     float y = state.GetAxis(JoystickAxis.Axis1); 

     // Print the current state of the joystick 
     Console.WriteLine(state); 
    } 
}