
2026/02/27 4:09
RCade:コミュニティアーケードキャビネットを作る
RSS: https://news.ycombinator.com/rss
要約▶
Japanese Translation:
RCade は、Recurse Center コミュニティが作成したカスタムアーケードキャビネットで、GitHub リポジトリを 320 × 240 CRT 上で実際にプレイ可能なゲームへ変換します。キャビネットのハードウェアは、オリジナルの80年代型 CRT(Facebook Marketplace/Craigslist から取得)と、元々 Raspberry‑Pi vga666 アダプタを使用していた JAMMA ベースの映像経路で構成されており、その後 STM32H750 に電源供給されたカスタム 24‑bit USB ディスプレイアダプタに置き換えられました。入力コントローラは RP2040 をベースとし、各プレイヤーにジョイスティック2つ、ボタン2つ、およびロータリーエンコーダ1つを標準 USB HID ゲームパッドとして提供します。
キャビネットの外観はチョークボード用ビニールで覆われており、RCade ロゴを表示する 2 枚の HUB75 RGB LED マトリクスからなるマルキーが付いています。
ソフトウェア面では、開発者は
(JavaScript/TypeScript/p5.js/Rust‑WASM テンプレート)を使用して新しいゲームの雛形を作成します。各ゲームは GitHub にコードをプッシュすることでキャビネットにデプロイされ、ワークフロー(npm create rcade@latest)は OIDC トークンを用いてパスワードレス認証を行い、起動時にキャビネットの Electron アプリ(SvelteKit UI、Node HID ライブラリ)がビルドをダウンロードするようトリガーします。rcade/action-deployゲームは厳格な CSP ルール(canvas/WebGL、Web Audio、Workers、requestAnimationFrame)によって管理されるサンドボックス化された iframe 内で実行されます。入力はプラグインシステム(
)を介して処理され、特権コンテキストで動作し@rcade/plugin-input-classicを通じてゲーム iframe と通信します。postMessageこのプロジェクトでは 44 件以上のコミュニティ制作ゲームがホストされています。rcade.dev のウェブプレイヤーはサンドボックス環境をミラーリングし、キーボード入力をアーケードコントロールにマッピングします。一方で
というシミュレータを使えばリモートの Recursers がゲームをローカルでテストできます。npx rcade@latest playRecurse Center の滞在中に構築され、以前の作業(24‑bit USB ディスプレイアダプタ、JAMMA 配線)を基盤とした RCade は、GitHub から物理ハードウェアへ数分で迅速にデプロイできることを示しており、コミュニティの協力がレトロスタイルゲームジャムを加速させる方法を実証しています。
本文
RCade – リカーズセンターで共同構築されたアーケードキャビネット
物語
RCade はリカーズセンタ―のコミュニティが作成したゲームを動かす、オーダーメイドのアーケードキャビネットです。
- ハードウェア:320 × 240 CRT、独自グラフィックカード、コントローラーパネルにスピナーとジョイスティック、USBディスプレイアダプタ、LEDメルカリー。
- ソフトウェア:GitHub Actions OIDC トークンで駆動する Web‑ベースのデプロイパイプライン、ゲーム実行用サンドボックス iframe、ゲームコードにアーケードコントロールを公開するプラグインシステム。
- ゲーム:44 本以上のタイトルが GitHub リポジトリから数分で直接配信されています。
1. ハードウェア
1.1 CRT からアーケードモニタへ
| ステップ | 説明 |
|---|---|
| CRT の発見 | Facebook Marketplace と Craigslist で古いキャビネットを調達。内部に残ったのはチューブだけでした。 |
| 信号互換性 | 従来のアーケードモニタは約15.7 kHz の水平同期(≈262 行/フレーム)で動作しますが、VGA は 31.5 kHz。標準 VGA ケーブルでは駆動できません。 |
| ピン配置 & JAMMA | オシロスコープで RGB、HSYNC、VSYNC、およびグランドをチューブのネックボードからトレースし、JAMMA エッジコネクタ(56 ピン)へ接続してゲームを簡単に交換できるようにしました。 |
CRT への初回ビデオ出力:ピクセルが揺れ混乱しますが、確かにピクセルは映ります。
1.2 VGA666 アダプタ
| コンポーネント | 詳細 |
|---|---|
| デバイス | Raspberry Pi とオープンソースの vga666 アダプタ(GPIO ベースのアナログ VGA)。 |
| 設定 | + に を追加。 |
| タイミング | 5.7 MHz のピクセルクロック、320 × 240 解像度、アクティブロー同期 – アーケード要件に合致。 |
| 制限 | 18‑bit カラー(チャンネル毎 6 ビット) → バンディングが目立ちます。 |
1.3 ステファンのカスタムディスプレイアダプタ
- STM32H750 MCU と高精度 DAC を用いた USB ディスプレイアダプタを構築。
- vga666 のバンディングなしで 24‑bit カラー、60 fps を実現。
1.4 カスタム入力コントローラ
| プレイヤー | コントロール |
|---|---|
| ジョイスティック | 8 通方向デジタルスイッチ(上/下/左/右)。 |
| ボタン | アクションボタン 2 個。 |
| スピナー | 回転エンコーダ (A/B 信号) により速度/向きを取得。 |
- ファームウェアは入力をデバウンスし、1 kHz で四角形信号を読み取り、USB HID ゲームパッドとしてホストへ送信。
1.5 メルカリー
- 元のアーケードメルカリの代わりに 2 枚の HUB75 RGB LED マトリクスを設置。
- チャコブックビニール外装で Recursers が随時描画・変更できるように。
2. ソフトウェア
2.1 スキャフォールド & デプロイ
npm create rcade@latest
CLI は以下を生成します:
| ファイル | 用途 |
|---|---|
| ゲームメタデータ(名前、可視性、依存関係)。 |
| GitHub Actions でビルド&デプロイするワークフロー。 |
ワークフローのハイライト
permissions: id-token: write # OIDC トークン生成を許可
2.2 GitHub OIDC による認証
- ワークフローが GitHub から署名済み JWT を取得(claims は repo、branch、owner)。
- RCade API が署名を検証し、GitHub ユーザー名が RC プロフィールに紐づいているか確認。
- 有効ならゲームをデプロイ – シークレットは保存されません。
2.3 サンドボックス & セキュリティ
- ゲームは厳格な CSP ヘッダー付きのサンドボックス
内で実行。<iframe> - ブロック:外部
、ローカルストレージ、WebSocket、直接入力 API、親フレームアクセス。fetch - 許可:Canvas/WebGL、Web Audio、Web Workers、
。requestAnimationFrame
2.4 プラグインシステム
import { PLAYER_1, SYSTEM } from "@rcade/plugin-input-classic"; function gameLoop() { if (PLAYER_1.DPAD.up) moveUp(); // … requestAnimationFrame(gameLoop); }
- プラグインは特権コンテキストでロードされる信頼モジュール。
を介してサンドボックス内のゲーム iframe にアーケード入力を公開。postMessage
で宣言されたプラグインのみ利用可能。rcade.manifest.json
2.5 キャビネットスタック
| レイヤ | 技術 |
|---|---|
| ランタイム | Electron (Chromium + Node.js) |
| UI | SvelteKit |
| 入力 | Node HID ライブラリ(USB コントローラ) |
| サービス | systemd 自動起動 & クラッシュ再起動 |
キャビネットは新しいゲームがデプロイされると Webhook を受け取り、ビルドをダウンロードしローカルライブラリへ追加します。
2.6 ウェブプレイヤー & エミュレータ
が同じサンドボックス環境でゲームをホスト。rcade.dev- ローカルエミュレータ:
.npx rcade@latest play - キーボード → アーケードコントロールマッピング(矢印キー=ジョイスティック、Z/X=ボタン)。
3. コミュニティへの影響
- ゲーム:Recursers が作った 44 本以上のタイトル。多くはハードウェアとオンライン両方でプレイ可能。
- ゲームジャム:ゼロからプレイ可能までを数分で実現するデプロイパイプライン。
- 注目タイトル:
- NIBBLES.BAS – サブピクセルグラフィック、スピナー統合。
- SIGGY SKETCH – Etch A Sketch の忠実なクローン。
- BAD ORCHESTRA – スピナーで制御する音高シフト。
4. 貢献者
| 名前 | 役割 |
|---|---|
| Rose Hall | プラグインシステム & キャビネットソフトウェア |
| Stephen D | カスタム USB ディスプレイアダプタ(ハード/ファーム) |
| Joseph Abrahamson, Jack Heard, Joel Holmberg | CRT 配線、JAMMA コネクタ、オシロスコープ作業 |
| Iris E Fernandez Valdes, Anjana Vakil | 入力コントローラファームウェア |
| David Allen Feil | vga666 設定 & ビデオ出力 |
| Greg Sadetsky | インスピレーション(Rapid Riter) |
5. なぜうまくいくのか
- 自由:リカーズセンターの自己主導環境が、製品制約なしでプロジェクトを育てることを可能にしました。
- 協働:夜遅くまで仲間と作業することで深いコミュニティ絆が生まれました。
- アクセス性:GitHub Actions で数分でゲームを出荷でき、複雑な設定は不要です。
6. 参加方法
- ソースコード:https://github.com/fcjr/RCade
- ローカルプレイ:
npx rcade@latest play - ゲーム構築:
npm create rcade@latest
リカーズ(遠隔でも対面でも)の皆さんは、RCade 用のゲームを作りコミュニティと共有してみませんか?