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

説明

この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 (土) 15:33:29
[ トップ ]   [ 編集 | 凍結 | 差分 | バックアップ | 添付 | 複製 | 名前変更 | リロード ]   [ 新規 | 子ページ作成 | 一覧 | 単語検索 | 最終更新 | ヘルプ ]