0
0

More than 1 year has passed since last update.

dxlibでjoyconを使う その1

Last updated at Posted at 2021-11-27

 去年に続いて今年もアドベントカレンダーに投稿させてもらいます。
 つい最近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

なお、斜めの時には対応する二つの定数を両方調べればいいようです。
ついでに検証してなかったので試したところ、振動機能が搭載されているのに振動させることはできませんでした。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0