【備忘録】Processingでgame control plusを使う 2

前回の記事に続き、

game control plusでゲームパッドを使えるようにしていきます。


かなり広く対応できるようになったため、

このプログラムを公開します。


プログラム本文

import org.gamecontrolplus.*;

ControlIO control;
ControlDevice device;

ControlSlider[] sliders;
ControlButton[] button;
int[] val_sliders,val_buttons;      //応用できるように値を配列で格納

void setup() {
    Controller_Setup();
    frameRate(10);
}

void draw() {
    background(0);
    textUpDate();
}

void textUpDate(){
    for (int i = 0; i < device.getNumberOfSliders(); ++i) {
        val_sliders[i] = int((sliders[i].getValue()+1)/2*1023);     //スライダの値を0~1023で表せるように調節してprint
        println(i + ": " + val_sliders[i]);
    }
    for (int i = 0; i < device.getNumberOfButtons(); ++i) {
        if (button[i].pressed()) {
            print((i+1) + "is Pressed");                            //ボタンの状態をpressed,releasedと0,1で使用できるようにしている
            val_buttons[i] = 1;
            println("            " + val_buttons[i]);
        }else {
            print((i+1) + "is Released");
            val_buttons[i] = 0;
            println("            " + val_buttons[i]);
        }
    }
    
}

void Controller_Setup(){
    control = ControlIO.getInstance(this);
    println("使えるデバイス: " + control.getDevices());
    device = control.getDevice("DualSense Wireless Controller");        //ここに表示された使いたいコントローラの名前を入れる

    val_sliders = new int[device.getNumberOfSliders()];     //コントローラのスライド数を取得し、値を入れるための配列を決める
    val_buttons = new int[device.getNumberOfButtons()];     //同様にボタンでも行う

    sliders = new ControlSlider[device.getNumberOfSliders()];       //こちらはライブラリがスライダを指定できるための配列
    button = new ControlButton[device.getNumberOfButtons()];        //同様にボタンでも行う

    for (int i = 0; i < device.getNumberOfSliders(); ++i) {
        sliders[i] = device.getSlider(i);                           //スライダの名前とスライダの指定用の配列の紐づけ
    }

    for (int i = 0; i < device.getNumberOfButtons(); ++i) {
        button[i] = device.getButton(i);                            //同様にボタンでも行う
    }
}



解説

まず、game control plusが入っていることが前提です。

まだできてない方は前回の記事を参考にしてください。


今回、参考にしたコードは以下の二つのブログから拝借しました。


今回書いたプログラムでは、スライダの値が0~1023、

各ボタンのオンオフを0と1で配列に入れました。

私はこれからこれをarduinoなどと連携したいと
考えているためです。


序文

import org.gamecontrolplus.*;

ControlIO control;
ControlDevice device;

ControlSlider[] sliders;
ControlButton[] button;
int[] val_sliders,val_buttons;      //応用できるように値を配列で格納

ここはあまりいじっていません。

ライブラリをインポートして、関数の名前を指定し、
ライブラリが使用するための
スライダとボタンの配列を用意します。

int型で値を入れるための配列を用意しました。

setup

void setup() {
    Controller_Setup();
    frameRate(10);
}


void Controller_Setup(){
    control = ControlIO.getInstance(this);
    println("使えるデバイス: " + control.getDevices());
    device = control.getDevice("DualSense Wireless Controller");        //ここに表示された使いたいコントローラの名前を入れる

    val_sliders = new int[device.getNumberOfSliders()];     //コントローラのスライダ数を取得し、値を入れるための配列を決める
    val_buttons = new int[device.getNumberOfButtons()];     //同様にボタンでも行う

    sliders = new ControlSlider[device.getNumberOfSliders()];       //こちらはライブラリがスライドを指定できるための配列
    button = new ControlButton[device.getNumberOfButtons()];        //同様にボタンでも行う

    for (int i = 0; i < device.getNumberOfSliders(); ++i) {
        sliders[i] = device.getSlider(i);                           //スライダの名前とスライダの指定用の配列の紐づけ
    }

    for (int i = 0; i < device.getNumberOfButtons(); ++i) {
        button[i] = device.getButton(i);                            //同様にボタンでも行う
    }
}


setupの部分で少し変更を加えました。

最初にプログラムを動かした際、おそらく動かないと思います。
ターミナルにパソコンに接続されているデバイス名が出てきます。

そのなかから、自分が使用したいデバイスの名前を
今回の場合だと"DualSense Wireless Controller"と入っているところにいれます。

そしたら値の取得が自動で行われます。

各スライダ、ボタンの値を入れる配列と指定する配列を
コントローラのスライダ、ボタン数に合わせて設定して、

最後にそれらを、for文で関連付けを行ってsetupは完了です。

draw

void draw() {
    background(0);
    textUpDate();
}

void textUpDate(){
    for (int i = 0; i < device.getNumberOfSliders(); ++i) {
        val_sliders[i] = int((sliders[i].getValue()+1)/2*1023);     //スライドの値を0~1023で表せるように調節してprint
        println(i + ": " + val_sliders[i]);
    }
    for (int i = 0; i < device.getNumberOfButtons(); ++i) {
        if (button[i].pressed()) {
            print((i+1) + "is Pressed");                            //ボタンの状態をpressed,releasedと0,1で使用できるようにしている
            val_buttons[i] = 1;
            println("            " + val_buttons[i]);
        }else {
            print((i+1) + "is Released");
            val_buttons[i] = 0;
            println("            " + val_buttons[i]);
        }
    }
    
}


最後にdraw部分です。

drawではターミナルに値を表示させるようにしています。
応用してもらえば簡単にtext等で使用できると思います。

sliders[指定する番号].getValue()で-1~1のfloat型で取得できるので、
これをint型に変更しつつ、値の処理を行っています。

ボタンの処理に関しては、オンオフで条件を変化させて文章によるprintとval_buttonsによる数字的表記を重ねています。


まとめ

Processingでゲームパッドを簡単に使用できるコードができました。

これを応用してArduinoなどの開発につなげていきたいです。

この記事が気に入ったらサポートをしてみませんか?