5 ポイント 投稿者 GN⁺ 2024-08-05 | 1件のコメント | WhatsAppで共有

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件のコメント

 
GN⁺ 2024-08-05
Hacker Newsのコメント
  • 多くのWebゲームはImpactゲームエンジンで作られており、Cross Code、Eliot Quest、XType Plusのような商用クロスプラットフォームタイトルの基盤になっていた

    • Cross Codeは素晴らしいゲームで、Web技術を使っている点が印象的だった
    • このエンジンはNintendo Switchハードウェア上で高い性能を発揮することにも貢献していたのではないかと思う
  • "Thoughts on Flash"はWebプラットフォームを救った可能性がある

    • AdobeがMacOSプラットフォーム対応を放棄したことへの苛立ちがあったのだろう
    • Mac版は常にWindows版より遅れていた
    • Jobsは、AdobeはAppleなしでは存在し得なかったと考えていたのかもしれない
  • ゲームがとても洗練されて見える

  • high_impactは"ライブラリ"ではなく"フレームワーク"だ

    • ビジネスロジックはフレームワーク内に書かなければならない
    • フレームワークは、他のものとうまく組み合わせられない"ライブラリ"だと否定的に表現されがちだった
    • 前向きな表現を聞けてうれしい
  • 久しぶりにHNアカウントにログインして、Biolab Disasterをまた見つけられてうれしい

  • UNIONを使って多相的なエンティティデータ構造を作ったのが印象的だった

    • 今でもC言語が好きで、最初に学んだ言語だった
    • Cは簡潔な言語だが、深く掘り下げられる
    • ゲームはCommander Keenのような雰囲気があり、あのフランチャイズが好きだった
  • QOI可逆ファイル形式と7Zipを組み合わせると、可逆PNGより性能が高い

  • プレイヤーのバッテリー寿命を尊重するためかもしれない

  • 面白いアイデア、学習価値を最大化するオープンソース、完璧な実行、気取りのない明快な文章――素晴らしい貢献だ

    • こういうものを見られるだけでも特権だと感じる
  • 3000人のライセンス保有者の一人として、Impactの復活をうれしく思う

    • Zigと相性が良いのか気になる
  • 素晴らしいゲームエンジンに見える

    • なぜ記事で寿命がほぼ尽きたと書かれているのか気になる
    • より優れた新しいエンジンがあるのだろうか