去年に続いて今年もアドベントカレンダーに投稿させてもらいます。
つい最近switchを買ったので、joyconをPCに繋げて使ってみたいと思います。
joyconとは
任天堂が発売しているゲーム機のswitchに付属しているコントローラー。コントローラー自体はbluetoothでPCとつないで使うことができます。joyconは二つで1セットだが、それぞれ別の二つのコントローラーとして認識されます。
前提条件
joyconを使うには、あらかじめPCとペアリングという作業をする必要があります。ネットで調べれば接続方法はたくさん出てきます。
接続テスト&検証
dxlibにはちょうどjoypadに接続、使用するための関数が存在するので接続テストもかねてdxlibにあるどの定数がどのボタンに対応しているのか検証します。ジョイスティックはまた別のプログラムで検証します。
検証には以下のプログラムを用いました。
#include "Dxlib.h"
int WINAPI WinMain(HINSTANCE h1,HINSTANCE hp,LPSTR lpC,int nC) {
ChangeWindowMode(true);
if (DxLib_Init() == -1) return -1;
printfDx("%d",GetJoypadNum());
while (ProcessMessage() != -1) {
int padinput = GetJoypadInputState(DX_INPUT_PAD1);
int padinput2 = GetJoypadInputState(DX_INPUT_PAD2);
int n = 0x10;
clsDx();
for (int i = 0; i < 28; i++) {
printfDx("id:%d state1:%d state2:%d\n",i,padinput&n,padinput2&n);
n *= 2;
}
}
DxLib_End();
return 0;
}
検証結果は以下の通りです。上下左右は縦持ちの時です。
定数 | 対応するボタン |
---|---|
PAD_INPUT_1 | A or 左ボタン |
PAD_INPUT_2 | X or 下ボタン |
PAD_INPUT_3 | B or 上ボタン |
PAD_INPUT_4 | Y or 右ボタン |
PAD_INPUT_5 | SL |
PAD_INPUT_6 | SR |
PAD_INPUT_9 | - |
PAD_INPUT_10 | + |
PAD_INPUT_11 | ジョイスティック押し込み左 |
PAD_INPUT_12 | ジョイスティック押し込み右 |
PAD_INPUT_13 | HOME |
PAD_INPUT_14 | キャプチャーボタン |
PAD_INPUT_15 | R |
PAD_INPUT_16 | ZR |
以上の検証結果を参考にすればjoyconをdxlibで使うことは可能です。 | |
次にジョイスティックを検証します。 | |
検証には以下のプログラムを使いました。 |
#include "Dxlib.h"
int WINAPI WinMain(HINSTANCE h1,HINSTANCE hp,LPSTR lpC,int nC) {
ChangeWindowMode(true);
if (DxLib_Init() == -1) return -1;
printfDx("%d",GetJoypadNum());
while (ProcessMessage() != -1) {
int x=0, y=0;
clsDx();
GetJoypadAnalogInput(&x, &y, DX_INPUT_PAD1);
printfDx("x:%d y:%d\n",x,y);
GetJoypadAnalogInput(&x, &y, DX_INPUT_PAD2);
printfDx("x:%d y:%d\n", x, y);
}
DxLib_End();
return 0;
}
が、ここで問題が発生しました。なんとジョイスティックいくらいじっても数字が変わりません。原因を探るために追加で検証を行います。
GetJoypadDirectInputStateという関数のサンプルをそのまま使います。
結果としてはPOVというところの0番に反応がありました。LとR同じです。そういえばこの後書く予定の記事のための情報収集の時にjoyconのジョイススティックは8方向取得できるってあったような。POVはハットスイッチ用のメンバみたいですが…え?ハットスイッチなの?ついでに押し込み時の取得方法がわかったので上記の表に書いておきました。少し話が脱線しますけどここまでくるとなぜか空いている7と8が何なのか気になります。知ってたら教えてください。
まとめ
これでjoyconのボタン、ジョイスティックの動作が取得できます。次はjoyconといえば両手持ち。両手持ちを使うためのラッパークラスを作りたいと思います。
追加検証
ふとjoyconのジョイスティックがハットスイッチであることから追加で検証しました。結果として以下のようになりました。
定数 | 対応するジョイスティックの方向(横持ち) |
---|---|
PAD_INPUT_UP | 上 |
PAD_INPUT_DOWN | 下 |
PAD_INPUT_RIGHT | 右 |
PAD_INPUT_LEFT | 左 |
なお、斜めの時には対応する二つの定数を両方調べればいいようです。 | |
ついでに検証してなかったので試したところ、振動機能が搭載されているのに振動させることはできませんでした。 |