Microsoft DirectX 8.0 (Visual Basic)

アクション マップの準備

アクション マップとは、アプリケーションのアクションと、仮想コントロールやデバイス オブジェクトへのマッピングに関する情報を格納している DIACTIONFORMAT 型である。この型がアプリケーションと Microsoft® DirectInput® の間でやりとりされ、最終的なマッピングが確立される。ここでは、マップの初期化方法について説明する。

1. アプリケーション アクションの定義

DirectInput アクション マッピングを実装する際の第 1 ステップは、アプリケーション内のどの入力ドリブン アクションをデバイス オブジェクトにマップする必要があるかを決定することである。軸やボタンによって実行できるアクションの場合、軸とボタンの両方の入力タイプに独立したアクションを定義しなければならない。デバイスが適切な軸を持たない場合に備えて、重要な機能にはすべてボタン アクションを定義することが推奨される。

次のアクション値の列挙例は、カーレーシング ゲームにより定義されるものとする。軸アクションは "eA" で始まり、ボタン アクションは "eB" で始まる。

Enum eGameActions
    eA_STEER        'ハンドル
    eB_STEER_LEFT   'ハンドルを左に切る
    eB_STEER_RIGHT  'ハンドルを右に切る
    eA_ACCELERATE   '速度変更
    eB_ACCELERATE   '加速
    eB_DECELERATE   '減速
    eA_BRAKE        'ブレーキ
    eB_BRAKE        'ブレーキ
    eB_UPSHIFT      '高速ギアにシフト
    eB_DOWNSHIFT    '低速ギアにシフト
    eB_CYCLEVIEW    '次のビューに転換
    eB_COURSEVIEW   'コース ビューの切り替え
    eB_DRIVERVIEW   '運転席ビュー
    eB_BRAKEBIAS    'ブレーキ バイアス 
    eA_VOLUME       '音量
    eB_MUTE         'サウンドの切り替え
End Enum

Const NUM_MY_ACTIONS = 16

この例では、アクションは列挙値として定義されている。ただし、ほかの 32 ビット データ型をとることもできる。デバイス データを取得する場合、定義したアクション値はすべて取得されるので、その値を自由に処理できる。

2. ジャンルの定義

第 2 ステップは、アプリケーションの属するジャンルを決定することである。ジャンルにより、仮想コントロールのセットが定義される。適切なジャンルを選択することで、アプリケーション アクションに対して最適な仮想コントロールを取得できる。メーカーがデバイスにデフォルト マッピングを設定する場合、メーカーは DirectInput で定義されたジャンルのうち 1 つ以上をサポートしなければならない。ジャンル一覧については、「アクション マッピング定数」を参照すること。

この例のゲームの場合は、当然 DIVIRTUAL_DRIVING_RACE ジャンルを選択する。このジャンルには以下の仮想コントロールが含まれている。

優先順位 1 のコントロール

DIAXIS_DRIVINGR_STEER
DIAXIS_DRIVINGR_ACCELERATE
DIAXIS_DRIVINGR_BRAKE
DIBUTTON_DRIVINGR_SHIFTUP
DIBUTTON_DRIVINGR_SHIFTDOWN
DIBUTTON_DRIVINGR_VIEW
DIBUTTON_DRIVINGR_MENU

優先順位 2 のコントロール

DIAXIS_DRIVINGR_ACCEL_AND_BRAKE
DIHATSWITCH_DRIVINGR_GLANCE
DIBUTTON_DRIVINGR_ACCELERATE_LINK
DIBUTTON_DRIVINGR_AIDS
DIBUTTON_DRIVINGR_BOOST
DIBUTTON_DRIVINGR_BRAKE
DIBUTTON_DRIVINGR_DASHBOARD
DIBUTTON_DRIVINGR_DEVICE
DIBUTTON_DRIVINGR_GLANCE_LEFT_LINK
DIBUTTON_DRIVINGR_GLANCE_RIGHT_LINK
DIBUTTON_DRIVINGR_MAP
DIBUTTON_DRIVINGR_PAUSE
DIBUTTON_DRIVINGR_PIT
DIBUTTON_DRIVINGR_STEER_LEFT_LINK
DIBUTTON_DRIVINGR_STEER_RIGHT_LINK

優先順位 1 のコントロール優先順位 2 コントロールの間に機能上の差異はない。優先順位 1 のコントロールは、デバイス メーカーがデフォルト マッピングとしてサポートすることが望ましいコントロールである。ただし、どの仮想コントロールも、デバイスによりサポートされる保証はない。

3. コントロールやデバイス オブジェクトへのアクションの割り当て

アクション マップ作成の次のステップでは、それぞれのアプリケーション アクションに、該当ジャンルで定義された 1 つ以上の仮想コントロールを関連付ける。この処理を行うには、DIACTION 型の配列を宣言して初期化する。配列内の構造体はそれぞれ、アクション値、それに関連付けられた仮想コントロール、およびそのアクションを説明する登録名を指定する。その他のメンバはゼロとして残す。これらのメンバの値は後で DirectInput により指定される。

DIACTION 配列の要素を使って、アクションをキーボードの特定のキー、またはマウスの特定のボタン、あるいは Microsoft DirectPlay® 音声デバイスにマップすることもできる。そうすることで、仮想コントロールからの入力に限らずすべての入力で、簡略化された入力ループを利用できる。たとえば、アプリケーション定義アクション eB_UPSHIFT を DIBUTTON_DRIVINGR_SHIFTUP 仮想コントロールと、Page Up キーの両方にマップするとしよう。データを取得する場合、入力源がジョイスティック ボタンとキーボードのどちらであるかにかかわらず、eB_UPSHIFT を取得する。

以下の例は、カーレーシング ゲーム用のアクション マップの宣言を開始している。

Dim rgActions(20) As DIACTION

' ジャンル定義の仮想軸。
With rgActions(0)
  .lAppData = eA_STEER
  .lSemantic = DIAXIS_DRIVINGR_STEER
  .lFlags = 0
  .ActionName = "Steer"
End With
With rgActions(1)
  .lAppData = eA_ACCELERATE
  .lSemantic = DIAXIS_DRIVINGR_ACCELERATE
  .lFlags = 0
  .ActionName = "Accelerate"
End With
With rgActions(2)
  .lAppData = eA_BRAKE
  .lSemantic = DIAXIS_DRIVINGR_BRAKE
  .lFlags = 0
  .ActionName = "Brake"
End With
' その他の宣言。

ただし、次の例のように、Sub プロシージャを使って DIACTIONFORMAT 型の DIACTION 配列に値を直接割り当てた方が効率的な場合がある。

Dim m_diaf As DIACTIONFORMAT
Dim m_NumberofSemantics As Long


Private Sub Form_Load()

m_NumberofSemantics = 0

AddAction eA_STEER, DIAXIS_DRIVINGR_STEER, 0, "Steer"
AddAction eA_ACCELERATE, DIAXIS_DRIVINGR_ACCELERATE, 0, "Accelerate"
AddAction eA_BRAKE, DIAXIS_DRIVINGR_BRAKE, 0, "Brake"

' ジャンル定義の仮想ボタン。
 
AddAction eB_UPSHIFT, DIBUTTON_DRIVINGR_SHIFTUP, 0, "Upshift"
AddAction eB_DOWNSHIFT, DIBUTTON_DRIVINGR_SHIFTDOWN, 0, "DownShift"
AddAction eB_CYCLEVIEW, DIBUTTON_DRIVINGR_VIEW, 0, "Change View"
 
' 任意のボタンや軸に割り当て可能な
' ジャンル未定義のアクション。
 
AddAction eA_VOLUME, DIAXIS_ANY_1, 0, "Volume"
AddAction eB_MUTE, DIBUTTON_ANY, 0, "Toggle Sound"
 
' 特定のキーに割り当てる必要がある
' ジャンル未定義のアクション。
 
AddAction eB_DRIVERVIEW, DIKEYBOARD_1, 0, "Driver View"
AddAction eB_COURSEVIEW, DIKEYBOARD_C, 0, "Course View"
AddAction eB_BRAKEBIAS, DIKEYBOARD_B, 0, "Brake Bias"
 
' キーと仮想コントロールにマップされたアクション。
 
AddAction eB_UPSHIFT, DIKEYBOARD_PRIOR, 0, "Upshift"
AddAction eB_DOWNSHIFT, DIKEYBOARD_NEXT, 0, "Downshift"
AddAction eB_STEER_LEFT, DIKEYBOARD_LEFT, 0, "Steer Left"
AddAction eB_STEER_RIGHT, DIKEYBOARD_RIGHT, 0, "Steer Right"
AddAction eB_ACCELERATE, DIKEYBOARD_UP, 0, "Accelerate"
AddAction eB_DECELERATE, DIKEYBOARD_DOWN, 0, "Decelerate"
AddAction eB_BRAKE, DIKEYBOARD_END, 0, "Brake"
 
' ボタンと仮想コントロールおよびキーにマップされたアクション。
 
AddAction eB_UPSHIFT, DIMOUSE_BUTTON0, 0, "Upshift"
AddAction eB_DOWNSHIFT, DIMOUSE_BUTTON1, 0, "Downshift"

End Sub

Private Sub AddAction(user As Long, semantic As Long,_
                             flags As Long, strName As String)
ReDim Preserve m_diaf.ActionArray(m_NumberofSemantics)

With m_diaf.ActionArray(m_NumberofSemantics)
    .lAppData = user
    .lSemantic = semantic
    .lFlags = flags
    .ActionName = strName
End With
m_NumberofSemantics = m_NumberofSemantics + 1
    
End Sub

この例で、一部のアクションは、キーボード マッピング定数を使って実際のキーにマップされている。同様に、マウスのボタンと軸へのマッピングも、マウス マッピング定数を使って行うことができる。

DIACTION 配列は、ジャンル、アプリケーション、および軸データの適切なスケーリングに関する情報を格納する DIACTIONFORMAT 型の一部である。アクション マッピング プロセスの全体にわたり、この型の同じインスタンスを使用する。一部のメンバはすぐには使用されないが、次のステップ「一致するデバイスの検索」に移る前に、型全体に値を設定できる。