Cocos2d-x でジョイスティックをサポートする方法 (Windows/Mac)

こんにちは。

最近 Unity に押されがちですが、根強いファンのいる Cocos2d-x の Windows/Mac ビルドでジョイスティックをサポートする方法をまとめました。特に Windows では落とし穴があるので要注意です。

※ここでいうジョイスティックとは、物理的なジョイスティック(ゲームパッド)のことで、仮想ジョイスティックではありません。
※iOS/Android にはジョイスティックサポートがあるようです。

GLFW の関数を直接呼ぶ

「Cocos2d-x は Windows でも Mac でも動いてすごいわー」と思っていましたが、実装を見てみると内部では GLFW というオープンソースのライブラリーを使用しており、GLFW が Windows/Mac などをサポートしていました。その点で言えば、すごいのは GLFW です。

GLFW の API を見てみると、ジョイスティックサポートもちゃんとあります。ですので、Cocos2d-x に API がないなら GLFW の API を直接呼び出すのがよさそうです。

Cocos2d-x にすでに含まれている glfw3.h をインクルードし、以下の関数を使えば必要最低限の情報は取れます。

  • glfwJoystickPresent() – ジョイスティックが存在するか調べる
  • glfwGetJoystickButtons() – ジョイスティックの全ボタン状態を配列で取得
  • glfwGetJoystickAxes() – ジョイスティックの全スティック状態を配列で取得

例えば以下のような処理を、(scheduleUpdate を行った後) シーンのupdateメソッド内で行えばよいです。

Mac 版ではここまでです。意外と簡単にジョイスティックサポートできましたね!

Windows 版はこのままでは動作しませんので、以下のような対処が必要でした。

以下、Windows版のみの問題

Windowsでは、普通に上記の処理を行っても、glfwJoystickPresent() から 0 が返ってきてしまい、うまくいきません。どうやら、Cocos2d-x 本体 (libcocos2d.dll) がスタティックライブラリ版の GLFW (glfw3.lb) をリンクしていて、それとは別にプログラム本体 (xxxx.exe) もスタティックライブラリ版の GLFW をリンクすることになるので、GLFW の実態が複数存在してしまっているのが原因のようです。

解決方法はいくつかありそうですが、とりあえずDLLバージョンのGLFW使用することで回避できました。

GLFW DLL 版のダウンロード

GLFWは github で公開されており、過去のバージョンも含めてバイナリ版がダウンロードできます。

使用している Cocos2d-x のバージョンによって、使われている GLFW のバージョンが異なりますので注意してください(Cocos2d-x v3.12 までは GLFW3.0.4、Cocos2d-x v3.13 以降は GLFW3.2 が使われています)。

ここでは、以下のページから glfw-3.2.bin.WIN32.zip をダウンロードしました。

https://github.com/glfw/glfw/releases

ss1

ダウンロードした zip ファイルを展開し、使用している Visual Studio のバージョンにあった glfw3.dll と glfw3dll.lib を、Cocos2d-x の cocos2d\external\glfw3\prebuilt\win32 にコピーします。

ss2

ビルドパラメータの変更

Visual Studio 上で、プロジェクト libcocos2d および自分のプロジェクト(ここでは JoystickSample)の両方のビルドパラメータに以下の変更を行います。

(1) [C/C++]-[プリプロセッサ]-[プリプロセッサの定義] に GLFW_DLL を追加

ss5

ss6

(2) [リンカー]-[入力]-[追加の依存ファイル] に glfw3dll.lib を追加

ss3

ss4

(残念ながら libcocos2d のリビルドが必要です。5分くらいでしょうか・・・。)

ここまでやれば、ジョイスティックが exe 側からでも見えるはずです。

最低限の動作が確認できるサンプル JoystickSamplegithub に置いてありますので、参考にして下さい。win32版です。

ジョイスティックが16本まで認識されて、ボタンとスティックの状態がリアルタイムに表示されます。

ss10

この例では、ジョイスティックが2本認識されています。
1つ目のジョイスティックの1番と4番のボタンと、2つ目のジョイスティックの14番のボタンが押されています。

どうも Cocos2d-x の Windows ビルドは、フルスクリーン対応も中途半端だったり、ちょこちょこ抜けがある気がして不安ですが、がんばって行きましょう。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です