ブラウザ用小さなゲーム向けライブラリを作ってみる
ゲームライブラリやゲームエンジン、それらはどのような機能を備えている必要があるだろうか。"How to make your own game engine (and why)" 1 という記事には以下の機能リストが挙げられている。
- 基本機能
- システム初期化:ウィンドウの準備や描画、オーディオの初期化
- フレームタイミング制御:1/60 秒ごとに定期的に呼び出されるアップデート処理
- 入力:ボタン入力などの処理
- 描画:2D もしくは 3D のテクスチャやモデルなどの描画
- 算術などのユーティリティ:ベクトル演算などゲームに必要な関数
- 発展的な機能
- ゲームオブジェクト・シーン制御:複数オブジェクトの管理、複数シーンの遷移
- オーディオ:オーディオフレームワークを使った音声再生
- ファイル管理:ファイルやリソースの管理機能
- ネットワーク:マルチプレイヤーゲーム向けの通信機能
上記以外にも、当たり判定、物理演算、シリアライズ、アニメーション、UI などの機能が、必須ではないが挙げられる。既存のゲームエンジンは長年の経験に裏付けされた機能群を提供しており、それらがどのような機能を備えているのかを知っておくことは、自作のゲームライブラリやゲームエンジンを作る際にはとても役に立つ。
また上記記事には、自作ゲームエンジンを作る際の心構えについても記載がある。
- エンジンとゲームを同時につくる:エンジンが備えるべき機能は、作りたいゲームに必要とされていることに裏打ちされているべきである。
- 必要になるまで機能を作るな:自作ゲームで必要とされない機能について、エンジンで作りこまない。
- 手になじんだプログラミング言語を使う:エンジンを作るのは大変なタスクであり、プログラミング言語習熟と同時に行うべきではない。
- 最初から正解を求めない:エンジンを作る経験を何回か経て、やっと使えるエンジンができる。
では、ブラウザで動く小さなゲーム向けのゲームライブラリはどのような機能を備えている必要があるだろう。上記の基本機能は必要だが、発展的な機能については限定的な対応でいいだろう。また、短い時間でアイデアを形にしたいと考えるのであれば、なるべくゲームが備えるメカニクスを実現することに注力できる方が良い。
これらのことを踏まえて、私は crisp-game-lib 2 というゲームライブラリを作った。このライブラリは以下の特徴を持つ。
- タイトル、ゲーム中、ゲームオーバーなどのシーン制御は定型化されてライブラリに組み込まれ、ゲームごとに開発する必要が無い。
- ハイスコア管理やリプレイなどの小さなゲームで特に必要とされる機能を提供する。
- 解像度、色数、音などが制約されていて、時間がかかるリッチな表現を必要としない。
- ゲームをジューシーにすることが簡単にできる。具体的には、各種エフェクトや効果音などが簡単に追加できる。
crisp-game-lib では、ゲームのtitle
、description
、1 秒間に 60 回呼びだされるupdate
関数を単一の JavaScript ファイル 3 として書くだけで、PC とモバイルで動作するブラウザゲームが作れる。
他のライブラリに無い特徴として、箱・線・弧・テキスト・キャラクタなどの描画機能と衝突判定機能が一体化されているという点がある。
何かを描画すると、その描画がすでに画面に書かれている他の図形やテキスト、キャラクタと重なっているかの結果が返値として得られる。その値を確認するだけで、線や弧などの複雑な図形であっても衝突を判定でき、固有の当たり判定処理を必要としない。
また、ゲームをジューシーにするための次の機能も備えている。
- 鳴らしたい音名を選択するだけで再生できる効果音 4
- オプション 5 で
isPlayingBgm
をtrue
にするだけで自動生成される BGM isReplayEnabled
をtrue
にするだけで有効になるリプレイ機能theme
を設定するだけでレトロな CRT 風やドット絵風などに見た目を変化させる機能characters
配列で簡単に定義できるドット絵
より効率的にゲームを作りたいならば、適切に機能を削ぎ落とした、自分に合った形の自作ゲームライブラリを作ることが楽しい。自分のゲーム開発スタイルに沿ったライブラリには、どのような機能が備わっていると嬉しいかを考えて、自分だけのオリジナルライブラリを作ってみよう。
1. How to make your own game engine (and why) ↩
2. crisp-game-lib ↩
3. pinclimb main.js ↩
4. crisp-game-lib sound demo ↩
5. crisp-game-lib / Options ↩