ゲームコントローラの制御

説明

このTipsの完成に協力していただけるという方は、Editこちらをクリックして、記事を編集してください。記事を編集できるのは基本的には「本文」の部分ですが、題名や「要約」がTipsとして適当ではない場合は、これらを書き直すこともできます。詳しくは、こちらをご覧ください。

  • 器の作成者:
  • 投稿日:2009-08-05 (水) 02:04:54

要約

ゲームを製作するのに必要な要素のひとつであるゲームコントローラの抜き差し状態の検出や、押下ボタンの検出方法について

本文

Win32APIを使う

joyGetPosEx 関数

誰かわかりやすく見やすいように手を加えてください・・・

Public Class Form1

   ''' <summary>
   ''' ジョイスティックを照会して、その位置とボタンの状態を取得します。
   ''' </summary>
   ''' <param name="uJoyID">照会するジョイスティック(JOYSTICKID1 または JOYSTICKID2)の識別子を指定します。</param>
   ''' <param name="pji">ジョイスティックの拡張位置情報とボタンの状態が入る JOYINFOEX 構造体のアドレスを指定します。dwSize メンバおよび dwFlags メンバの値は必ず設定してください。設定しない場合、この関数は失敗します。joyGetPosEx 関数から返される値は、dwFlags メンバで指定するフラグに依存します。</param>
   ''' <returns>関数が成功すると、JOYERR_NOERROR が返ります。</returns>
   ''' <remarks></remarks>
   Declare Function joyGetPosEx Lib "winmm" (uJoyID As UInteger, ByRef pji As JOYINFOEX) As MMRESULT
   ''' <summary>
   ''' 指定されたウィンドウにメッセージを送信して、ジョイスティックをキャプチャします。
   ''' </summary>
   ''' <param name="hwnd">ジョイスティックメッセージを受信するウィンドウのハンドルを指定します。</param>
   ''' <param name="uJoyID">キャプチャするジョイスティック(JOYSTICKID1 または JOYSTICKID2)の識別子を指定します。</param>
   ''' <param name="uPeriod">ポーリングの頻度をミリ秒単位で指定します。</param>
   ''' <param name="fChanged">位置フラグを変更します。ジョイスティックの移動しきい値よりも大きい値で位置が変化したときだけメッセージを送信するには、このパラメータに TRUE を指定します。指定しない場合、メッセージは uPeriod パラメータで指定されたポーリング頻度で送信されます。</param>
   ''' <returns>関数が成功すると、JOYERR_NOERROR が返ります。</returns>
   ''' <remarks></remarks>
   Declare Function joySetCapture Lib "winmm" (ByVal hwnd As IntPtr, ByVal uJoyID As Integer, ByVal uPeriod As UInteger, ByVal fChanged As Boolean) As MMRESULT
   ''' <summary>
   ''' 指定のキャプチャされているジョイスティックを解放します。
   ''' </summary>
   ''' <param name="uJoyID">解放するジョイスティック(JOYSTICKID1 または JOYSTICK2)の識別子を指定します。</param>
   ''' <returns>関数が成功すると、JOYERR_NOERROR が返ります。</returns>
   ''' <remarks></remarks>
   Declare Function joyReleaseCapture Lib "winmm" (ByVal uJoyID As UInteger) As MMRESULT
   Structure JOYINFOEX
       Public dwSize As Integer
       Public dwFlags As JOY
       Public dwXpos As Integer
       Public dwYpos As Integer
       Public dwZpos As Integer
       Public dwRpos As Integer
       Public dwUpos As Integer
       Public dwVpos As Integer
       Public dwButtons As Integer
       Public dwButtonNumber As Integer
       Public dwPOV As Integer
       Public dwReserved1 As Integer
       Public dwReserved2 As Integer
   End Structure
   Public Const JOYSTICKID1 = 0
   Public Const JOYSTICKID2 = 1
   Public Enum MMRESULT As Integer
       ''' <summary>処理の成功を表します。</summary>
       JOYERR_NOERROR = 0
       ''' <summary>ジョイスティックドライバが存在しません。</summary>
       MMSYSERR_NODRIVER = 6
       ''' <summary>無効なパラメータが渡されました。</summary>
       MMSYSERR_INVALPARAM = 11
       ''' <summary>指定されたジョイスティック識別子は無効です。</summary>
       MMSYSERR_BADDEVICEID = 2
       ''' <summary>指定されたジョイスティックデバイスの識別子 uJoyID は無効です。</summary>
       JOYERR_PARMS = 165
       ''' <summary>必要なサービス(WIndows タイマなど)が利用できないため、ジョイスティックの入力をキャプチャできません。</summary>
       JOYERR_NOCANDO = 166
       ''' <summary>指定されたジョイスティックはシステムに接続されていません。</summary>
       JOYERR_UNPLUGGED = 167
   End Enum
   'Windows Message
   Enum MM As Integer
       JOY1MOVE = &H3A0
       JOY2MOVE = &H3A1
       JOY1ZMOVE = &H3A2
       JOY2ZMOVE = &H3A3
       JOY1BUTTONDOWN = &H3B5
       JOY2BUTTONDOWN = &H3B6
       JOY1BUTTONUP = &H3B7
       JOY2BUTTONUP = &H3B8
   End Enum
   Enum JOY As Integer
       RETURNX = &H1
       RETURNY = &H2
       RETURNZ = &H4
       RETURNR = &H8
       RETURNU = &H10 ' axis 5
       RETURNV = &H20 ' axis 6
       RETURNPOV = &H40
       RETURNBUTTONS = &H80
       RETURNRAWDATA = &H100
       RETURNPOVCTS = &H200
       RETURNCENTERED = &H400
       RETURNALL = (RETURNX + RETURNY + RETURNZ + RETURNR + RETURNU + RETURNV + RETURNPOV + RETURNBUTTONS)
   End Enum
   Dim joyInfo As New JOYINFOEX With { _
       .dwSize = Len(joyInfo)}
   Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
       joySetCapture(Me.Handle, JOYSTICKID1, 50, False)
   End Sub
   Private Sub Form1_FormClosing(sender As System.Object, e As System.Windows.Forms.FormClosingEventArgs) Handles MyBase.FormClosing
       joyReleaseCapture(JOYSTICKID1)
   End Sub
   Protected Overrides Sub WndProc(ByRef m As System.Windows.Forms.Message)
       Select Case m.Msg
           Case MM.JOY1MOVE
               Dim Temp$ = Convert.ToString(m.LParam.ToInt32, 2)
               Label1.Text = (Space(32 - Temp.Length).Replace(" "c, "0"c)) & Temp
               Temp = Convert.ToString(m.WParam.ToInt32, 2)
               Label2.Text = (Space(32 - Temp.Length).Replace(" "c, "0"c)) & Temp
       End Select
       MyBase.WndProc(m)
   End Sub

End Class

コメント



ページ情報
  • カテゴリ : .NET
  • 作成日 : 2009-08-05 (水) 02:04:54
  • 最終編集日 : 2012-09-15 (土) 11:59:43
[ トップ ]   [ 新規 | 子ページ作成 | 一覧 | 単語検索 | 最終更新 | ヘルプ ]