アドベントカレンダーに投稿する2つ目の記事です。
前回の続きとして、両手持ちさせるための関数を作りたいと思います。
前回の次回予告?ではクラスを作ると書きましたが、クラスにする意味がなさそうだったので関数群となっています。
前提条件
前回と同じくjoyconを使うには、あらかじめPCとペアリングという作業をする必要があります。ネットで調べれば接続方法はたくさん出てきます。
プログラム
以下のプログラムを作成しました。本当はよくないのですが、掲示板の管理人さんにGetJoypadType関数を教えてもらってプログラムを修正した後にタイミング悪くjoyconのLがパソコンと正常に接続できなくなって実行確認ができていません。もし実行確認ができた人がいたら教えてください。まあ管理人さんに教えてもらう前に、無理やりjoyconがどの番号なのか手動で指定したときに問題なかったのでたぶん大丈夫だとは思います。ゲームのメインループの直前にLoadJoycon関数を使ってさえいれば後はdxlibにある関数であるGetJoypadDirectInputState関数の第一引数が無いだけで使いかたは同じです。検証もGetJoypadDirectInputState関数のサンプルをちょっと改造しただけのもので行いました。
#pragma once
#include <string.h>
#include "dxlib.h"
int joyconL = 0;
int joyconR = 0;
//joyconを探す。返り値としてjoyconの数を返す。ただしLとR以外の組み合わせだとバグる。joyconを3つ以上つないでもバグる。
int LoadJoycon() {
int num = 0;
for (int i = 1; i < GetJoypadNum(); i++) {
if (GetJoypadType(i) == DX_PADTYPE_SWITCH_JOY_CON_L) {
joyconL = i;
num++;
}else if (GetJoypadType(i) == DX_PADTYPE_SWITCH_JOY_CON_R) {
joyconR = i;
num++;
}
}
return num;
}
int GetJoyconDirectInputState(DINPUT_JOYSTATE *DInputState) {
if (joyconR*joyconL == 0) return -1;
int stateR = GetJoypadDirectInputState(joyconR, DInputState);
if (stateR == -1) return -2;
DINPUT_JOYSTATE DInputStateL;
int stateL = GetJoypadDirectInputState(joyconL, &DInputStateL);
if (stateL == -1) return -3;
if (DInputState->POV[0] != -1) {
DInputState->POV[0] = ((DInputState->POV[0]) + 27000) % 36000;
}
if (DInputStateL.POV[0] != -1) {
DInputState->POV[1] = ((DInputStateL.POV[0]) + 9000) % 36000;
}
else {
DInputState->POV[1] = DInputStateL.POV[0];
}
DInputState->Buttons[4] = DInputStateL.Buttons[14];
DInputState->Buttons[5] = DInputState->Buttons[14];
DInputState->Buttons[8] = DInputStateL.Buttons[8];
DInputState->Buttons[10] = DInputStateL.Buttons[10];
DInputState->Buttons[13] = DInputStateL.Buttons[13];
DInputState->Buttons[14] = DInputStateL.Buttons[15];
return 0;
}
ちなみにボタンと構造体の対応は以下となっています。
POVが
インデックス | 対応するスティック |
---|---|
0 | 右スティック |
1 | 左スティック |
buttons配列が、 |
定数 | 対応するボタン |
---|---|
PAD_INPUT_1 | A |
PAD_INPUT_2 | X |
PAD_INPUT_3 | B |
PAD_INPUT_4 | Y |
PAD_INPUT_5 | L |
PAD_INPUT_6 | R |
PAD_INPUT_9 | - |
PAD_INPUT_10 | + |
PAD_INPUT_11 | ジョイスティック押し込み左 |
PAD_INPUT_12 | ジョイスティック押し込み右 |
PAD_INPUT_13 | HOME |
PAD_INPUT_14 | キャプチャーボタン |
PAD_INPUT_15 | ZL |
PAD_INPUT_16 | ZR |
それ以外は変化ありません。POVの向きはきちんと両手持ちのときの向きに修正してあります。両手持ちしたときの左のjoyconの4つのボタンは取得できませんが多分あんまり使わないかなと思い対応させてません。 |
まとめ
これで両手持ちに対応させることができます。次の記事はどうしましょうか。特に決めてないですが、もともとはjoyconの機能(ジャイロセンサや加速度センサ、IRカメラ)を使うためにdxlibの関数を使わずに自力で操作を取得するのに挑戦しようとは考えてたんですけどいうほどdxlibに関係が無いというアドベントカレンダーに追加するにはちょっと無理があることに気が付きました。一応まったく考えが無いわけではないのでちょっと色々試したいと思います。joyconのLが正常につながらない状態で試せるかはわかりませんが。