2025/2/12(水)

ゲーム制作ライブラリの開発を進めた。ストリーミングにリサンプラも付け加えることができ、音声まわりは最早半完成と言って良さそうだ。もちろんやるべきことはまだまだあるが、最低限シンプルなゲームを作るには困らない。

一応のTODO:

  • ストリーミング再生時のシーク・ループ再生機能
  • 再生位置・再生停止状態取得
  • フィルタ機能の導入(HRTFなどを想定)
  • タイミング指定再生機能(音ゲーなどでクリティカルなタイミング調整が必要な場合を想定)
  • コールバック関数によるオーディオ(通話、シンセサイザ、動画同期音声などを想定)
  • 録音機能
  • デバイス一覧取得/デバイス指定再生

もう一刻も早くシンプルなゲームを作ってサンプルとしたいので、残された最後の砦である入力周りに取り掛かった。すなわちキーボード、カーソル、ジョイスティックである。最優先はキーボードだ。

てっきりGLFWですぐだろうと思っていたが、見通しが甘かった。GLFWは特定のウィンドウに紐づいたキーボードイベントしか処理せず、WindowsAPIのGetAsyncKeyStateに相当するようなことは出来ない。glfwGetKeyのウィンドウにNULLを指定すれば行けたりしないかと思ったが、ソースコードを読むともう2行目くらいでウィンドウがNULLでないことをチェックするコードが入っていた。ウィンドウが複数出せるしウィンドウが0個でもよいというのはこのライブラリの差別化ポイントの一つなので、ウィンドウに関わりなくキー取得できる体制は整えたい。

ここは腹を括ってプラットフォーム依存なコードを書くしかあるまい。WindowsはGetAsyncKeyState、MacOSはCGEventSourceKeyState、X11環境ではXQueryKeymapなるAPIが使えそうだった。自分の使っているのはWindowsなので一旦Windows優先とはなるが、他2つについても動作確認を取る。

もう一つ言うとAPI設計も問題だ。ゲームだけを念頭に置くなら上記のようなウィンドウ非依存のキー取得APIがあれば良いが、ツール系の開発も視野に入れているので、ウィンドウに依存したキー取得も提供はしたい。ツール系アプリでフォーカスしていないウィンドウも反応するのでは困るからだ。ちょっと考えたが、ウィンドウを表すクラスのメソッドとしてキー押下コールバック関数の登録とかできるようにすれば良いと思った。

ウィンドウ非依存のキー取得APIについてはSiv3Dと同じく、グローバル変数をずらずら提供する形で良いことにした。プログラマ側でキーオブジェクトを作成する形も考えたが、キーボードという存在はプログラムの始まりから終わりまで存在するのだからグローバル変数として常住の存在であった方が理に適っているだろう。ここで無理に逆張る必要はあるまい。

とりあえずWindowsで押下状態を取得するのだけは出来るようになった。押した・離した瞬間を検出するのもできるようにしたい。


「望郷太郎」という漫画を読んだ。

中身とは関係ないが、ちょっと最近個人的に構想立ててた自作品とだいぶ近くて若干凹んだ。まあ差別化できるラインだけれども。

Categories: