← ドキュメント一覧

マルチプラットフォーム — 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 の配置はアンカーベースの相対座標で定義されるため、ハードコードされたピクセル値に依存しません。

作者にとってのメリット

  1. 一度作れば全プラットフォーム: スクリプトもアセットも共通
  2. 移植作業は不要: エンジン側が各プラットフォームに対応
  3. 品質が保証される: C++ ユニットテストと TypeScript テストで動作を検証
  4. 将来性: 新しいプラットフォームが追加されても、作品はそのまま動く

関連ドキュメント

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