見出し画像

【P5 Tips】 ProcessingをNintendo SwitchのJoy-Conで遠隔操作する

Nintendo Switch 皆さん持ってますよね?
知っている方も多いと思いますが、Switch の Joy-Con は Bluetooth で PC と接続できるため、いろいろな活用方法があります。
Processing でも簡単に使うことができたので、その方法をメモしておきます。

環境

- OS: macOS High Sierra 10.13.5
- Processing: 3.3.7

mac で試しましたが、Windows でも概ね同じだと思います。

Game Control Plus のインストール

まずは Processing でゲームパッドを使えるようにするライブラリをインストールします。
「スケッチ」→「ライブラリをインポート」→「ライブラリを追加」を選択して、「joystick」等で検索をかけて Game Control Plus をインストールします。

次に、「スケッチ」→「ライブラリをインポート」→「Game Control Plus」を選択して、必要なパッケージのインポート文を挿入します。

Joy-Con の設定ファイルを作成

設定ファイルがなくてもデバイス名等からデバイスを取得することはできますが、設定ファイルを用意することで、ボタンに分かりやすい名前を付けることができるので作成しておきましょう。
今回は右の Joy-Con を使用するため、以下の内容で joy-con-r というファイルを作成し、プロジェクトフォルダの下に data フォルダを作成し、その中に置きます。

Joy-Con (R) Configration
A	Button A	1	BUTTON	0	0	0.0	0.0
X	Button X	1	BUTTON	1	0	0.0	0.0
B	Button B	1	BUTTON	2	0	0.0	0.0
Y	Button Y	1	BUTTON	3	0	0.0	0.0
SL	Button SL	1	BUTTON	4	0	0.0	0.0
SR	Button SR	1	BUTTON	5	0	0.0	0.0
PLUS	Button +	1	BUTTON	9	0	0.0	0.0
STICK	Button Stick	1	BUTTON	11	0	0.0	0.0
HOME	Button Home	1	BUTTON	12	0	0.0	0.0
R	Button R	1	BUTTON	14	0	0.0	0.0
ZR	Button ZR	1	BUTTON	15	0	0.0	0.0
POV	Hat Pov	2	HAT	cooliehat: pov	0	1.0	0.0

1行目は任意の説明。 2行目以降は各ボタンの設定になります。
ボタンの対応については特に説明する必要はないと思いますが、スティックはハットスイッチ(つまり十字キー)としてアサインされます(13行目)。
Windows では vJoy 等のドライバーを使用することで、スティックをジョイスティックとして使える他、ジャイロ等も利用できるようですが、今回は使用しません。

左の Joy-Con を使用する場合も同様に以下のようなファイルを用意します。

Joy-Con (L) Configration
LEFT	Button Left	1	BUTTON	0	0	0.0	0.0
DOWN	Button Down	1	BUTTON	1	0	0.0	0.0
UP	Button Up	1	BUTTON	2	0	0.0	0.0
RIGHT	Button Right	1	BUTTON	3	0	0.0	0.0
SL	Button SL	1	BUTTON	4	0	0.0	0.0
SR	Button SR	1	BUTTON	5	0	0.0	0.0
MINUS	Button -	1	BUTTON	8	0	0.0	0.0
STICK	Button Stick	1	BUTTON	10	0	0.0	0.0
SHUTTER	Button Shutter	1	BUTTON	13	0	0.0	0.0
L	Button L	1	BUTTON	14	0	0.0	0.0
ZL	Button ZL	1	BUTTON	15	0	0.0	0.0
POV	Hat Pov	2	HAT	cooliehat: pov	0	1.0	0.0

プログラムから Joy-Con の状態を取得する

あとはプログラムから設定ファイルを読み込んで使用するだけです。

デバイスの取得

まず、設定ファイルに該当するデバイスを取得します。

ControlIO control = ControlIO.getInstance(this);
ControlDevice device = control.getMatchedDevice("joy-con-r");

ボタン状態の取得

ボタン状態の取得は、device.getButton("A") 等で ControlButton クラスのインスタンスを取得して、pressed() メソッドで取得できます。
ここで getButton() に指定する文字列は、設定ファイルの各ボタン設定の1番左の項目です。

ControlButton buttonA = device.getButton("A");
if (buttonA.pressed()) {
  println("A button is pressed");
} else {
  println("A button isn't pressed");
}

スティック状態の取得

スティック状態の取得は、device.getHat("POV") で ControlHat クラスのインスタンスを取得して、up()down()left()right() メソッドで取得できます。
また、getPos() で倒している方向を取得することもできます。

ControlHat pov = device.getHat("POV");
if (pov.up()) {
  println("up");
} else if (pov.down()) {
  println("down");
}

スティックの方向は「横持ち」基準

Joy-Con のスティックの方向については少し注意が必要です。
Joy-Con は複数の持ち方をサポートしており、片手で持つ持ち方は「縦持ち」、両手で持つ持ち方は「横持ち」と呼ばれています。
今回は「縦持ち」で扱いたいのですが、Joy-Con のスティック方向は「横持ち」が基準になっています。
したがって、「縦持ち」で持った状態でスティックを上に倒すと、右に倒したと認識されてしまいます。
「縦持ち」する場合には、これを加味して補正してあげる必要があります。

サンプル

Joy-Con のデバイスを取得してボタンとスティックの状態を表示するサンプルを作成しました。

import net.java.games.input.*;
import org.gamecontrolplus.*;
import org.gamecontrolplus.gui.*;

ControlIO control;
ControlDevice device;
String[] names = {"A", "B", "X", "Y", "SL", "SR", "PLUS", "STICK", "HOME", "R", "ZR"};

void setup() {
  size(500, 360);
  colorMode(HSB, 360, 100, 100);
  rectMode(CENTER);
  textAlign(LEFT, CENTER);

  control = ControlIO.getInstance(this);
  // 設定ファイルからデバイスを取得
  device = control.getMatchedDevice("joy-con-r");
  if (device == null) {
    println("No suitable device configured");
    System.exit(-1);
  }
}

void draw() {
  background(200, 60, 30);

  // ボタンの状態を表示
  int i = 0;
  for (String name : names) {
    stroke(#eeeeee);
    if (device.getButton(name).pressed()) fill(30, 60, 90); else noFill();
    rect(30, 30 + i * 30, 15, 15);
    fill(#eeeeee);
    text(name, 50, 30 + i * 30);
    i++;
  }
  
  // スティックの状態を表示
  float radius = 75;
  stroke(#eeeeee);
  noFill();
  translate(width/2, height/2);
  beginShape();
  for (i = 0; i < 8; i++) {
    float angle = (float)i / 8 * TWO_PI;
    vertex(radius * cos(angle), radius * sin(angle));
  }  
  endShape(CLOSE);

  noStroke();
  fill(30, 60, 90);
  int pos = device.getHat("POV").getPos();
  float x = 0, y = 0;
  if (pos > 0) {
    // 「横持ち」基準で上下左右が決められているため
    // 右の Joy-Con の場合は HALF_PI を足す
    // 左の Joy-Con の場合は HALF_PI を引く
    float angle = (float)pos / 8 * TWO_PI + HALF_PI;
    rotate(angle);
    x = radius;
  }
  ellipse(x, y, 20, 20);
}

まとめ

Game Control Plus というライブラリを使用することで簡単に Joy-Con を Processing で使用することができました。
Joy-Con は複数の物理ボタンとスティックを片手で操作できる優れたインターフェースであり、Bluetooth で PC と無線接続できるため、Processing の作品を遠隔操作したいとき等に便利ではないでしょうか。

参考資料

- Processingでゲームパッドを使おう (その1) - 雑念日記


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