2011-12-21 18 views
2

ジョイスティックのボタンを押すたびに、またはジョイスティックの軸を動かすたびに、ジョイスティックの状態を更新したいと思います。私はすでにこのコードを持っています:ジョイスティックの状態を更新するには

Imports Microsoft.DirectX 
Imports Microsoft.DirectX.DirectInput 

Dim js As Device = Nothing 

For Each DI As DeviceInstance In Manager.GetDevices(DeviceClass.GameControl, _ 
    EnumDevicesFlags.AttachedOnly) 

    js = New Device(DI.InstanceGuid) 
    Exit For 
Next 

If js Is Nothing Then 
    Throw New Exception("No joystick found") 
End If 

Dim wih As New System.Windows.Interop.WindowInteropHelper(Me) 
js.SetCooperativeLevel(wih.Handle, CooperativeLevelFlags.NonExclusive Or _ 
    CooperativeLevelFlags.Background) 
js.Acquire() 

Dim state As JoystickState = js.CurrentJoystickState 

最後の行はジョイスティックの状態を取得します。私はタイマーが使用されていることを見て、それが状態がリフレッシュされるたびに刻むが、私はボタンを押しても状態が更新されるので効率的ではないようだ。ですから、必要な時にだけどのように状態をリフレッシュするのですか?

+0

重要ですか?私は、フレームレートに合わせるために、1秒に50〜100回のオーダーと仮定します。あなたは高価な操作をアップデートに付けるつもりはないので、何が問題なのですか? OSにはジョイスティックの変更通知メカニズムがないため、どこかのコードをポーリングする必要があります。 – Rup

+0

@Rupディスパッチャータイマーを使用している場合、どのくらい時間が必要ですか? – Cobold

+0

...オハイオ州、私は見る - 私の誤解、申し訳ありません。私は「DXによってタイマーが提供されているので、他の人がタイマーを使うのを見たことがない」というより良い解決策が必要だと読んでいます。あなたが実際にポーリングする必要がある場合 - DirectInputデバイスのための '登録イベントの通知'がない場合は、ゲームプロセスが入力を処理する頻度で実行してください。これはvsyncまたはバックグラウンドのワールドアップデートスレッド私は推測する? – Rup

答えて

0

ジョイスティックの状態が変更された場合にのみ、ジョイスティックの状態を更新する方法に関するC#コードが見つかりました。

Dim state As JoystickState = js.CurrentJoystickState 

多分ちょうど下の例のようなものに追加してみてください:私はあなたが持って見https://msdn.microsoft.com/en-us/library/windows/desktop/bb153252%28v=vs.85%29.aspx#dx_DirectInput_capturing_device_objects

:「これはC#のIS」

  //Capture Position. 
      info += "X:" + state.X + " "; 
      info += "Y:" + state.Y + " "; 
      info += "Z:" + state.Z + " "; 

      //Capture Buttons. 
      byte[] buttons = state.GetButtons(); 
      for(int i = 0; i < buttons.Length; i++) 
      { 
       if(buttons[i] != 0) 
       { 
        info += "Button:" + i + " "; 
       } 
      } 

をここに私はここにある見つかり全体の抜粋です

private void UpdateJoystick() 
    { 
     string info = "Joystick: "; 

     //Get Mouse State. 
     JoystickState state = joystick.CurrentJoystickState; 

     //Capture Position. 
     info += "X:" + state.X + " "; 
     info += "Y:" + state.Y + " "; 
     info += "Z:" + state.Z + " "; 

     //Capture Buttons. 
     byte[] buttons = state.GetButtons(); 
     for(int i = 0; i < buttons.Length; i++) 
     { 
      if(buttons[i] != 0) 
      { 
       info += "Button:" + i + " "; 
      } 
     } 

     lbJoystick.Text = info; 
    } 
+0

しかし、これはちょうどジョイスティックの現在の状態を読み取っているように見える、ジョイスティックの状態が変化したときに検出または通知されるのではなく、ジョイスティックの状態をポーリングするために定期的に呼び出す必要がありますか? – Rup

+0

私は誰かがすでにこれを言ったと思うが、なぜタイマーティックでは十分ではないだろうか?それはDirectXの実際のタイマーではないからです。 – llooker

関連する問題