2010-10-14 13 views
16

Bunun için Google'da arama yaptım, ancak geldiğim tek şey eskiydi ve çalışmadı.C# .NET ile bir joystick'ten giriş alma

C# .NET kullanarak joystick verilerinin nasıl edinileceği hakkında herhangi bir bilgisi var mı?

+0

o benim bir arkadaşım yazan adam. Modern .NET ile çalışmayacağını söylüyor. Şu an onunla IM üzerinden konuşuyorum. – chris12892

+0

Arabirim aygıtı olarak hiçbir zaman bir joystick programlamamıştım, ancak bir kullanıcı olarak benim anlayışım, joystick'in klavye ve fare denetimlerini eşlemesidir (yani: logitech USB PS2 stil denetleyicimi HL2 için yapılandırdığımda, her düğmeyi eşleştiriyorum Bir tuşa veya fare düğmesine denetleyici) –

+0

Ironic, 5 yıl sonra, şimdi aynı soruyu google, ben güncel ve söz değil çalışan söz konusu bulmak: | – Spiked3

cevap

12

Bir: SlimDX kullanın.

İki: (GamepadDevice kendi paketleyicimdir ve kod yalnızca ilgili bölümlere indirilmiştir) gibi bir şeye benziyor.

bul joystick/ped GUIDs:

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

Yoklama ped şuna benzer::

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

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

kullanıcı gamepad kazanmak, listeden seçilen sonra

+1

İnsanlar hala bu cevabı okuyorken, daha önce RawInput'a geçtiğimi not etmeliyim: http://stackoverflow.com/a/12988935/184998 –

+0

Şimdiye kadarki işleri elde etmek için üst kısım, set kooperatifini atladım seviye çağrısı. Windows 7'de yaşıyorum. SO cevabı microsoft, DirectInput yerine RawInput kullanmanızı öneririm. – Maslow

4

Kötü haber, Microsoft'un NET kitaplıklarını DirectX için desteklemeyi bıraktığı ve bunun yerine XNA'ya odaklandığı görünüyor. Ben GameDev'de çalışmıyorum, bu yüzden XNA'yı kullanmam gerekmiyor, ancak bilgisayar oyunları geliştiriyorsanız bunu deneyebilirsiniz. İyi haber şu ki başka yaklaşımlar var. Biri, C# 'den DirectX ile uyandırmanıza yardımcı olacak yeni çerçeve SlimDX. Diğer yolu projenize doğrudan "Microsoft.DirectX.dll" ve "Microsoft.DirectX.DirectInput.dll" başvuruları eklemektir. bunları ".. \ Windows \ Microsoft.NET \ Yönetilen Kod için DirectX \" bulabilirsiniz. Son yaklaşımı burada kullanacaksanız, bir joystick ile nasıl çalışacağınızı okuyabileceğiniz bir bağlantı to codeproject.

DÜZENLEME: Uygulamanız NET sürümüne göre yeni ise o zaman 2.0 uygulama askıda kalabilir. Bu sorun değişikliği yapılandırma dosyası düzeltmek ve bu eklemek için:

<startup useLegacyV2RuntimeActivationPolicy="true"> 
22

C# 'daki oyun çubuğu/gamepad girdisini araştırırken google'a girdiğim en büyük hit buydu. Başkalarının görmesi için bir cevap vermeliyim.

Bulduğum en kolay yol SharpDX ve DirectInput kullanmaktı. Sen sadece bir kaç metod meselesi, Bundan sonra Nuget (SharpDX.DirectInput)

aracılığıyla yükleyebilirsiniz:

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

umarım bu yardımcı olur.

Bunu bir DualShock3 ve MotioninJoy sürücüleri ile çalışmak için bile aldım.

+0

Uygulaması en kolay olanıdır. Bunun için teşekkürler! –

0

Google, bu soruna bir gereksinim olmasa da, beni buraya gönderdi ve OpenTK, Windows ve Linux (mono altında) desteği için iyi bir seçenektir. OpenTK docs itibaren

, bu kod Ahududu Pi + Raspbian + Mono 3.12.0 çalışır:

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