
2026/02/01 3:27
**Nintendo DS コードエディタ & スクリプト可能なゲームエンジン** - **目的**: Nintendo DS 上で直接開発・編集・実行できるゲームを作成します。 - **主な機能**: - 対応言語の構文強調表示付き統合コードエディタ - リアルタイムスクリプト実行とデバッグツール - グラフィック・オーディオ・入力処理を管理するアセット管理システム - DS ハードウェアおよびデスクトップシミュレータへのクロスプラットフォームビルドサポート
RSS: https://news.ycombinator.com/rss
要約▶
日本語訳:
この記事では、Nintendo DS 用に作られたコンパクトでスクリプト可能な3‑Dゲームエンジンを紹介しています。ソースはプレーンCで libnds を使用し、devkitPro でコンパイルされると約100 KBの ROM が生成され、60 FPSで動作します。コード全体は約3,100行で、動的メモリ割り当てを一切使用せず、
コマンドだけでビルドできます。make
エンジン内部には下画面にタッチ操作で利用できるコードエディタがあり、上画面ではリアルタイムレンダリングが行われます。デフォルトのポングデモはモデル作成、カメラ制御、入力処理、サウンド再生を示しています。スクリプト言語は A–Z の26個の書き込み可能レジスタ(A〜Z)、算術演算(、SETなど)、制御フロー文(ADD、LOOP/END_LOOP)およびオブジェクトコマンド(IF_*、MODEL、POSITION、ANGLE)をサポートしています。スクリプトは最大128行に制限され、16色のキューブまで描画でき、入力/状態レジスタ(LEFT, UP, RGT, DN, KA, KB, TIME, LOOKX, LOOKZ)を公開します。NEXT_COLOR
このプロジェクトは Reddit にホストされており、専用ディスカッショントピックがあります。本番ハードウェアで実行するには、ROM を microSD カードにコピーしフラッシュカード(R4、DSTT、Acekard)へ挿入するか、Desmond Nintendo DS エミュレータでテストできます。ダウンロード可能なソースコード () と ROM (ds‑game‑engine.zip) が提供されています。このエンジンは、DS ゲームプログラミングを学びたい開発者や趣味人、またレガシーハンドヘルドハードウェアで新しいインディー作品を始めたいと考えている方にとって、手軽な入り口となります。ds-game‑engine.nds
本文
TL;DR
Nintendo DS向けに、コンソール上で直接ゲームを書いて実行できるスクリプタブル3Dゲームエンジンを作成しました。C言語とlibndsを用い、約100 KBの.nds ROMとしてビルドされ、60 FPSで動作します。下画面にタッチベースのコードエディタ、上画面にはリアルタイム3Dレンダリングが搭載されており、デフォルトスクリプトとして動く3Dパズルゲームも付属しています。
それは何ですか?
昔、TI‑82グラフ計算機で最初のゲームを作ったときの懐かしさを思い出しました。その体験をNintendo DSに持ち込みたくて、手のひらサイズの完全なプログラミング環境――スクリプタブルゲームエンジン――を実装しました。
独自言語で変数・ループ・条件分岐が使えます。下画面のタッチスクリーンにコードを書き、再生ボタンを押すと、上画面でリアルタイムに3Dレンダリングされながらゲームが実行されます。
仕組み
エンジンは大まかに3つの部分から構成されています。
- 上画面 – 3D描画(ハードウェアアクセラレーション)
- DSの3Dハードウェアを利用し、60 FPSでカラフルなキューブを描画します。
- 各モデルは位置(X,Y,Z)、回転角度、色を持ちます。
- カメラは位置とヨー/ピッチ角度で完全に制御可能です。
// DS 3D描画コード (C + libnds) glMatrixMode(GL_MODELVIEW); glLoadIdentity(); gluLookAt(camX, camY, camZ, camX + lookX, camY + lookY, camZ + lookZ, 0, 1, 0); // 上ベクトル
// モデルごとの描画呼び出し (main.c) for (i = 0; i < MAX_MODELS; i++) { if (!modelActive[i]) continue; glPushMatrix(); glTranslatef(modelX[i], modelY[i], modelZ[i]); glRotatef(modelAngle[i], 0, 1, 0); drawCube(CUBE_COLORS[modelColorIndex[i]]); drawWireframeCube(); glPopMatrix(1); }
// キューブジオメトリ: RGB15色 → glColor3b、6面をGL_QUADSで描く glColor3b(r * 255/31, g * 255/31, b * 255/31); glBegin(GL_QUADS); /* +Z 面 */ glVertex3f(-1.0f, 1.0f, 1.0f); glVertex3f( 1.0f, 1.0f, 1.0f); glVertex3f( 1.0f, -1.0f, 1.0f); glVertex3f(-1.0f, -1.0f, 1.0f); /* –Z, +Y, –Y, +X, –X … (合計24頂点) */ glEnd();
- 下画面 – スクリプトエディタ(ソフトウェア描画)
- タッチベースのコードエディタ。ピクセル単位で256 × 192ビットマップにUIを描きます。
- 主な機能:
- トークンピッカー:タップでコマンド(
、SET
、ADD
、LOOP
など)を挿入IF_GT - 数値入力パッド:各コマンドの数値パラメータを編集
- レジスタ選択器:使用する変数(A–Z)を決定
- 再生/一時停止/停止/ステップ制御
- 6つのスクリプトスロット:異なるプログラムを保存・読み込み
- トークンピッカー:タップでコマンド(
// 下画面へのソフトウェア描画 u16 *subBuffer = (u16*)BG_BMP_RAM_SUB(0); // 256×192フレームバッファ subBuffer[y * 256 + x] = RGB15(31, 31, 31); // 白ピクセル
- スクリプトインタープリタ
- フレームごとに1行ずつ実行(約60 ライン/秒)。
- スクリプトは26個の変数(A–Z)と、入力・システム状態用の9つの読み取り専用レジスタを使用できます。
// スクリプト実行 (簡易版) if (tokenEquals(script[scriptIP], "add")) { int r = scriptReg[scriptIP]; // 変数(A–Z)番号 registers[r] += getNumberParamValue(scriptIP, 0); scriptIP++; // 次の行へ }
スクリプト言語
スクリプトはコマンド(トークン)と数値パラメータで構成されます。
各行は即座に実行され、解析オーバーヘッドはなく、単純な
ifチェックのみです。
| カテゴリ | コマンド |
|---|---|
| 変数・算術 | |
| 制御フロー | (無限ループ) |
| 3Dオブジェクト | |
| カメラ・描画 | |
| 読み取り専用レジスタ(入力・状態) | , , , – D‑パッド, – A/B ボタン – 経過秒数, – カメラ前方方向 |
例:3Dポン(デフォルトスクリプト)
MODEL 0 ; ボール作成 MODEL 1 ; パドル作成 CAM_POS 0 8 18 ; カメラ位置設定 SET A 0 ; ボールX座標 SET B 1 ; ボール速度 SET C 0 ; パドルZ座標 LOOP ADD A B ; ボール移動 IF_GT A 10 ; 右壁に衝突? MULTIPLY B -1 ; 方向反転 END_IF IF_TRUE Up ; 上ボタン押下? ADD C -0.5 ; パドル上へ移動 END_IF POSITION 0 A 0 0 ; ボール位置更新 POSITION 1 -13 0 C ; パドル位置更新 SLEEP 0.016 ; ~60 FPS END_LOOP
完全なスクリプトには衝突判定、ゲームオーバー処理、ミス時のビープ音などが含まれ、すべて単純なレジスタ演算と条件分岐で実装されています。
技術的詳細
| 項目 | 値 |
|---|---|
| 言語 | C |
| ライブラリ | libnds (Nintendo DS開発ライブラリ) |
| ツールチェーン | devkitPro (ARMクロスコンパイラ) |
| ソースサイズ | 約3,100行のC () |
| バイナリーサイズ | 約100 KB (.nds ROM) |
| パフォーマンス | DS Lite(2006年ハードウェア)で60 FPS |
能力と制限
- スクリプト1プログラムあたり最大 128行
- 26個の変数(A–Z)+9個の読み取り専用レジスタ
- 最大 16個の3Dモデル(単純キューブ)
- 6つのスロットで異なるスクリプトを保存
- 動的メモリ確保は使用せず、すべて静的配列
- 文字列変数は不可 – 数値(浮動小数点)のみ
- 関数呼び出し・サブルーチンは未実装
ビルドと実行方法
コンパイル(PC上)
- devkitPro(devkitARMとlibndsを含む)をインストール。
- ソースコード (
+main.c
) をダウンロード。Makefile - プロジェクトディレクトリで
を実行。make
出力:
program.nds (~100 KB ROMファイル)。
実機での実行
- フラッシュカート(例:R4、DSTT、Acekard)とmicroSDカードを用意。
を microSD カードにコピー。program.nds- マイクロSDをフラッシュカートへ挿入し、DSに差し込む。
- DSを起動してフラッシュカートメニューからROMを選択。
備考: R4とmicroSDカードは数年前に友人から譲り受けたものです。フラッシュカート自体の詳細設定は省略しますが、最新のフラッシュカートならば、ルートにファームウェアを書き込み、ROMをフォルダに入れるだけでOKです。
ブラウザ上で試す(Nintendo DSエミュレータ)
以下に直接DSゲームエンジンビルドをロードできるエミュレータがあります。
ds-game-engine.nds を読み込み、動画よりもシンプルなポンが実行されます。
- Nintendo DS エミュレータ(Desmond)。ゲームが起動しない場合はJavaScriptが有効かつページのロード完了を確認してください。
- ダウンロード:
- ソース (
)ds-game-engine.zip - コンパイル済みROM (
)ds-game-engine.nds
- ソース (
ディスカッション
このRedditスレッドで質問や議論を歓迎します。