Demo 14

Demo14 は、DGCJoystick コンポーネントの詳しい使い方について説明されている。DGCJoystick コンポーネントは、DirectDraw を用いない通常のアプリケーションからでも使用することが出来る。このコンポーネントはたくさんのイベントやプロパティが用意されているが、通常使うのはそのうちのごく一部なので難しい事を覚える必要は無い。アナログジョイスティックを使わない限りは極めて簡単に使用することが出来るのだ。基本的な使用方法は、まずフォームに DGCJoystick コンポーネントを配置して、ボタンと方向キーのイベントを書くだけである。

procedure TForm1.DGCJoystick1Joy1BtnDown(B1, B2, B3, B4: Boolean);
begin
  // If the appropriate button is pressed, change the panels color.
  // NOTE: The buttons return as boolean values. If the button
  //       is pressed then it's value will be TRUE

  If B1 then Panel10.Color := clRed;
  If B2 then Panel11.Color := clRed;
  If B3 then Panel12.Color := clRed;
  if B4 then Panel13.Color := clRed;
end;

procedure TForm1.DGCJoystick1Joy1BtnUp(B1, B2, B3, B4: Boolean);
begin
  // If the appropriate button was released, change the color back.
  // NOTE: The buttons return as boolean values. If the button was
  //       released, then it's value will be TRUE
  If B1 then Panel10.Color := clMaroon;
  If B2 then Panel11.Color := clMaroon;
  If B3 then Panel12.Color := clMaroon;
  if B4 then Panel13.Color := clMaroon;

end;

これは OnJoy1BtnDown と OnJoy1BtnUp イベントの中身である。DGCJoystick は4つボタンのコントローラーに対応しているが、このソースを見ればどのように使うかが分かると思う。デモプログラムでは、押されたボタンに対応したパネルの色を変化させている。

ヘルプには、「要求があれば、32個のボタンにまで対応したコンポーネントも作れるが、今の所そのようなジョイスティックは少ないので必要無いだろう」といったことが書いてある。確かにそのとおりだが、私の持っているコントローラーは6ボタンなので、それをフルに使ってみたいのに残念である。

procedure TForm1.DGCJoystick1Joy1Center(Sender: TObject);
begin
  //If the Joystick is Centered (DIGITAL ONLY)
  Panel1.Color := clNavy;
  Panel2.Color := clNavy;
  Panel3.Color := clNavy;
  Panel4.Color := clNavy;
  Panel5.Color := clBlue;  //Center Panel
  Panel6.Color := clNavy;
  Panel7.Color := clNavy;
  Panel8.Color := clNavy;
  Panel9.Color := clNavy;
end;

procedure TForm1.DGCJoystick1Joy1Down(Sender: TObject);
begin
  //If the Joystick is Down (DIGITAL ONLY)
  Panel1.Color := clNavy;
  Panel2.Color := clNavy;
  Panel3.Color := clNavy;
  Panel4.Color := clNavy;
  Panel5.Color := clNavy;
  Panel6.Color := clNavy;
  Panel7.Color := clNavy;
  Panel8.Color := clBlue; //Down Panel
  Panel9.Color := clNavy;

end;

これは、コントローラーの方向キーが押された時と、押されなくなった時のイベントである。すべての方向に対してイベントが書かれているが、中身はほとんど同じなのですぐ分かると思う。これも同じように、押されている方向に対応したパネルの色を変更している。

さて、ここまでイベントの中身を理解できたら、後は実際にイベントを起こすだけである。DGCJoystick は、イベントを書いただけではそのイベントが発生することはない。実際に入力が必要になったら、StartJoysticks メソッドを呼び出すことになる。

   //Start capturing joystick messages
   DGCJoystick1.StartJoysticks;

これはデモプログラムの Start ボタン Click イベントの終わりに書いてある。コントローラーを使用しなくなったら、StopJoysticks を呼び出す。これは Stop ボタンのイベントに書いてある。

   //Stop capturing Joystick Messages
   DGCJoystick1.StopJoysticks;

これだけでもデモプログラムは動作するが、実際にゲームを作るには不十分である。このままでは、OnJoy1... イベントはキーを押した(離した)瞬間にしか呼び出されないため、ゲームのキャラクターが連続して移動するためにはキーを連打しなくてはならない。そこで登場するのが Joy1Notify プロパティと、Joy1Polling プロパティである。Joy1Notify プロパティを false にセットしてから StartJoysticks を呼び出せば、Joy1Polling の間隔で OnJoy1 イベントを発生させることが出来る。(単位はミリ秒)

ここまでは自動的にイベントを発生させてキー入力判定を行ってきたが、もう一つ DGCJoystick には別の使い方がある。それは、任意のタイミングでコントローラーの状態を調べる方法である。この時は DGCJoystick の UpdateJoysticks メソッドを使う事になる。この場合 StartJoysticks メソッドも使わず、イベントも発生しないので、使い方を間違わなければこちらの方がプログラムがすっきりするだろう。

UpdateJoysticks を呼び出した場合、コントローラーがどの状態にあるかを調べるには、DGCJoystick の Joy1Info を調べると分かる。Joy1Info は JoyInfo 型の構造体で、詳細は Windows API のヘルプに記述されている。参考までに、この方法を使って入力判定をするように Demo3 プログラムを書き換えてみる。これは DGCScreen1Flip イベントのはじめの部分に、このように付け足すだけでよい。もちろん、DGCJoyStick コンポーネントも配置しておくことを忘れずに。

// Demo3 プログラムです!  注意!
procedure TForm1.DGCScreen1Flip(Sender: TObject);
var
   ShipHit: Boolean;
begin
     DGCJoystick1.UpdateJoysticks;
     if DGCJoystick1.Joy1Info.wXpos < 16000 then
       px := px - 2
     else if DGCJoystick1.Joy1Info.wXpos > 48000 then
       px := px + 2;

もう一度デモプログラムに戻る。残るは、アナログジョイスティックに関する部分であるが、残念ながら私はアナログジョイスティックを持っていない。したがって、ここから先はあまり詳細には調べていないので、正確ではないかもしれない。

アナログジョイスティックを用いるからといって、DGCJoystick の Joy1Mode プロパティを Analog にしなければいけないわけではない。しかし Joy1Mode が Digital の状態でアナログジョイスティックを使った場合、スティックのちょっとした動きに反応してしまっては困ることになる。そんなちょっとした動きに反応しないように、DGCJoystick ではある程度の動きが無いと、方向キーが押されたと判断しないようになっている。アナログジョイスティックの中にはハードでデジタルに切り替えることが出来るものもあるが、DGCJoystick はソフトウエアで同じような処理を行っているのである。

また、Joy1Mode が Analog の場合でも、アナログジョイスティックの小さな動きに敏感に反応しすぎないようにするために、Joy1Thresh プロパティを設定することが出来る。普段はデフォルトのまま使用しても問題ないと思うが、この値を大きくすると、アナログジョイスティックのスティックを大きく動かしても、なかなか反応しないようにすることが出来るのである。

以上で Demo14 の説明を終わる。アクションゲームなどでは、特に操作性が重要になってくる。これほどまでに簡単なのであるから、ぜひコントローラーによる入力に対応させて欲しい。

もどる