[Processing] GT Forceを使ってみる。 

##はじめに
今回は、PCでGT Forceを接続してみたという話。Processingという言語を使うと簡単に使えるようになるので、ぜひお試しいただきたい。ゲーム用のコントローラが自由に使えるようになるとやれることが広がるのではないか。今回の内容は「自作のいろいろ」様のサイトの情報をもとに行った。筆者もはっきりこのライブラリを理解していないため、説明が不十分なところがある。筆者のメモ程度の内容であることをご了承いただきたい。

[自作のいろいろ様のサイト](https://garchiving.com/how-to-gamepad-in-processing/)

使用するGT ForceはPS2用のもので非常に古いものである。調べてみると、このハンドルコントローラーはWindows10に対応していないとの記述もあったが、GT Force Pro用のものを使用したところ、無事Windows10で使うことができた。ただし、logicoolのセットアップソフトでは、ペダルが反応しなかった。故障かと思ったが後のプログラムでは動作した。

##実行環境
・Windows10 64bit
・Processing 3.5.3
・Game Control Plus 1.2.2
・GT Force LPRC-10000 

##方法
###①GT Force用ソフトのインストール
ロジクールのサポートサイトより、GT Force　Pro用のソフトをインストールする。これをインストールしなくてもUSBをパソコンに刺すだけで認識したが、キャリブレーションなどができるのでお勧めする。ソフトで調整するときハンドルの右後ろのボタンを押したところ、ハンドルが暴走して、回転が止まらなくなったことがあった（笑）。刺しなおして今のところ問題ない。
[ロジクールサポートサイト](https://support.logi.com/hc/ja/categories/360001764393-ゲーミング)

###②ライブラリをインストール
まずprocessingを起動し、上タブの「スケッチ」→「ライブラリをインポート」→「ライブラリを追加」より「Game Control Plus」をインストールする。

###③サンプルスケッチを用いて動作の確認。
上タブの「ファイル」→「サンプル」から「Game Control Plus」のサンプルデータを確認。「Gcp_Configurator」を選んで起動。つないだデバイス名の左にあるボタンを押すと、詳細画面が開く。そこで各ボタン、レバーの動作の確認ができる。GT Forceでは6つのボタンと4つのスライダーが認識された。しかし4つのうち「Combined pedals」のスライダーは反応しなかった。動作の確認が取れたら、このプログラムを終了する。

次は、同様にサンプルプログラムを用いてコントローラーの情報を得る。これは今後のプログラミングにおいて重要になる。先ほど選んだ「Game Control Plus」のサンプルプログラムの中から「Gcp_ShowDevices」を選んで起動する。このプログラムでは、コントローラーのスライダーやボタンの名前・番号が確認できる。プログラムのスクロールバーの動きが不安定であったが、問題なく次のようなデータが得られた。この情報を記録する。

```コントローラーデータ

　NAME :     Logicool WingMan Formula Force GP USB
  Type :     Wheel
  Port :     Unknown
    Buttons (6)
      Type     Name               Multiplier
      button    Left Paddle         -
      button    Right Paddle        -
      button    Button 3            -
      button    Button 4            -
      button    Button 5            -
      button    Button 6            -
    Sliders (4)
      Type     Name               Multiplier     Tolerance
      slider    Wheel axis          1.0            0.0            absolute
      slider    Combined pedals     1.0            0.0            absolute
      slider    Accelerator         1.0            0.0            absolute
      slider    Brake               1.0            0.0            absolute

```
##プログラミングのときに使うキーワード。
「自作のいろいろ」様の[サイト](https://garchiving.com/how-to-gamepad-in-processing/)から引用。
###ライブラリーをインクルードする。
```Java
import net.java.games.input.*;
import org.gamecontrolplus.*;
import org.gamecontrolplus.gui.*;
```

###使用するコントローラーの宣言など
```Java
ControlIO control;
ControlDevice device;
ControlSlider[] sliders = new ControlSlider[4];
ControlButton[] button =new ControlButton[6];
```
これは使用する機器により配列数の変更などが必要。

###機器の読み込み（setup()内で宣言する。）
```Java
control = ControlIO.getInstance(this);
device = control.getDevice("Logicool WingMan Formula Force GP USB");//使用する機器により変更する。
```

###スライダーの割り当て（setup()内で宣言する。）
```Java
sliders[0] = device.getSlider(0);
```
これで宣言が可能である。先ほど「sliders[]」という配列を作成したので、そこに代入している。ボタン複数の場合は数字を変更する。

###スライダーの値を取り出す
```Java
sliders[0].getValue()
```
スライダーからの値はこれで簡単に取り出せる。

###ボタンの割り当て（setup()内で宣言する。）
```Java
button[0] = device.getButton(0);
button[0].plug(this, "func1", ControlIO.ON_PRESS);//ボタンを押したときの処理
button[0].plug(this, "func2", ControlIO.ON_RELEASE);//ボタンを離した時の処理
```
ボタンはこのように設定した。それぞれ関数名を設定し、イベントが発生したときに実行させることができる。関数は下記のように宣言する。

```Java
void func1(){
//実行させたい処理
}
void func2(){
//実行させたい処理
}
```
上記のキーワードを組み合わせることで簡単に実行させることができる。

###値の操作
コントローラーから出力される値は正から負の値であったため、値の調整が必要であった。その時は「map」関数を使用すると便利である。xをa→bの範囲からc→dの範囲に変換する場合、

```Java
float x = map(x,a,b,c,d);
```
このように簡単に使用できる。


##おわりに
このようにとても簡単にゲームコントローラーを使用できるようになる。ProcessingはArduinoともシリアル通信で簡単につなげることができるのでやれることが広がると思った。