
2026/09 - 2026/09
doodleee
BunTypeScriptReactTanStack StartRapierThree.jsSQLiteDrizzleRailway
遊ぶ: https://doodleee.up.railway.app
概要
- キャンバスに絵を描いて「走らせる」を押すと、絵がそのまま生き物になって走る。脚の付き方・胴体の重さ・線の歪みで走り方が変わる
- レース: サーバーが直近の参加者から相手を抽選し、横スクロールのコースで速さを競う。相手が同時に接続している必要はない
- リング: 専用の絵を描いて 1 対 1 で対戦。武器で押す・台から落とす。HP やダメージの数値は無く、勝敗は物理だけで決まる
- 生き物ごとに口調(くやしがり・いばりんぼ・びびり など)があり、レース・リングの状況に応じた吹き出しで喋る
- 2D / 3D 切替、Elo 型 rating の順位表、日英対応。ログイン不要
設計上のポイント
- 絵から部位を決める判定は「絵全体から動的に決まる帯」で脚と武器の種を先に決め、残りを胴体にする方式。胴体を先に決める方式は手描きの歪みに弱く取り下げた
- 物理は Rapier(2D)。胴体・脚・武器を剛体と関節で組み、歩き方は毎ステップ逆運動学で足先の目標位置から関節角を求める。跳ねや転倒も数式で抑えず物理で決める
- 描いた絵がそのまま開始姿勢。空から落として静止を待つ方式は、脚の長い絵で地面にめり込み続けたため廃止した
- サーバーの判定とブラウザの描画が食い違わないよう、数学関数を決定論版(fdlibm 移植)にそろえ、bun と node で同じ絵・seed の結果が一致することをスクリプトで確認する
- 物理や歩容の値を変えたらルールのバージョンを上げ、過去の生き物は次のレースで学習し直す
- 画面とサーバーは TanStack Start の 1 プロセス。SQLite + Drizzle、Railway のボリュームに永続化
規模感
- 期間: 2026/09/11 〜 継続開発中(立ち上げから 1 週間)
- コミット: 33 / TypeScript・TSX: 55 ファイル
- 1 人開発(設計・物理・画面・運用すべて)