マルチプラットフォーム — SDL2 で広がる世界
作成日: 2026-03-06 / 更新日: 2026-06-10
kaedevn で作った作品は、Web ブラウザだけでなく、Android、PC、そして将来的には Nintendo Switch でもプレイできるようになります。これを支えるのが、プラットフォームごとに差し替え可能な「抽象レイヤー」の設計と、C++ で書かれたネイティブエンジンです。
1つの作品が、どこでも動く理由
kaedevn のエンジンは4つの抽象インターフェースを定義しています。
- IInput — すべての入力を統一的に受け取る。Web: PixiJS ポインタ / キーボード / ネイティブ: SDL_Event(Joy-Con / タッチ / キーボード)
- IAudio — BGM / SE / VOICE の再生制御。Web: Web Audio API / ネイティブ: SDL_mixer
- IStorage — セーブ / ロードの抽象化。Web: IndexedDB / ネイティブ: ファイルシステム(JSON)
- IOpHandler — Op 命令の実行。Web: WebOpHandler (PixiJS) / ネイティブ: SDL2Engine + GLRenderer (OpenGL)
スクリプトエンジン(VM)はこれらのインターフェースだけを使って動作します。「画面にキャラクターを表示する」「BGM を再生する」といった処理は、プラットフォームごとの実装に委譲されます。
Web: PixiJS エンジン(完全対応)
現在のメイン環境です。PixiJS(WebGL)による高速な 2D 描画で、4層のレイヤー構造を持ちます。
Layer 3: UI(テキストウィンドウ、選択肢、メニュー)
Layer 2: Overlay(エフェクト画像)
Layer 1: Character(立ち絵 L/C/R)
Layer 0: Background(背景画像)
搭載機能:
- GPU アクセラレーション(WebGL)による滑らかな描画
- テキストの1文字ずつ表示(タイプライター効果)
- フェード、画面揺れ、ズーム、パンなどのカメラ制御
- 45 種の画面フィルター(時間帯・天候・パーティクル・季節感・雰囲気・色調・特殊効果・レトロの 8 カテゴリ)
- レスポンシブ対応(PC / スマートフォン両対応)
ゲームシステム:
- セーブ / ロード(IndexedDB、複数スロット)
- バックログ(テキスト履歴の閲覧)
- 設定画面(テキスト速度、音量、フルスクリーン)
- ギャラリー(CG / シーン回想)
- インベントリ(アイテム管理)
- デバッグ画面(変数ウォッチ、ブレークポイント)
ネイティブエンジン: SDL2 + C++(実機動作確認済み)
SDL2(Simple DirectMedia Layer)を使った C++ ネイティブエンジンが実装されています。スクリプトはプラットフォーム非依存の VM(KscVM)で実行し、描画は OpenGL(GLRenderer)が担います。
エンジンの構成
Event Loop → SDL2Engine(ウィンドウ / 入力 / 音声)
├── GLRenderer ──────── OpenGL 3.3 / GLES3 描画 + GLSL フィルター
├── TextureManager ──── 画像ロード + LRU キャッシュ
├── FontManager ─────── SDL_ttf テキストレンダリング
├── AudioManager ────── SDL_mixer BGM/SE/Voice
├── FileStorage ─────── JSON セーブ/ロード
├── AssetProvider ───── アセットID→ファイルパス変換
└── KscVM (C++) ─────── スクリプト実行(コンパイル済み IR を実行)
旧
packages/interpreter(Tokenizer / Parser / Evaluator の逐次解釈型)は 2026-04-29 に deprecated。現在は KscVM(IR 実行)+ OpRunner に置き換わっている。
Web ↔ ネイティブの機能対応表
- 描画 — Web: PixiJS (WebGL) / ネイティブ: SDL2 + OpenGL
- テクスチャ — Web: PIXI.Texture / ネイティブ: SDL_Texture + LRU キャッシュ
- 音声 — Web: Web Audio API / ネイティブ: SDL_mixer
- フォント — Web: PIXI.Text / ネイティブ: SDL_ttf
- ストレージ — Web: IndexedDB / ネイティブ: ファイルシステム (JSON)
- 入力 — Web: Pointer / Keyboard events / ネイティブ: SDL_Event
- スクリプト — Web: KscRunner + VM (TypeScript) / ネイティブ: KscVM (C++)
- シェーダー — Web: PixiJS Filter / ネイティブ: GLSL 直接コンパイル
対応プラットフォーム
- Web(ブラウザ) — 完全対応。技術: PixiJS / WebGL
- Android — ビルド成功・実機動作確認済み。技術: SDL2 + NDK + JNI
- macOS — ビルド成功・動作確認済み。技術: SDL2 + CMake
- Windows — ビルド成功・動作確認済み。技術: SDL2 + MSVC/Ninja + OpenGL
- iOS — シミュレータ動作確認済み。技術: SDL2 + CMake/Xcode
- Nintendo Switch — 準備中。抽象境界のみ整備済み(SDK が NDA のため公開ビルドは不可)
Android 版は JNI ブリッジ(Java ↔ C++)を介して SDL2 エンジンを呼び出します。Gradle ビルド設定済みです。
入力の統一: Action マップ
すべてのプラットフォームで、入力は「Action」という共通の単位に変換されます。Web では優先度ベースの入力システム(GAME / UI / MODAL の3レベル)で、モーダルが開いているときにゲーム入力が誤発火しない設計です。
- OK — テキスト送り、決定。Web: クリック / Enter / Switch: A ボタン
- Back — キャンセル、戻る。Web: Escape / Switch: B ボタン
- Menu — メニュー表示。Web: M キー / Switch: + ボタン
- SkipToggle — スキップ切替。Web: S キー / Switch: ZR
- AutoToggle — オート切替。Web: A キー / Switch: ZL
- Log — バックログ。Web: L キー / Switch: - ボタン
- QuickSave — クイックセーブ。Web: F5 / Switch: L
- QuickLoad — クイックロード。Web: F9 / Switch: R
- Screenshot — スクリーンショット。Web: P キー / Switch: 撮影ボタン
- HideWindow — UI非表示。Web: H キー / Switch: X ボタン
作者はプラットフォームごとのボタン配置を意識する必要はありません。「OK が押されたらテキストを進める」というロジックだけを書けば、Web でも Switch でも正しく動作します。
解像度とセーフエリア
kaedevn は論理解像度 1280x720 を基準に設計されています。
- TV出力(Switch): セーフエリア5%(64px 水平 / 36px 垂直)を確保し、画面端が切れても重要な UI が隠れない
- スマートフォン: アスペクト比を維持しつつスケーリング
- PC ブラウザ: ウィンドウサイズに追従
UI の配置はアンカーベースの相対座標で定義されるため、ハードコードされたピクセル値に依存しません。
作者にとってのメリット
- 一度作れば全プラットフォーム: スクリプトもアセットも共通
- 移植作業は不要: エンジン側が各プラットフォームに対応
- 品質が保証される: C++ ユニットテストと TypeScript テストで動作を検証
- 将来性: 新しいプラットフォームが追加されても、作品はそのまま動く
関連ドキュメント
- エンジンの仕組み — スクリプトエンジンの設計
- アセットのポータビリティ — アセット共通仕様
- よくある質問 — プラットフォーム対応状況