packages/native-engine - ネイティブエンジン
作成日: 2026-03-06 / 更新日: 2026-06-10
概要
Nintendo Switch / Android 向けの C++ ネイティブエンジン。SDL2 + OpenGL でレンダリングし、Op 命令の実行、テクスチャ/オーディオ/フォント管理、セーブ/ロード機能を備える。Web エンジン (packages/web) と同等の機能をネイティブで実装し、同じ Kaede Script(KS / KSC)が両方で動作する。スクリプト実行(KSC の VM)は packages/ksc-vm-cpp に委譲し、native-engine は Op の実行・描画・入力・音声・ストレージなどのホスト機能を担当する。
ディレクトリ構成
packages/native-engine/
├── src/
│ ├── main.cpp # エントリポイント (846行)
│ └── engine/ # エンジンモジュール
│ ├── SDL2Engine.hpp/cpp # SDL2 レンダリングループ (673行)
│ ├── OpRunner.hpp/cpp # Op 命令の実行
│ ├── Op.hpp # Op 型定義
│ ├── GameHost ほか HostBinding 群 # KSC VM ↔ エンジンのブリッジ
│ ├── TextureManager.hpp/cpp # テクスチャ読込・キャッシュ
│ ├── AudioManager.hpp/cpp # BGM/SE/Voice 再生
│ ├── FontManager.hpp/cpp # テキスト描画
│ ├── FileStorage.hpp/cpp # セーブ/ロード
│ ├── HistoryManager.hpp/cpp # 選択履歴
│ ├── AssetProvider.hpp/cpp # アセットレジストリ
│ ├── IStorage.hpp # ストレージ抽象化
│ ├── FilterShaders.hpp # GLSL フィルターシェーダー
│ └── UniqueSDL.hpp # SDL RAII ラッパー
├── tests/ # C++ ユニットテスト (23ファイル, 約6,470行)
│ ├── GameHostTest.cpp # GameHost 検証
│ ├── OpRunnerTest.cpp # Op 実行テスト
│ ├── BillingHostBindingTest.cpp # 課金ブリッジテスト
│ ├── CameraHostBindingTest.cpp # カメラブリッジテスト
│ ├── EntityHostBindingTest.cpp # エンティティブリッジテスト
│ ├── AssetProviderTest.cpp # アセットレジストリテスト
│ └── ScreenshotTest.cpp # スクリーンショットキャプチャ
├── external/
│ ├── SDL2-2.30.12/ # SDL2 本体ソース
│ ├── SDL2_image-2.8.4/ # SDL_image ソース
│ ├── SDL2_mixer-2.8.1/ # SDL_mixer ソース
│ ├── SDL2_ttf-2.22.0/ # SDL_ttf ソース
│ └── nlohmann/json.hpp # JSON パーシング
├── android/ # Android NDK サポート
│ ├── app/build.gradle
│ └── settings.gradle
├── build/ # ビルド成果物
├── CMakeLists.txt # CMake ビルド設定 (386行)
└── test-cli.sh # CLI テストヘルパー / テストランナー
主要ファイル
| ファイル | 行数 | 役割 |
|---|---|---|
| main.cpp | 846 | エンジン初期化、イベントループ、入力ハンドリング |
| SDL2Engine.cpp | 673 | SDL2 ウィンドウ作成、レンダリングループ、フレームレート制御 |
| OpRunner.cpp | — | Op 命令の dispatch・実行 |
| CMakeLists.txt | 386 | ビルド設定(SDL2, SDL_image, SDL_mixer, SDL_ttf リンク) |
アーキテクチャ
[main.cpp] → イベントループ
↓
[SDL2Engine]
├── [TextureManager] → 背景/キャラクタースプライト描画
├── [FontManager] → テキスト描画
├── [AudioManager] → BGM/SE/Voice 再生
├── [FilterShaders] → GLSL フィルター
└── [OpRunner] → Op 命令の実行
├── [ksc-vm-cpp] → KSC スクリプトの VM 実行(別パッケージ)
├── [HostBinding 群] → VM ↔ エンジン機能のブリッジ
└── [FileStorage] → JSON セーブ/ロード
スクリプト実行
native-engine 自体にスクリプトインタプリタは存在しない。KSC スクリプトのコンパイル・VM 実行は packages/ksc-vm-cpp に委譲する。native-engine は VM が発行した Op 命令を OpRunner で受け、各 HostBinding(Camera / Entity / Billing 等)を通じてエンジン機能に接続する。Web エンジンと同じ IR を実行するため、同一の KSC スクリプトが両プラットフォームで動作する。
エンジンモジュール
| コンポーネント | 役割 |
|---|---|
| SDL2Engine | ウィンドウ管理、レンダリングループ |
| TextureManager | 画像読込、キャッシュ (LRU) |
| AudioManager | SDL_mixer で BGM/SE/Voice 再生 |
| FontManager | SDL_ttf でテキストレンダリング |
| FileStorage | JSON 形式でセーブ/ロード |
| HistoryManager | 選択肢の履歴管理 |
| AssetProvider | アセット ID → ファイルパス解決 |
| FilterShaders | GLSL フィルターシェーダーのコンパイル・適用 |
| UniqueSDL | SDL リソースの RAII ラッパー |
Web エンジンとの対応
| 機能 | Web (packages/web) | Native (native-engine) |
|---|---|---|
| レンダリング | PixiJS (WebGL) | SDL2 + OpenGL |
| テクスチャ | PIXI.Texture | SDL_Texture / SDL_image |
| オーディオ | Web Audio API | SDL_mixer |
| フォント | PIXI.Text | SDL_ttf |
| セーブ | IndexedDB | ファイルシステム (JSON) |
| 入力 | ポインター/キーボード | SDL_Event |
| スクリプト | KscRunner + VM (TS) | ksc-vm-cpp + OpRunner (C++) |
ビルド
# SDL2 ソースダウンロード(external/SDL2-* に取得。ビルドは CMake が担当)
bash scripts/build/download-sdl2-sources.sh
# ネイティブエンジンビルド
mkdir -p build && cd build
cmake .. && make
# テスト実行
./test-cli.sh
CMake 依存
- SDL2, SDL2_image, SDL2_mixer, SDL2_ttf
- OpenGL / OpenGL ES
- nlohmann/json (ヘッダーオンリー)
Android サポート
android/ディレクトリに Gradle ビルド設定- Android NDK 経由で SDL2 をビルド
- JNI で Java ↔ C++ ブリッジ
SDL2 ソース
SDL2 とその衛星ライブラリのソースは packages/native-engine/external/SDL2-*(SDL2-2.30.12, SDL2_image-2.8.4, SDL2_mixer-2.8.1, SDL2_ttf-2.22.0)に配置される。packages/sdl というパッケージは存在しない。取得は bash scripts/build/download-sdl2-sources.sh、ビルドは CMake が担当する。
テスト
| テスト | 内容 |
|---|---|
| GameHostTest.cpp | GameHost(ゲームホスト)検証 |
| OpRunnerTest.cpp | Op 命令の実行テスト |
| BillingHostBindingTest.cpp | 課金ブリッジテスト |
| CameraHostBindingTest.cpp | カメラブリッジテスト |
| EntityHostBindingTest.cpp | エンティティブリッジテスト |
| TweenHostBindingTest.cpp | Tween ブリッジテスト |
| MomijiTest.cpp / UiSnapshotTest.cpp | UI(MomijiUI)レンダリング/スナップショット |
| AssetProviderTest.cpp | アセットレジストリテスト |
| ScreenshotTest.cpp | スクリーンショットキャプチャ |
合計: 23 テストファイル, 約 6,470 行