high_impact: JavaScriptゲームエンジンをCに移植する
要約
- high_impact は2Dアクションゲーム向けの小さなゲームエンジンで、Cで書かれており、Windows、Mac、Linux、およびWeb向けのWASMにコンパイル可能
- 2010年のJavaScriptゲームエンジン Impact に着想を得ており、MITライセンスで提供される
- ソースコード: GitHub
古代の歴史
- 2010年4月、Steve Jobs は公開書簡 "Thoughts on Flash" を通じて、iOSでFlashをサポートしないと発表
- Flash はWebで非常に重要なブラウザプラグインであり、多くのWebサイトがFlashゲームやアニメーションに依存していた
- Android はFlashをサポートしていたが性能は良くなく、Appleの決定はFlashの終焉を告げる合図だった
- JavaScript Canvas2D API を使って、FlashなしでもWebゲームを作れることを証明するために Biolab Disaster を開発
なぜCなのか?
- Cはシンプルでありながら奥深い言語で、ゲーム開発に適している
- JavaScript の MPEG1 デコーダをCに移植したことや、VR実装、画像および音声フォーマットの開発などを通じて、Cへの愛着を再発見
- Impact をCで書き直すのは楽しい練習になるはず
コンセプト
- high_impact は最小限のコードで実装されており、タイルマップの読み込み、ゲームオブジェクトの生成、更新および描画機能を提供
- 物理と衝突検出を処理し、簡単なスプライトシートアニメーション、テキスト描画、効果音および音楽再生機能を含む
- high_impact はライブラリではなくフレームワークであり、ユーザーがビジネスロジックを書く必要がある
- SDL または Sokol のプラットフォームバックエンドを使ってコンパイル可能
エンティティ
- すべてのエンティティは同じ
entity_t 構造体を共有し、位置、速度、サイズなどの属性を持つ
- マクロを通じて基本エンティティ構造体を拡張できる
- 各エンティティ型は、関数ポインタを提供する
entity_vtab_t を用意する必要がある
- 最大64kのアクティブエンティティを処理可能
衝突検出と応答
- タイルマップとの衝突を計算して、正確な衝突地点を見つける
- エンティティ同士の衝突は別途処理され、各エンティティが他のエンティティとどのように衝突するかを定義する
レンダリング
- OpenGL とソフトウェアレンダラーを提供
- すべてのレンダリングは単一の関数呼び出しで行われ、テクスチャアトラスを使ってテクスチャを結合する
サウンド
- SDL2 または Sokol を使ってサウンド出力を処理
- 固定数のソースを読み込み、固定数のサウンドを再生できる
- サウンドは自動的に破棄されて再利用可能
メモリ管理
- 単一のバイト配列である "hunk" を使ってメモリを管理
- bump allocator と temp allocator を使ってメモリを割り当てる
- メモリ解放を自動処理するため、ユーザーはメモリ管理を気にする必要がない
レベルエディタ
- 元の Impact レベルエディタ "Weltmeister" を含む
- JavaScript で書かれており、モダンブラウザ機能を使って更新されている
- ファイルシステム API を使ってファイルを読み込み・保存する
デモゲーム
- Biolab Disaster と Drop の2つのゲームをCに移植し、high_impact の機能を検証
拡張性
- high_impact は伝統的なゲームエンジンであり、ゲーム固有のコードは追加で記述される
- プラットフォームとレンダラーは、他のシステムをサポートするよう拡張可能
GN⁺のまとめ
- high_impact はCで書かれた2Dゲームエンジンで、シンプルながら強力な機能を提供
- JavaScript ゲームエンジン Impact の後継として、さまざまなプラットフォームで動作可能
- メモリ管理や衝突検出など、ゲーム開発に必要な中核機能をシンプルに実装
- レベルエディタとデモゲームを通じて実際の使用例を提供
- Unity や Unreal のような大型エンジンに比べて、軽量でシンプルなプロジェクトに適している
1件のコメント
Hacker Newsのコメント
多くのWebゲームはImpactゲームエンジンで作られており、Cross Code、Eliot Quest、XType Plusのような商用クロスプラットフォームタイトルの基盤になっていた
"Thoughts on Flash"はWebプラットフォームを救った可能性がある
ゲームがとても洗練されて見える
high_impactは"ライブラリ"ではなく"フレームワーク"だ
久しぶりにHNアカウントにログインして、Biolab Disasterをまた見つけられてうれしい
UNIONを使って多相的なエンティティデータ構造を作ったのが印象的だった
QOI可逆ファイル形式と7Zipを組み合わせると、可逆PNGより性能が高い
プレイヤーのバッテリー寿命を尊重するためかもしれない
面白いアイデア、学習価値を最大化するオープンソース、完璧な実行、気取りのない明快な文章――素晴らしい貢献だ
3000人のライセンス保有者の一人として、Impactの復活をうれしく思う
素晴らしいゲームエンジンに見える