TDDIDEXは、Directinputをカプセル化し、ジョイスティック・マウス・キーボードを扱うためのコンポーネントです。
(凡例:
読み取り専用
Published)
| 状態 | AStick | |
| Stick | ||
| Buttons | ||
| 初期化時の設定 | AutoInitialize | |
| BackGround | ||
| 設定 | DeadZone | |
| keyAssign | ||
| AutoCenter | ||
| 情報 | IsFFJoyStick | |
| JoyStickCount | ||
| JoyStickNames | ||
| その他 | JoySticks | |
| DInput | ||
| DebugOption |
| 初期化 | Initialize |
| 状態の取得 | Scan |
| OrScan |
property AStick:TDDIDStick; type TDDIDStick = record X,Y,Z,RX,RY,RZ:Integer; //各軸の状態 Slider:Array[0..1] of Integer; //スライダの状態 POV:Array[0..3] of Integer; //POV(ハットスイッチ) end;
最後にScanメソッドが呼ばれた時点で、スティックがX,Y方向どちらにどれくらい倒れているか、という状態を返します。読み取り専用です。
AStick.Xは、右に倒れているほど値が大きくなり、32767で一番右に倒れた状態、-32768で一番左に倒れた状態、0で中立(手を放した)状態となっています。
AStick.Yは、手前に倒れているほど値が大きくなり、32767で一番手前に倒れた状態、-32768で一番奥に倒れた状態、0で中立(手を放した)状態となっています。
マウスの場合、最後にScanを実行してからの移動量がピクセル単位でX,Yに返されます。ホイール付きマウスの場合、Zにホイールの回転量が返されます。
property Stick:TDDIDStick; type TDDIDStick = record X,Y,Z,RX,RY,RZ:Integer; //各軸の状態 Slider:Array[0..1] of Integer; //スライダの状態 POV:Array[0..3] of Integer; //POV(ハットスイッチ) end;
最後にScanメソッドが呼ばれた時点での、スティックの状態を示します。
このうちX,Yだけについて、スティックがどちらに倒れていると、どのような値を示すかを、以下に示します。読み取り専用です。
| 方向 | Stick.X | Stick.Y |
| 右 | 1 | 0 |
| 左 | -1 | 0 |
| 下 | 0 | 1 |
| 上 | 0 | -1 |
| 右下 | 1 | 1 |
| 右上 | 1 | -1 |
| 左下 | -1 | 1 |
| 左上 | -1 | -1 |
例
ジョイスティックを倒した方向に、スプライトを動かします。
JoyがDDIDEXオブジェクト、DDDD1が、フォームに貼られているDDDDオブジェクト、SprがDDDDSpriteオブジェクトで、Spr[0]がこれから動かすスプライトだと思ってください。(乱暴だな(^^;))
procedure StickTest; begin Joy.Scan(DI_JOY1); //Scanメソッドで、現在のスティック1番の状態を、各プロパティに反映 Inc(Spr[0].X , Joy.Stick.X); Inc(Spr[0].Y , Joy.Stick.Y); //この二行で、スティックの倒れている方向にスプライトが動く DDDD1.Clear; //バックバッファのクリア Spr.Update; //スプライトをバックバッファに書き込む DDDD1.Flip; //バックバッファとフロントバッファを入れ替え end;
property buttons[iButton:UINT]:Boolean
最後にScanメソッドが呼ばれた時点で、どのボタンが押されているか、という事を示します。読み取り専用です。
どのボタンが押されているかを知るには、
button[DI_B1]
というように、配列の添え字の中に、DI_Bで始まる定数を入れます。先の例では、ボタン1が押されているなら、True,そうでないならFalseが返ります。同様に、
button[DI_B2]ではボタン2の押下状態を知る事とが出来、button[DI_B8]ならボタン8の押下状態を知る事が出来ます。現在の所、最大でDI_B16、つまり16ボタンまで対応しています。
尚、MicroSoftのSideWinderゲームパッドでは、A,B,C,X,Y,Z,L,R,Strat,Macro
の順に、DI_B1,DI_B2,...DI_B10 に対応しています。
property AutoInitialize:Boolean;
コンポーネントのロードと同時に、DirectInputを初期化するかを示します。デフォルト値はTrueです。
Falseにした場合、TDDIDEXのほかのメソッドを呼ぶ前に、必ずInitializeメソッドを呼ぶことで、DirectInputを初期化してください。
注意
システムにフォースフィードバック対応ジョイスティックがついている場合や、多くの台数のジョイスティックがついている場合、DirectInputの初期化には少し時間がかかる場合があります。そうした場合、スプラッシュウィンドウを表示させ、その後Initializeメソッドを呼ぶ、というようにしてユーザーの不安を緩和するのが良いでしょう。
property BackGround:Boolean;
BackGroundプロパティで、アプリケーションが非アクティブのときにも入力を受けつづける(True)か、アプリケーションがアクティブのときだけ入力を受けることにする(False)かを指定します。
デフォルト値はFalseです
property DeadZone:Integer;
アナログジョイスティックからの入力において、わずかなジョイスティックの傾きでも全てアプリケーションで処理していると、得てしてふらふらした操作感があって、操作性の悪いアプリケーションになってしまうものです。
このプロパティは、どの程度までの傾きなら、傾きゼロとみなすか、ということを設定します。
単位はパーセントで、デフォルト値は5、つまり5%までの傾きは、ジョイスティックが傾いていないとみなします。
property KeyAssign[iSuffix,iButton:Word]:Integer
ボタン1〜32およびスティックの上下左右各方向が、キーボードのどのキー(仮想キーコード)に対応しているかを指定します。
キーボードのZが押されたときに、ボタン1が押されたと等価としたいときは、例えばTDDIDEXオブジェクトとしてJoyという変数があったとして(要するに、Joy:=TDDIDEX.Create; が実行されていたとして)
Joy.KeyAssign[0,DI_B1]:=DIK_Z;
とします。配列の左の添字の 0 については後で説明するとして、右のDI_B1というのはボタン1を表す定数です。DI_B2でボタン2を表し、DI_B32のボタン32までDDIDではサポートします。
尚、キーの指定には、DirectInputで定められている仮想キーコードを使って指定します。詳しくはDirectX SDKのヘルプをどうぞ。また、DirectInputで定められている定数を使用するため、DInputをuses節に追加する必要があります。
また、スティックの方向をキーボード割り当てるには、
Joy.KeyAssign[0,DI_UP]:=DIK_UP; Joy.KeyAssign[0,DI_DOWN]:=DIK_DOWN; Joy.KeyAssign[0,DI_LEFT]:=DIK_LEFT; Joy.KeyAssign[0,DI_RIGHT]:=DIK_RIGHT;
というように、とします。
ところで、キーボードでゲームをする人の中には、方向入力をテンキーでする人もいれば、矢印キーでする人もいますよね。ここで、さっきまでは0で固定していた左側の添え字を変えてやるわけです。
Joy.KeyAssign[0,DI_UP]:=DIK_UP; Joy.KeyAssign[0,DI_DOWN]:=DIK_DOWN; Joy.KeyAssign[0,DI_LEFT]:=DIK_LEFT; Joy.KeyAssign[0,DI_RIGHT]:=DIK_RIGHT; Joy.KeyAssign[1,DI_UP]:=DIK_NUMPAD8; Joy.KeyAssign[1,DI_DOWN]:=DIK_NUMPAD2; Joy.KeyAssign[1,DI_LEFT]:=DIK_NUMPAD4; Joy.KeyAssign[1,DI_RIGHT]:=DIK_NUMPAD6;
このように、キーの多重定義に左側の添え字は使います。どちらかのキーが押されれば、所定のボタン・スティックが押された、とDDIDEXは解釈するのです。
左側の添え字には、0または1だけが指定できます。
また、あるボタンについて、何もキーを割り当てたくないときは、
Joy.KeyAssign[1,DI_B1]:=0;
というように、値に0を指定します。
初期状態での、このプロパティの値は以下の通りです
| iSuffix | ボタン | キー | iSuffix | ボタン | キー | |
| 0 | DI_B1 | DIK_Z | 1 | DI_B1 | DIK_SPACE | |
| 0 | DI_B2 | DIK_X | 1 | DI_B2 | DIK_ESCAPE | |
| 0 | DI_B3 | DIK_C | 1 | DI_B3 | 0 | |
| 0 | DI_B4 | DIK_A | 1 | DI_B4 | 0 | |
| 0 | DI_B5 | DIK_S | 1 | DI_B5 | 0 | |
| 0 | DI_B6 | DIK_D | 1 | DI_B6 | 0 | |
| 0 | DI_B7 | DIK_1 | 1 | DI_B7 | 0 | |
| 0 | DI_B8 | DIK_2 | 1 | DI_B8 | 0 | |
| 0 | DI_B9 | DIK_3 | 1 | DI_B9 | 0 | |
| 0 | DI_B10 | DIK_4 | 1 | DI_B10 | 0 | |
| 0 | DI_B11 | DIK_5 | 1 | DI_B11 | 0 | |
| 0 | DI_B12 | DIK_6 | 1 | DI_B12 | 0 | |
| 0 | DI_B13 | DIK_7 | 1 | DI_B13 | 0 | |
| 0 | DI_B14 | DIK_8 | 1 | DI_B14 | 0 | |
| 0 | DI_B15 | DIK_9 | 1 | DI_B15 | 0 | |
| 0 | DI_B16 | DIK_10 | 1 | DI_B16 | 0 | |
| 0 | DI_B17〜DI_B32 | 0 | 1 | DI_B17〜DI_B32 | 0 | |
| 0 | DI_UP | DIK_UP | 1 | DI_UP | DIK_NUMPAD8 | |
| 0 | DI_DOWN | DIK_DOWN | 1 | DI_DOWN | DIK_NUMPAD2 | |
| 0 | DI_LEFT | DIK_LEFT | 1 | DI_LEFT | DIK_NUMPAD4 | |
| 0 | DI_RIGHT | DIK_RIGHT | 1 | DI_RIGHT | DIK_NUMPAD6 | |
| 0 | DI_UPLEFT | 0 | 1 | DI_UPLEFT | DIK_NUMPAD7 | |
| 0 | DI_UPRIGHT | 0 | 1 | DI_UPRIGHT | DIK_NUMPAD9 | |
| 0 | DI_DOWNLEFT | 0 | 1 | DI_DOWNLEFT | DIK_NUMPAD1 | |
| 0 | DI_DOWNRIGHT | 0 | 1 | DI_DOWNRIGHT | DIK_NUMPAD3 |
property AutoCenter:Boolean;
フォースフィードバック対応ジョイスティックでは、フォースフィードバック制御用のモータを使って、スティックのバネの感じを出す機能がついていることがあります。
このプロパティで、その機能のOn/Offを設定できます。
property IsFFJoyStick:Array[DI_JOY1..DI_JOY16] of Boolean;
ジョイスティックがフォースフィードバック対応しているかどうかを示します。
property JoyStickCount:Integer;
システムにつながっているジョイスティックの台数を示します。
マウス・キーボードは数に含まれません。
property JoyStickNames:TStrings;
システムにつながっているジョイスティックの名前のリストです。
property JoySticks:Array of IDirectInputDevice8;
DDIDEXが扱う、DirectInputDeviceオブジェクトです。
DIDEXだけではできないことをやるときに使ってください。
property DInput:IDirectInput8;
TDDIDEXオブジェクトが扱っている、DirectInputオブジェクトを示します。
DDIDEXだけでは出来ない事を行うときに、使用してください。
property DebugOption:TDDIDDebugOption; TDDIDDebugOption = Set of (dioHaltOnError, dioExceptOnError, dioDebugMessage);
デバッグ用のメッセージ出力を制御します。
dioHaltOnError
DirectXモジュールの制御上、何らかのエラーが発生すると、アプリケーションを強制終了します
dioExceptOnError
DirectXモジュールの制御上、何らかのエラーが発生すると、例外を発生します
dioDebugMessage
DirectXモジュールの制御上、何らかのエラーが発生すると、エラーの内容について、DDID_DebugLog.txtというファイル名で、アプリケーションのあるディレクトリと同じディレクトリに書き出します。
procedure Initialize;
DirectInputを初期化します。
AutoInitializeプロパティがTrueになっている場合、特に呼び出す必要はありません。
function Scan(iJoy:Integer):Boolean;
iJoyで指定した入力装置の情報を得ます。このメソッドを実行した時点の装置の状態が、各プロパティに反映されます。
iJoyには入力装置を示す定数が入ります。
DI_JOY1〜DI_JOY16 1台目〜16台目のジョイスティックを示します。
DI_KEYB キーボードを示します。
DI_MOUSE マウスを示します。
指定された入力機器から入力が正しく得られなかった場合、この関数はFalseを返します。
複数の入力機器の状態を同時に得るには、OrScanメソッドを使います。
function OrScan(Targets:Array of Integer{TDDIDDeviceType}):Boolean;
ScanをTargetsで指定した複数の入力機器に対して行います。
Targetsで示される各入力機器のORを取った値が、Stick,AStick,Buttons各プロパティに代入されます。
どの入力機器からの入力も正しく得られなかったときに、返り値にFalseが入ります。どれか一つでも正常に入力を得られれば、Trueが返ります。
たとえば、1台目のジョイスティックとキーボードの入力を得たい場合は、
procedure JoyAndKB; var x,y:Integer; begin Joy.OrScan([DI_KEYB,DI_JOY1]); x:=Joy.Stick.X; y:=Joy.Stick.Y; end;
このようにすればいいわけです。