TDDIDEX

タスク

 TDDIDEXは、Directinputをカプセル化し、ジョイスティック・マウス・キーボードを扱うためのコンポーネントです。

 

リファレンス目次

プロパティ

(凡例:    読み取り専用   Published)

状態 AStick
Stick
Buttons
初期化時の設定 AutoInitialize
BackGround
設定 DeadZone
keyAssign
AutoCenter
情報 IsFFJoyStick
JoyStickCount
JoyStickNames
その他 JoySticks
DInput
DebugOption

 

メソッド

初期化 Initialize
状態の取得 Scan
OrScan

リファレンス〜プロパティ

AStick

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にホイールの回転量が返されます。

 

Stick

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;



Buttons

    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 に対応しています。

AutoInitialize

property AutoInitialize:Boolean;

 コンポーネントのロードと同時に、DirectInputを初期化するかを示します。デフォルト値はTrueです。

 Falseにした場合、TDDIDEXのほかのメソッドを呼ぶ前に、必ずInitializeメソッドを呼ぶことで、DirectInputを初期化してください。

注意

 システムにフォースフィードバック対応ジョイスティックがついている場合や、多くの台数のジョイスティックがついている場合、DirectInputの初期化には少し時間がかかる場合があります。そうした場合、スプラッシュウィンドウを表示させ、その後Initializeメソッドを呼ぶ、というようにしてユーザーの不安を緩和するのが良いでしょう。

 

BackGround

property BackGround:Boolean;

 BackGroundプロパティで、アプリケーションが非アクティブのときにも入力を受けつづける(True)か、アプリケーションがアクティブのときだけ入力を受けることにする(False)かを指定します。

 デフォルト値はFalseです

 

DeadZone

property DeadZone:Integer;

 アナログジョイスティックからの入力において、わずかなジョイスティックの傾きでも全てアプリケーションで処理していると、得てしてふらふらした操作感があって、操作性の悪いアプリケーションになってしまうものです。

 このプロパティは、どの程度までの傾きなら、傾きゼロとみなすか、ということを設定します。

 単位はパーセントで、デフォルト値は5、つまり5%までの傾きは、ジョイスティックが傾いていないとみなします。

 

keyAssign

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

 

AutoCenter

property AutoCenter:Boolean;

 フォースフィードバック対応ジョイスティックでは、フォースフィードバック制御用のモータを使って、スティックのバネの感じを出す機能がついていることがあります。

 このプロパティで、その機能のOn/Offを設定できます。

 

IsFFJoyStick

property IsFFJoyStick:Array[DI_JOY1..DI_JOY16] of Boolean;

 ジョイスティックがフォースフィードバック対応しているかどうかを示します。

 

JoyStickCount

property JoyStickCount:Integer;

 システムにつながっているジョイスティックの台数を示します。

 マウス・キーボードは数に含まれません。

 

JoyStickNames

property JoyStickNames:TStrings;

 システムにつながっているジョイスティックの名前のリストです。

 

JoySticks

property JoySticks:Array of IDirectInputDevice8;

 DDIDEXが扱う、DirectInputDeviceオブジェクトです。

 DIDEXだけではできないことをやるときに使ってください。

DInput

property DInput:IDirectInput8;

 TDDIDEXオブジェクトが扱っている、DirectInputオブジェクトを示します。

 DDIDEXだけでは出来ない事を行うときに、使用してください。

 

DebugOption

property DebugOption:TDDIDDebugOption;

TDDIDDebugOption = Set of (dioHaltOnError, dioExceptOnError, dioDebugMessage);

 デバッグ用のメッセージ出力を制御します。

dioHaltOnError
DirectXモジュールの制御上、何らかのエラーが発生すると、アプリケーションを強制終了します

dioExceptOnError
DirectXモジュールの制御上、何らかのエラーが発生すると、例外を発生します

dioDebugMessage
DirectXモジュールの制御上、何らかのエラーが発生すると、エラーの内容について、DDID_DebugLog.txtというファイル名で、アプリケーションのあるディレクトリと同じディレクトリに書き出します。

 

リファレンス〜メソッド

Initialize

procedure Initialize;

 DirectInputを初期化します。

 AutoInitializeプロパティがTrueになっている場合、特に呼び出す必要はありません。

 

Scan

function Scan(iJoy:Integer):Boolean;

 iJoyで指定した入力装置の情報を得ます。このメソッドを実行した時点の装置の状態が、各プロパティに反映されます。

 iJoyには入力装置を示す定数が入ります。

DI_JOY1〜DI_JOY16 1台目〜16台目のジョイスティックを示します。
DI_KEYB キーボードを示します。
DI_MOUSE マウスを示します。

 指定された入力機器から入力が正しく得られなかった場合、この関数はFalseを返します。

 複数の入力機器の状態を同時に得るには、OrScanメソッドを使います。

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;

 このようにすればいいわけです。