ft_transcendence

ブラウザで動作するリアルタイムオンラインお絵描き当てゲーム

Web AppTypeScriptReactFastityNetworkGame

概要

42の最終課題として、4人チームで約2.5ヶ月かけて開発したリアルタイムマルチプレイヤーお絵描き当てゲーム「お絵描きアイランド」。1人が出題された単語をキャンバスに描き、他のプレイヤーがチャットで回答を当てる。フロントエンドはReact + TypeScript、バックエンドはFastify + Prisma + PostgreSQL、リアルタイム通信はWebSocketで構成し、Docker Composeで4サービスをオーケストレーションしている。597コミット、92PRの規模で開発を進めた。

ft_transcendenceft_transcendenceft_transcendenceft_transcendence

苦労・工夫した点

最も苦労したのは、クライアントの意図しない切断からの再接続処理だった。ReactのuseEffectクリーンアップとWebSocketのoncloseイベントが競合し、意図しない再接続ループが発生する問題に直面した。isMountedRefやhasJoinedRef、cancelledフラグなど複数のrefを使ってライフサイクルを管理することで解決したが、画面ごとに異なる再接続戦略が必要で、試行錯誤を重ねた。この過程で得た知見はリサーチノートとしてチーム内で共有した。 もう一つの大きな課題は、フロントエンドとバックエンドの責任分界の決定だった。Waiting画面は更新頻度が低いため「WebSocketは通知のみ、データ取得はHTTP」という方式を採用し、Game画面はミリ秒レベルの応答が必要なため「すべてWebSocketで完結」する方式を採用した。画面の特性に応じて通信アーキテクチャを使い分ける判断に至るまでに調査と議論を重ねた。 4人チームでの開発では、ft_ircで導入したCI/CDとPRテンプレートをさらに発展させ、型チェック・ビルド・フォーマットの3つのCIワークフローを整備した。2人→3人→4人とチーム規模が拡大する中で、開発プロセスも段階的に成熟させてきた。

ポイント

WebSocket通信のアーキテクチャ設計。画面の特性に応じて通信戦略を最適化している点が特徴で、Waiting画面では「WebSocketを通知のドアベルとして使い、実データはHTTPで取得する」方式、Game画面では「描画座標、チャット、タイマー、スコアのすべてをWebSocketで直接同期する」方式を採用した。バックエンド側ではconnectionHandler.tsが12種以上のメッセージタイプをルーティングし、roomManager.tsがインメモリ状態管理とブロードキャストを担当する構成になっている。ゲーム中のスコアはメモリ内Mapで高速に管理し、ラウンド終了時にPrismaトランザクションでバッチ保存する二層構造も、リアルタイム性とデータ永続性を両立させるための設計判断である。

他のプロジェクト

Urban Reflection

「JUMPSTARTER 2023 Tech by the Harbour」(香港)のアートインスタレーション

Art InstallationCommission

TOTO Technical Center Tokyo

TOTOテクニカルセンター東京のデジタルコンテンツ

Interactive SignageApp DevelopmentCommission

Recursive Orchestra

Live StageAICommission

HOTORIUM

安川メカトレック末松九機株式会社新社屋のアトリウム空間演出

Art InstallationCommission

AIR HUB TOKYO "Clean Air Vision”

パナソニック「AIR HUB TOKYO」のビジュアルサイネージ、タブレットアプリ

Interactive SignageApp DevelopmentCommission

Reflective tree

六本木ヒルズ・ウエストウォークのクリスマスインスタレーション

Art InstallationKineticCommission

sonus-oleum

Live StageArt InstallationOriginal

WOW 25th Anniversary Exhibition - Unlearning the Visuals

ビジュアルデザインスタジオWOWの設立25周年を記念した展覧会

ExhibitionArt InstallationOriginal

Yakushiji Hikari Kyoya -inori-

meme nippon project新作歌舞伎舞踊の映像演出

Live StageCommission

ft_irc

C++98で実装したIRCサーバー

C++IRCNetwork

Celvoke 2022 S/S Key visual

Celvoke 2022 S/S Makeup Collectionキービジュアル

VFXCommission

miniRT

C言語で実装したレイトレーサー

CRay TracingGraphics

Minishell

Bashの仕様に基づくシェルの再実装

CShell

NEM-PA Series M.2 2280 Gaming SSD

NEM-PA Series M.2 2280 Gaming SSDの初公開映像

Full-CG VideoCommission

Fluctuation landscape

The MixC(上海)の常設インスタレーション

Art InstallationCommission

Contour

ボリュメトリクスを用いたWOWオリジナルショートムービー

Full-CG VideoCommission

CodeHero by shibajuku

HTML + CSSリファレンスサイト

WebsiteHTMLCSS

Virtual Event Platform Concept movie

ドコモの独自仮想空間「Virtual Event Platform」コンセプト映像

Live ActionVFXCommission

Moment

風の計測結果を3次元データに変換した彫刻作品

Art InstallationC++SimulationCAD

SFC Creative Week

大学のキャンパスを活用して学生主導で企画実施した展示会

Exhibition