CoOp:Anything
게임을 검색해 협동 플레이 가능한 모드·단계·품질·커뮤니티 평점을 확인합니다
아직 감지된 업데이트가 없습니다. GitHub 릴리스가 나오면 여기에 보입니다.
개인 계정의 공개 저장소 소유자는 GitHub로 로그인해 운영자를 확인하고 소개를 직접 관리할 수 있습니다. 관리자 승인은 필요하지 않습니다.
로그인한 뒤 확인 파일을 만들어 이 저장소의 기본 브랜치에 30분 안에 커밋해 주세요. 다른 브랜치나 포크의 파일은 인정하지 않습니다. 파일을 올린 뒤 아래에서 확인하면 관리자 승인 없이 관리할 수 있습니다. 자격을 유지하려면 파일을 남겨 두세요.
로그인이 필요하면 로그인 화면으로 이동합니다. 로그인 후 이곳으로 돌아와 원하는 확인 버튼을 다시 눌러 주세요.
프로젝트 폴더에서 /nomorevibe verify를 실행하면 소유권을 확인하고 소개를 직접 관리할 수 있습니다.
1분 만에 확인하기二塁塁審になって、盗塁のタッチプレーでアウトかセーフかをコールするブラウザゲーム
저장소 README에서 가져옴
README 전체를 불러오는 중입니다.
README 전문 보기 ↗プレイヤーは野球の二塁塁審。一塁走者の盗塁で、滑り込む走者の足がベースに触れるのと、ボールを持ったグラブが走者に触れる(タッチ)のと、どちらが先かを見極めて「アウト」「セーフ」をコールする 3D のブラウザゲームです(縦型 9:16、スマホ向け。PC でも遊べます)。
「一塁塁審ジャッジ」(umpire-1b)をもとに作っています。構成、BGM、得点、段階と称号、監督のリクエストとリプレイはそのまま引き継いでいます。
GAME.skipLead)src/config.ts の CAMERA)。向きと画角は、プレーを作った時点で時刻ごとに先に計算しておく(buildTrack)
pitchHold / pitchBlend)leadAngle / fov / fovRate / fovRateIn)catchBefore / catchAfter / ballBefore / closeFov / pan / panRate / panMax)freeze / runnerIn / after)minMove)moveFovRate / moveTurnRate)margin / pad / fovMax)margin = 足がベースに触れる時刻 − タッチの時刻 で決まる(正ならアウト)。差はいつも 0.001 秒以上あり、同時にはならないsrc/play.ts)TagStyle)
src/play.ts の canWait と close)src/play.ts の coverDist、src/actors.ts の coverRun)
src/actors.ts の tagStance・reach)
1プレーの流れ(src/play.ts の generatePlay)。先に差を決め、走者の到達時刻から逆算して、捕球・送球・投球の時刻を合わせる。
| 場面 | 範囲 |
|---|---|
| 投手が動いてから投げるまで(クイック) | 0.82〜1.05 秒 |
| 投球の速さ | 37〜42 m/s |
| 捕手が捕ってから投げるまで | 0.55〜0.85 秒 |
| 捕手の送球の速さ | 33〜38 m/s(ポップタイムは約 1.6〜2.0 秒) |
| 走者のリード / スタートの遅れ / 最高速度 | 3.2〜3.9 m / 0.06〜0.22 秒 / 8.4〜9.3 m/s |
| 滑り始めてからベースまで | 0.5〜0.7 秒(大きな差のアウトは長め、最大 1.05 秒) |
| 投手が動いてからベースまで | 約 3.2〜4.1 秒 |
RUNNER.head*、TAG.headStand、STAGE.headSlide)RUNNER.evadeRate を 0 より大きくすると 30人目から出る(STAGE.evade)。確認用に __game.replay({ evade: true }) で作れる| プレー | 内容 |
|---|---|
| 1〜3人目 | 練習。差 0.3 秒以上のはっきりしたタイミングだけ。2・3人目は直前と逆の結果 |
| 4人目〜 | 際どい・中くらい・はっきりが混ざる。際どさは正解数の段階で変わる |
| 16人目〜 | 送球がそれる |
| 20人目〜 | ヘッドスライディングもする(40%) |
src/config.ts の LEVELS)| 正解数 | 称号 | 際どい(いちばん小さい差〜際どいの境目) | 中くらい | はっきり |
|---|---|---|---|---|
| 0〜9 | 草野球の審判 | 0.035〜0.058 秒・35% | 0.059〜0.118 秒・35% | 0.12〜0.32 秒・30% |
| 10〜19 | 審判見習い | 0.028〜0.05 秒・40% | 0.051〜0.11 秒・35% | 0.12〜0.32 秒・25% |
| 20〜29 | 二軍の審判 | 0.022〜0.04 秒・45% | 0.041〜0.10 秒・35% | 0.12〜0.32 秒・20% |
| 30〜39 | 一軍の審判 | 0.018〜0.034 秒・50% | 0.035〜0.094 秒・30% | 0.12〜0.32 秒・20% |
| 40〜49 | ??? | 0.017〜0.027 秒・55% | 0.028〜0.087 秒・25% | 0.12〜0.32 秒・20% |
| 50〜99 | ??? | 0.017〜0.022 秒・60% | 0.023〜0.082 秒・20% | 0.12〜0.32 秒・20% |
| 100以上 | ??? | 0.017〜0.022 秒・60% | 0.023〜0.082 秒・20% | 0.12〜0.32 秒・20% |
すべて Web Audio API で合成しています(音声ファイルなし)。
| 音 | 鳴るとき |
|---|---|
| 捕手のミット | 捕手が投球を捕る瞬間(遠い) |
| 走者の足音 | 走者の足が地面に着くたび(滑り始めるまで) |
| スライディング(ザザーッ) | 滑り始めてから、ベースに触れた少し後まで |
| 送球の風切り音・二塁での捕球音(パシッ) | ベースに入った野手が捕る瞬間 |
| コールの効果音・観客の歓声など・BGM | 「一塁塁審ジャッジ」と同じ |
app/
├── index.html
├── public/
│ ├── favicon.svg # 「一塁塁審ジャッジ」のものをそのまま使っている
│ └── ogp.png # SNS共有用の画像(1200×630)。npm run ogp で作り直せる
├── src/
│ ├── config.ts # 調整値(寸法・走者・バッテリー・タッチ・難易度・得点・目線)
│ ├── play.ts # 1プレーの正解(時刻と位置)を作る。描画に依存しない
│ ├── figure.ts # ローポリの人形(手足の先の位置から IK で関節を決める)
│ ├── actors.ts # 走者(リード・走る・スライディング)、投手、捕手、ベースに入る野手(捕球・タッチ)、ほかの野手、監督
│ ├── camera.ts # 塁審の目線、リプレイのカメラ、監督のアップ
│ ├── scene.ts # スタジアム、ボール、リプレイの印、リクエストの四角の軌跡
│ ├── audio.ts # 効果音と BGM の合成
│ ├── main.ts # 進行・入力・表示・確認用の入口(window.__game)
│ └── style.css
├── tests/play.test.ts # プレー生成の単体テスト(vitest)
└── tools/
├── e2e.mjs # ブラウザでの通し確認(playwright-core + インストール済み Chrome)
├── shots.mjs # 1プレーの各時点のスクリーンショット
├── pose.mjs # タッチの前後の野手の姿勢を、塁審の目線・横・後ろから撮る(tools/out/pose/)
├── coverseq.mjs # ベースに入る野手の動きを一定の間隔で撮る(塁審の目線・斜め上・追う視点など)
├── framing.mjs # 塁審の目線で、収めたい点(投手〜捕手・走者の全身・タッチの場面)が画面に収まるかを測る
├── motion.mjs # ベースに入る野手の動きを測る(瞬間移動・足の滑り・速さ)
├── overlap.mjs # ベースに入る野手と走者の体が重なっていないかを測る
├── contact.mjs # スクリーンショットを1枚に並べる
├── promo/ # 告知動画の撮影と台本(scenario.js)。出力は ../video/
└── ogp/make-ogp.mjs # OGP画像を作る(際どいアウトの「タッチの瞬間」と「上下2画面のリプレイ」を撮って、タイトルと並べる)
npm install
npm run dev # http://localhost:5290/
npm test # 単体テスト
npm run e2e # 通し確認(npm run dev を起動した状態で)
npm run build # dist/ を空にして、型チェック + dist/umpire-2b/ へ出力
npm run promo # 告知動画を作る(ビルドしてから撮影。出力は ../video/)
npm run ogp # public/ogp.png を作り直す(npm run dev を起動した状態で。SEED・INDEX・MARGIN で場面を変えられる。決まった乱数なので毎回同じ場面になる。画素は描画の都合で少し変わる)
node tools/shots.mjs [seed] [index] [差] [SS|2B] [sweep|wait] [wide] # 1プレーを撮る(tools/out/shots/)
node tools/motion.mjs '[{"cover":"2B","margin":0.03}]' # 野手の動きを測る(JUMPS=0.06 で跳んだコマ、SLIDE=1.5 で足の滑りを出す)
node tools/overlap.mjs '[{"cover":"2B","margin":0.03}]' # 野手と走者の体の重なりを測る
FROM=-0.5 W=405 H=720 node tools/coverseq.mjs tools/out/seq '{"cover":"2B","margin":0.03}' 0.07 ump # 捕る 0.5 秒前から 0.07 秒ごとに撮る
node tools/framing.mjs [プレー数] # 塁審の目線で、収めたい点が画面に収まるか・画角の変化・判定の瞬間に足やグラブが隠れないかを測る(最初のプレーと途中のプレーを交互に。CAM='{"judgeS":1}' で調整値を変えて測れる)
?seed=数値 を付けると、プレーの並びが毎回同じになるwindow.__game で状態の取得・コール・時間の速さの変更・1コマずつの進行・プレーの指定(replay({ margin: 0.01, cover: 'SS', style: 'wait', wide: true }) など)ができるwindow.__game.sight() で、塁審の目線からグラブ・前の足・ボールが体に隠れていないか、画面のどこに映るかを測れる。window.__game.probe() で、いま描いている足首とグラブの位置と、正解のデータから計算したタッチの目標・靴の先を比べられるベースに入る野手(とくに二塁手)の動きを見直した。直す前に測ると、次のことが起きていた
直した後: 1 コマで体が跳ぶ瞬間移動はなくなった。関節が 1 コマ(1/120 秒)で 7.5cm を超えて動くのは、走る足・それた送球へ手を伸ばすときの肘・タッチの後にグラブを引き上げるときの肘だけで、いずれも数コマ続く速い動き(最大 10cm)。地面についた足の滑りは 2 m/s 未満(ほとんどは 1 m/s 前後)、走る速さは最高約 8 m/s。遊撃手・二塁手、振り下ろす・待つ、それた送球の組み合わせで、野手と走者の体の重なりは 3cm 未満
タッチする野手の姿勢を変更(以前は上体を約70°倒し、腰を地面近くまで落として届かせていて、四つんばいのように見えた)。4通り(振り下ろす・アウト/セーフ、待つ、それた送球)を塁審の目線・横・後ろから撮って確かめた。待つタッチの後、走者と野手の胸は約 0.5m 離れる(以前は重なっていた)
待つタッチを差の大きいアウトだけに限った。3000 プレーで数えると、はっきりしたアウトはほぼすべて待つタッチ、際どい・中くらいのプレーはすべて振り下ろすタッチになった
単体テスト(12件): 60 通りの乱数 × 40 プレーでプレーを必ず作れること、正解と差の一致、出来事の順番、盗塁の時間とポップタイムの範囲、靴の先(ヘッドスライディングは指先)がベースの面に届く時刻、ヘッドスライディングが出る段階と割合、タッチをかわす走者を出さないこと(指定すれば作れて、右手で触れる位置・野手が追う時刻が正しい)、タッチで触れる点、送球がそれる段階、段階ごとの際どさの範囲と割合(いちばん小さい差が 1コマ以上、はっきりしたプレーが 2 割以上)、待つタッチが際どいプレーにならないこと、ベースに入る野手の速さが途切れず速すぎないこと
通し確認(npm run e2e): すべて成功
塁審の目線(tools/framing.mjs、180 プレー。途中のプレーの約4割はヘッドスライディング): はみ出しなし。捕球の瞬間の画角は 32〜53°(中央値 38°)、判定の瞬間の画角は 39〜63°(中央値 46°)。1コマの変化は画角が最大 2.0°、向きが最大 2.5°(直す前は、捕球からタッチへ寄せ直すときに画角が最大 4.4°、走者から捕球へ移るときに向きが最大 7.8° 変わっていた)。捕球の場面にボールの飛んでくる軌跡(捕る 0.1 秒前から)まで入れると、捕球の画角は中央値 60°前後まで広がった。タッチと足の瞬間にグラブか足(手)が体に隠れたのは 13/180 プレー(立ち位置を変える前の 15/180 と同程度。三塁側へ 2.0m 寄せると画角は中央値 40°まで狭まるが、140/180 プレーで隠れた)。直す前(決まった向き・画角)は 60 プレー中 59 プレーでタッチの場面の何かがはみ出し、走者はベースの手前で画面から切れていた。一つ前の版は、走者の全身を入れるために広げた画角を判定まで狭めきれず、判定の瞬間の画角は中央値 67°だった(今の版は人が約1.5倍の大きさ)
スマホ実機: 2026-10-31 に公開URLで遊んで確かめた
npm run promo で、縦型(1080×1920、30fps)の約 30 秒の動画を作る。実際のゲーム画面をヘッドレスの Chrome で1コマずつ撮り、字幕と効果を重ねて MP4 にする(tools/promo/、台本は tools/promo/scenario.js)。
__game.audio で書き出し用に鳴らし直す)。-14 LUFS に合わせる../video/umpire-2b-promo.mp4、表紙 umpire-2b-promo-cover.jpg、2秒おきの一覧 umpire-2b-promo-sheet.jpg(動画はリポジトリに含めない)PROMO_EVERY=15 npm run promo で 15 コマおきの一覧だけ作る。PROMO_ENCODE_ONLY=1 npm run promo で撮り直さずに書き出しだけやり直すCloudflare Workers の静的アセットで https://game.chozo.net/umpire-2b/ に公開しています(wrangler.jsonc。game.chozo.net/umpire-2b と game.chozo.net/umpire-2b/* のルートだけを受け持ち、workers.dev は使わない)。
npm run deploy # ビルドして wrangler deploy
npm run e2e -- https://game.chozo.net/umpire-2b/ がすべて成功し、favicon・OGP画像の取得、末尾スラッシュなしのURLの移動(307)、同じドメインの他のゲームの表示を確かめたMIT License(Copyright (c) 2026 chozo)です。改変・再配布・商用利用ができます。利用するときは、著作権表示とライセンス文を残してください。
「二塁塁審ジャッジ」「chozo」の名前やロゴを、作者が関わっているように見える形で使わないでください。
使っているライブラリ: three.js(MIT License)