見出し画像

リングフィットコントローラーとロックマンで遊びながらエクササイズできるようにした話


今年は外出せずにすむように、リングフィットアドベンチャーでエクササイズをしています。
本編の他にミニゲームやリズムゲーム(ダンスダンスレボリューションやフィットボクシングのリングフィット版みたいなの)も用意されているのですが、数週間継続するとゲームとしては物足りなくなってきました。

そんな中、あつまれどうぶつの森 、ゼルダの伝説 、マリオカート といったゲームをリングフィットコントローラー(Ring-Con)で遊べるようにしている人を見つけました。

自分が遊んだことがあるゲームでエクササイズに向いていそうなゲームとしてロックマンを思い出したので、Ring-Conでロックマンをプレイできるようにすることにしました。

こちらがデモ動画です。


任天堂Switchの多くのゲームではボタンの割り当ての設定はできるようになっていて、例えばマリオカートだとJoy-Conを左右に傾けることにより左右の操作が可能なのですが、残念ながら、スクワット等のモーション操作で任意のボタンを押せるようにするカスタマイズは対応していません。

そのため、Switch、ドック、Ring-Con以外に、Titan Twoという機器とそのBluetoothアクセサリ(合わせて2万円前後)が必要になります。

仕組みとしては、Joy-ConとSwitch間で直接Bluetoothで通信するのではなく、Joy-ConとTitan Two間でBluetooth通信し、Titan Two内にインストールしたプログラムで信号処理した上でUSB出力して、Switchに渡すようにします。

デモ動画の左側はTitan Twoと通信しているUIで、プログラムの入力と出力信号(2つのJoy-Conの各種ボタンやモーション信号)をモニタリングしています。

試行錯誤の結果、最終的にバージョン 2では次のようにプログラムしました。(バージョン1については後述)

浅めのスクワット → Yボタンを押した時の信号を出力 → ロックバスターを打つ。

Ring-Conを左右に傾ける → スティックを水平方向に傾けた時の信号を出力 → 水平方向に移動。

Ring-Conを手前に傾ける(持ち上げる)→ スティックを上方向に傾けた時の信号を出力 → はしごを登る。

Ring-Conを前に傾ける(下ろす)→ スティックを下方向に傾けた時の信号を出力 → はしごを降りる。

Aボタンを押す → Bボタンを押した時の信号を出力 → ジャンプ。
(Ring-Conに装着すると90度傾けることになるため、X, A, B, Yボタンも90度ずつ回転させる。)

Aボタンを押しながら、Ring-Conを前に傾ける(下ろす)→ スライディング(ロックマン3で追加されたアクション)。

ジャンプは当初はモーション操作でできるようにしたものの、思い通りのタイミング、滞空時間でのジャンプが難しかったため、ボタンを押すようにしました。

Ring-Conのグリップよりも上の部分(2時と10時の位置)を掴むようにすれば、モーションコントロールとボタン操作の両方が可能です。

Ring-Conを目線の高さまで持ち上げ続けると、それなりの腕への負荷になります。

チャージするためにスクワット状態を続けると、足への負荷になります。
チャージショットは、ロックマン4~8、ロックマン10のブルースモード、ロックマン11で使えます。

個人的には古いバージョンのロックマンのほうが懐かしくて好きなのですが、新しいバージョンだと難易度を調整できます。

特にロックマン11は「NEW COMER」モードという、落ちても死なず、ゲームオーバーにもならないオプションが用意されているので、難易度の上がるRing-Conでの操作で遊ぶには最適でした。

実は、当初はスクワットでジャンプできるようにしたかったのですが、スクワットするという動作の途中でモーション信号が少し複雑な動きをすることにより小刻みに小ジャンプを繰り返してしまう、という問題があり、指数平滑移動平均を計算したり色々試したもののうまくいきませんでした。

結局スクワットしたタイミングでジャンプし始めて、その時にRing-Conをどのくらい手前に傾いているかでジャンプの高さ(滞空時間)を決める、という実装に落ち着き、こちらもバージョン1として使用可能ですが、操作しづらいので私は使わないようになりました。

バージョン1と2のプログラムをTitan Twoの別のメモリスロット(例えばメモリスロット1と2)にインストールしておけば、Titan Twoの上下ボタンを押すだけで切り替えることもできます。

Titan Twoのメモリスロットを0に切り替えることで、プログラムでの信号処理を無効化してそのまま他のゲームを遊ぶこともできますが、リングフィットアドベンチャーに切り替えるためにはJoy-Conを(Titan Twoを経由せずに)直接SwitchにBluetooth接続する必要があるのは少し残念なところです。


[セットアップ手順の詳細とプログラム]

こちらのGitHubリポジトリにアップしています。"Mega Man"はロックマンの英語名です。

RingFit_MegaMan
https://github.com/Minyus/RingFit_MegaMan

[技術的な話]

プログラムはGPCというC言語に近い言語(といってもポインタ等の複雑なプログラミングは不要)で

main {

}

内に書いたコードが1ミリ秒よりも短い間隔で繰り返し実行されます。

詳細はこちらのページに書かれています。

Joy-Conのモーション信号の仕様についてはドキュメントが見つかりませんでしたが、Titan Twoに接続したPCでJoy-Conのモーション信号をモニタリングできますので、実際にJoy-Conを動かして信号の応答を観察しました。

例えば、Ring-Conを右に少し傾けるとJoy-Conのスティックを右に倒した時の信号を出力して右に移動するようにするには、

入力信号: Ring-Conを右に0度 → 90度に傾けるとSWITCH_JOYACCY (Joy Acc Y)の値が 0 → +25 となる。
出力信号: Joy-Conのスティックを右に倒すと SWITCH_LX (Left Stick X)の値が100 となる。

という観察結果から

main {
if(get_val(SWITCH_JOYACCY) > 9.0) {set_val(SWITCH_LX, 100.00)};
}

のように書けばいいことがわかります。

注意点1: “Accel”, “Acc”という名称ですが、加速度ではなく角度です。
注意点2: Gyroは2つのJoy-Conから計算される加速度(?)のようで、Ring-Conと足ストラップに分離して使う場合には複雑な挙動となり、扱いが難しそうでした。
注意点3: Ring-Conを縮めた状態や引っ張った状態かどうかという信号はリングフィットアドベンチャーでは検知されていますが、Titan Twoでは対応していないようです。素早く縮めたり引っ張ったりした時に生じるGyro信号の変化で代用することはできますが、Ring-Conを傾ける他の操作でも誤探知してしまう場合がありました。

Switch のボタン、スティック、モーション信号の名称のリストはこちらのページにあります。

今回はRing-Conでロックマンを遊べるようにしましたが、スクワットに一つのボタン操作、
Ring-Conの4つの動作(左右、手前、奥に傾ける)をスティックの上下左右もしくは他のボタンに割り当てることでうまく遊べるゲームであれば、他のゲームにもすぐに応用できそうです。

例えば、https://github.com/Minyus/RingFit_MegaMan/blob/master/ringfit_megaman_squatbuster.gpc のスクリプトの

	SQUAT_TRIGGERING_BUTTON = SWITCH_Y;

の部分を

	SQUAT_TRIGGERING_BUTTON = SWITCH_B;

に変更すれば、スクワットによりBボタンを押すことができます。

[今後]

ゲームで楽しくエクササイズや筋トレできるようにする方法について情報をお持ちの方は Twitter: @Minyus86 で教えてもらえると嬉しいです。

今後はOculus QuestでVRも試してみる予定です。

[書いた人]


Yusuke Minami 

Twitter: @Minyus86
Linkedin: linkedin.com/in/yusukeminami/
GitHub: @Minyus


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