Microsoft DirectX 8.0 (Visual Basic)

ステップ 3 : デバイスへのアクションのマッピング

ActionMapper サンプルは、独自のクラス関数 CreateDevicesFromMap などを使って、前に定義したアクション マップと使用可能なデバイスを比較する。それにはまず、DIACTION 型の配列を格納する DIACTIONFORMAT 型のほかのメンバに値を割り当てる。サンプルで使用された値は、CreateDevicesFromMap メソッドにパラメータとして渡されている。わかりやすくするため、このサンプル コードではパラメータ名でなく実際の値を使用している。

    m_diaf.guidActionMap = "{20CAA014-60BC-4399-BDD3-84AD65A38A1C}"
    m_diaf.lGenre = DIVIRTUAL_SPACESIM
    m_diaf.lBufferSize = 16
    m_diaf.lAxisMax = 100
    m_diaf.lAxisMin = -100
    m_diaf.ActionMapName = "Semantic Mapper VB Sample"
    m_diaf.lActionCount = 18

guidActionMap 値はプログラムによって定義される。GUID の作成方法の詳細については、「GUID の使い方」を参照すること。

目的のマッピングが定義できたら、それを物理的デバイスに適用する。DirectInput8.GetDevicesBySemantics は、次のコードでこのプロセスを開始する。ここで m_DI は以前に定義された DirectInput8 オブジェクト、m_DIEnum は以前に定義された DirectInputEnumDevices8 オブジェクト、m_strUserName は以前に定義されたユーザーのわかりやすい識別子を含む文字列である。

Set m_DIEnum = m_DI.GetDevicesBySemantics(m_strUserName, m_diaf, 0)

フラグを使って列挙対象をさらに限定することもできるが、この例ではフラグは設定されていない。

列挙の結果が個々に調べられ、見つかった各キーボード、マウス、ジョイスティックに対してデバイスが作成される。次のサンプル コードで、devinst は以前に定義された DirectInputDeviceInstance8 オブジェクト、m_Devices は以前に定義された DirectInputDevice8 オブジェクトの配列、m_DeviceTypes は以前に定義された Long 値の配列である。

    For i = 1 To m_DIEnum.GetCount
    
        Set devinst = m_DIEnum.GetItem(i)
        Set m_Devices(i) = m_DI.CreateDevice(devinst.GetGuidInstance)
        m_DeviceTypes(i) = devinst.GetDevType
        Set devinst = Nothing

ループは、現在調べている列挙デバイスがマウスかどうかをチェックすることによって、実行を続ける。マウスの場合は、AXISMODE プロパティが相対に設定される。このループ内にほかのプロパティを設定することもできるが、ActionMapper サンプルでは、これだけが実行される。

        If m_DeviceTypes(i) = DI8DEVTYPE_MOUSE Then
            Dim dipl As DIPROPLONG
            dipl.lHow = DIPH_DEVICE
            dipl.lData = DIPROPAXISMODE_REL
            m_Devices(i).SetProperty "DIPROP_AXISMODE", dipl
        End If

DirectInputDevice8.BuildActionMap は、DIACTIONFORMAT 型に指定されているコントロールの割り当て一覧を取得し、m_strUserName パラメータに指定されているユーザーに対して列挙されているデバイスの特定のデバイス オブジェクトにそれをマッッピングしようとする。マッピングの結果は、同じ構造体に返される。渡すたびに、現在調べられている列挙デバイスの性質に応じて、異なるコントロールにマッピングされる。たとえばキーボードは、特定のキーへのマッピングを指定するコントロールをマッピングするが、ボタン、スライダ、または軸を指定するコントロールについてはマッピングしない。次にジョイスティックが列挙された場合、BuildActionMap はキーボードのキーにマッピングされたコントロールは無視するが、ボタン、スライダ、軸はジョイスティックのデバイス オブジェクトへのマッピングを試みる。

        m_Devices(i).BuildActionMap m_diaf, m_strUserName, 0
    

この例でもフラグは使用されていない。

このデフォルト マッピングの結果を調べ、操作することができる。これは、「ステップ 4 : アクション マップの構成と適用」で行う。