← ソースコード説明書

packages/native-engine, packages/sdl - ネイティブエンジン

概要

Nintendo Switch / Android 向けの C++ ネイティブエンジン。SDL2 + OpenGL でレンダリングし、KS スクリプトの実行、テクスチャ/オーディオ/フォント管理、セーブ/ロード機能を備える。Web エンジン (packages/web) と同等の機能をネイティブで実装し、同じ Kaede Script(KS / KSC)が両方で動作する。

ディレクトリ構成

packages/native-engine/
├── src/
│   ├── main.cpp                    # エントリポイント (203行)
│   ├── interpreter/                # スクリプトインタプリタ
│   │   ├── Tokenizer.hpp/cpp      # 字句解析 (91行)
│   │   ├── Parser.hpp/cpp         # AST 構築 (136行)
│   │   ├── Interpreter.hpp/cpp    # スクリプト実行 (85行)
│   │   ├── Evaluator.hpp/cpp      # 式評価 (85行)
│   │   └── GameState.hpp/cpp      # ゲーム状態 (73行)
│   └── engine/                     # エンジンモジュール
│       ├── SDL2Engine.hpp/cpp     # SDL2 レンダリングループ (157行)
│       ├── TextureManager.hpp/cpp # テクスチャ読込・キャッシュ (55行)
│       ├── AudioManager.hpp/cpp   # BGM/SE/Voice 再生 (61行)
│       ├── FontManager.hpp/cpp    # テキスト描画 (52行)
│       ├── FileStorage.hpp/cpp    # セーブ/ロード (40行)
│       ├── HistoryManager.hpp/cpp # 選択履歴 (60行)
│       ├── AssetProvider.hpp/cpp  # アセットレジストリ (41行)
│       ├── IEngineAPI.hpp         # エンジンインターフェース (32行)
│       ├── IStorage.hpp           # ストレージ抽象化 (15行)
│       ├── Shader.hpp/cpp         # GLSL シェーダー管理 (55行)
│       └── UniqueSDL.hpp          # SDL RAII ラッパー (31行)
├── tests/                          # C++ ユニットテスト (6ファイル, 281行)
│   ├── InterpreterTest.cpp
│   ├── ParserTest.cpp             # AST 構築検証
│   ├── EvaluatorTest.cpp          # 式評価テスト
│   ├── GameStateTest.cpp          # 状態管理テスト
│   ├── AssetProviderTest.cpp      # アセットレジストリテスト
│   └── ScreenshotTest.cpp        # スクリーンショットキャプチャ
├── external/
│   └── nlohmann/json.hpp          # JSON パーシング
├── android/                       # Android NDK サポート
│   ├── app/build.gradle
│   └── settings.gradle
├── build/                         # ビルド成果物
├── CMakeLists.txt                 # CMake ビルド設定 (2,404行)
├── run-auto-test.sh               # 自動テストランナー
├── test-cli.sh                    # CLI テストヘルパー
└── minimal_sdl3.cpp               # 最小 SDL3 デモ

主要ファイル

ファイル行数役割
main.cpp203エンジン初期化、イベントループ、入力ハンドリング
SDL2Engine.cpp157SDL2 ウィンドウ作成、レンダリングループ、フレームレート制御
Interpreter.cpp85KS スクリプト実行 VM
Parser.cpp136スクリプト → AST 変換
CMakeLists.txt2,404ビルド設定(SDL2, SDL_image, SDL_mixer, SDL_ttf リンク)

アーキテクチャ

[main.cpp] → イベントループ
    ↓
[SDL2Engine]
    ├── [TextureManager] → 背景/キャラクタースプライト描画
    ├── [FontManager] → テキスト描画
    ├── [AudioManager] → BGM/SE/Voice 再生
    ├── [Shader] → GLSL フィルター
    └── [Interpreter]
        ├── [Tokenizer] → [Parser] → AST
        ├── [Evaluator] → 式評価
        └── [GameState] → 変数, フラグ, 位置
            └── [FileStorage] → JSON セーブ/ロード

インタプリタモジュール

コンポーネント役割
TokenizerKS スクリプトの字句解析
Parserトークン → AST ノード構築
InterpreterAST 実行、エンジン API 呼び出し
Evaluator式評価(変数参照、算術、比較)
GameState変数、既読フラグ、実行位置の管理

エンジンモジュール

コンポーネント役割
SDL2Engineウィンドウ管理、レンダリングループ
TextureManager画像読込、キャッシュ (LRU)
AudioManagerSDL_mixer で BGM/SE/Voice 再生
FontManagerSDL_ttf でテキストレンダリング
FileStorageJSON 形式でセーブ/ロード
HistoryManager選択肢の履歴管理
AssetProviderアセット ID → ファイルパス解決
ShaderGLSL シェーダーのコンパイル・適用
UniqueSDLSDL リソースの RAII ラッパー

Web エンジンとの対応

機能Web (packages/web)Native (native-engine)
レンダリングPixiJS (WebGL)SDL2 + OpenGL
テクスチャPIXI.TextureSDL_Texture / SDL_image
オーディオWeb Audio APISDL_mixer
フォントPIXI.TextSDL_ttf
セーブIndexedDBファイルシステム (JSON)
入力ポインター/キーボードSDL_Event
スクリプトKscRunner + VMInterpreter (C++)

ビルド

# SDL2 ソースダウンロード
./scripts/download-sdl2-sources.sh

# SDL2 ビルド
./scripts/build-sdl.sh

# ネイティブエンジンビルド
mkdir -p build && cd build
cmake .. && make

# テスト実行
./run-auto-test.sh

CMake 依存

  • SDL2, SDL2_image, SDL2_mixer, SDL2_ttf
  • OpenGL / OpenGL ES
  • nlohmann/json (ヘッダーオンリー)

Android サポート

  • android/ ディレクトリに Gradle ビルド設定
  • Android NDK 経由で SDL2 をビルド
  • JNI で Java ↔ C++ ブリッジ

packages/sdl

SDL2 ライブラリのソースコード / ビルド成果物を格納するサブモジュール。scripts/build-sdl.sh でビルドされる。

テスト

テスト行数内容
InterpreterTest.cppスクリプト実行テスト
ParserTest.cpp50AST 構築検証
EvaluatorTest.cpp34式評価テスト
GameStateTest.cpp42状態管理テスト
AssetProviderTest.cpp32アセットレジストリテスト
ScreenshotTest.cpp44スクリーンショットキャプチャ

合計: 6 テストファイル, 281 行

Ad: stickyBottom (728x90)
kaedevn - ノベルゲームを作れるプラットフォーム