DDIDEXチュートリアル(2)

フォースフィードバックを使おう

 ここでは、DDIDEXで新しく追加された、フォースフィードバックエフェクトの、簡単な使用方法について、ご説明します。

 まずDDIDEXチュートリアル1と同じく、「ファイル−アプリケーションの新規作成」を選び、「ファイル−すべて保存」でアプリケーションを作り始める準備をしてください。そして、フォームにDDIDEXコンポーネントを貼り付けます。

 

TDDIDEXコンポーネントの設定

フォームにDDIDEXコンポーネントを貼ったら、オブジェクトインスペクタでBackGroundプロパティをTrueにしてください。これにより、フォースフィードバック(以下、FF)対応の他のアプリケーションがFFエフェクトを更新するようなことがあっても、正しくFFを使うことが出来るようになります。

 

TDDIDFFXオブジェクトを作る

 TDDIDFFXオブジェクトは、FFエフェクトを再生する仕組みをカプセル化したものです。使い方はとっても簡単。

 まず、TFormの宣言に、TDDIDFFX型の変数として、ここではfxという変数名で定義を加えます。


type
TForm1 = class(TForm)
  DDIDEX1: TDDIDEX;
  procedure FormCreate(Sender: TObject);
  private
  { Private 宣言 }
  public
  { Public 宣言 }
    fx:TDDIDFFX;
end;


 次に、FormのOnCreateイベントをこのようにします。

procedure TForm1.FormCreate(Sender: TObject);
begin
  fx:=TDDIDFFX.Create(DDIDEX1);
end;

引数には、先ほどフォームに貼りつけた、DDIDEXコンポーネントの名前を書いてください。

これでFFを使う準備が出来ました。

あと、

procedure TForm1.FormCreate(Sender: TObject);
begin
  DDIDEX1.AutoCenter[DI_JOY1]:=False;

  fx:=TDDIDFFX.Create(DDIDEX1);
end;

 とやって、FFのためのジョイスティックのモータを使ってジョイスティックをセンタリングしてくれる、という機能をカットします。別にやらなくてもいいのですが、やっておいたほうが、FFの効果がよくわかります。

 尚、複数台のジョイスティックがシステムにつながっている場合、FF対応ジョイスティックは、コントロールパネル内での順番に関わらず、DDIDEXでは常にDI_JOY1になります。二台のFF対応ジョイスティックがつながっているなら、DI_JOY1とDI_JOY2はFF対応ジョイスティックとなり、DI_JOY3以降がFFに対応していないジョイスティックになります。

 ジョイスティックがFFをサポートしているかどうかは、TDDIDEX.IsFFJoyStickプロパティで調べられます。

 

既存のエフェクトを使う

 フォースフィードバックを使うにしても、どんな風にジョイスティックのモータが振動するのか、という挙動についてのデータが必要になるのは言うまでも有りません。

 まずは、出来合いのデータを読みこんで使う方法をご説明します。

 Quadruple Dの配布パッケージの中の、FFXディレクトリから、machineGun.ffx を、プロジェクトの有るディレクトリにコピーしてください。

procedure TForm1.FormCreate(Sender: TObject);
begin
  DDIDEX1.AutoCenter[DI_JOY1]:=False;

  fx:=TDDIDFFX.Create(DDIDEX1);

  fx.LoadFromFile('machineGun.ffx');
  fx.Apply(DI_JOY1);
end;

ここでは、

 という事をやっています。ではフォームが出てきたら、ジョイスティックのボタン1 (FFProなら、スティックについているトリガー)を押してください。ジョイスティックが振動すると思います。

 

任意のタイミング・ボタンでエフェクトを使う

 ところで、先ほどの例だとボタン1に連動して勝手にエフェクトが起こっていました。

 これをたとえばボタン5 (FF proなら、Aボタン)に連動してエフェクトを起こすように変更する場合は、

procedure TForm1.FormCreate(Sender: TObject);
begin
  DDIDEX1.AutoCenter[DI_JOY1]:=False;

  fx:=TDDIDFFX.Create(DDIDEX1);
  fx.LoadFromFile('machineGun.ffx');

  fx.Apply(DI_JOY1);

  fx.TriggerButton:=DI_B5;
end;

 というように、TriggerButtonプロパティを変更すればOKです。Applyする前でも後でも構いません。

 ボタンに連動させない場合は、

procedure TForm1.FormCreate(Sender: TObject);
begin
  DDIDEX1.AutoCenter[DI_JOY1]:=False;

  fx:=TDDIDFFX.Create(DDIDEX1);
  fx.LoadFromFile('machineGun.ffx');

  fx.Apply(DI_JOY1);

  fx.TriggerButton:=-1;

end;

 というように、無効なボタン番号を指定します。

 プログラムからFFを任意のタイミングで再生するには、Startメソッド、停止するにはStopメソッドを使います。ここではフォームを左クリックすると再生し、右クリックすると停止することにしましょう。

 というわけで、TForm.OnMouseDownイベントを作成します。

procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
  //左クリックで再生開始…再生回数は一回、既存のFFエフェクトを止めない
  if Button = mbLeft then
    fx.Start(1, False);

  //エフェクトの停止
  if Button = mbRight then
    fx.Stop;
end;

 まず、Startメソッドについてですが、

 となっています。Stopメソッドは別に説明するまでもないでしょう。

 

複数のエフェクトを同時に使う

 たとえば、ボタン0を押すとマシンガンのてごたえ、ボタン1を押すとチェーンソーの手応え、そしてボタン2を押すとゴマをすった時の手応えが欲しくなるような場合があったとします(どんな場合だよ)

 そうした場合、複数のTDDIDFFXオブジェクトを作成し、それぞれを、同じジョイスティックにApplyするだけです。

 たとえば、

type
TForm1 = class(TForm)
  DDIDEX1: TDDIDEX;
  procedure FormCreate(Sender: TObject);
  private
  { Private 宣言 }
  public
  { Public 宣言 }
    fx:Array[0..2] of TDDIDFFX; //エフェクト三つ
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  DDIDEX1.AutoCenter[DI_JOY1]:=False;

  fx[0]:=TDDIDFFX.Create(DDIDEX1);
  fx[0].LoadFromFile('machineGun.ffx');
  fx[0].TriggerButton:=DI_B1;
  fx[0].Apply(DI_JOY1);

  fx[1]:=TDDIDFFX.Create(DDIDEX1);
  fx[1].LoadFromFile('chainSaw.ffx');
  fx[1].TriggerButton:=DI_B2;
  fx[1].Apply(DI_JOY1);

  fx[2]:=TDDIDFFX.Create(DDIDEX1);
  fx[2].LoadFromFile('gomasuri.ffx');

  fx[2].TriggerButton:=DI_B3;
  fx[2].Apply(DI_JOY1);
end;

 同じような事を何度かやるだけです。簡単ですね。

 

エフェクトの使用を停止する

 ジョイスティックのボタンに連動して再生されるタイプのエフェクトは、当然ながらStopメソッドで止めるわけには行きません。

 しかし、武器にマシンガンを選択して居なかったり、チェーンソーのバッテリーが切れていたり、ゴマをすり終わった場合でも、ボタンに連動してFFエフェクトが再生されるのは妙な感じです。

 このような場合、Applyと逆に、ジョイスティックに乗っけたTDDIDFFXオブジェクトを一旦おろしてやる必要があります。それを実現するのがUnloadメソッドです。

 フォームにボタンを一個貼りつけ、Button1とします。これをクリックしたらfx[0]であるマシンガンのFFを止めることにしましょう。

procedure TForm1.Button1Click(Sender: TObject);
begin
  fx[0].Unload;
end;

 この通り。簡単ですね。

 止めっぱなしというのも味気ないので、一回押したら止めて、もう一回押したらまたマシンガンのFFが効くようにしましょう。

procedure TForm1.Button1Click(Sender: TObject);
begin
  if fx[0].Applied then
    fx[0].Unload
  else
    fx[0].Apply(DI_JOY1);
end;

 初登場のAppliedプロパティにはそのエフェクトが、すでにジョイスティックに適用されているかという事が記されています。これでボタンを押したらマシンガンのFFをつけたり、止めたりが出来るようになります。

 

最後に注意

 さて、ここまででは説明していませんでしたが、一つのTDDIDFFXオブジェクトは、同時に一つのジョイスティックにしかApplyすることができません。二台以上のジョイスティックで同じエフェクトを使いたい場合は、台数分の同じTDDIDFFXオブジェクトを作ってくださいね。

 以上で、FFエフェクトの使い方の基礎を終わります。

 リファレンスを読んで、オリジナルのエフェクト作りにも是非チャレンジしてみてください。