二塁塁審ジャッジ
プレイヤーは野球の二塁塁審。一塁走者の盗塁で、滑り込む走者の足がベースに触れるのと、ボールを持ったグラブが走者に触れる(タッチ)のと、どちらが先かを見極めて「アウト」「セーフ」をコールする 3D のブラウザゲームです(縦型 9:16、スマホ向け。PC でも遊べます)。
「一塁塁審ジャッジ」(umpire-1b)をもとに作っています。構成、BGM、得点、段階と称号、監督のリクエストとリプレイはそのまま引き継いでいます。
遊び方
- 投手がセットポジションから投げると、一塁走者がスタートを切る。捕手が捕って二塁へ投げ、ベースに入った野手(遊撃手か二塁手)が捕ってタッチする
- 投手が投球に入るところから映すのは最初のプレーだけ。2プレー目からは間延びしないよう、走者が走り出す0.3秒前から始める(
GAME.skipLead)
- 塁審の目線: 投球は二塁の三塁側(内野の内側)から見て、捕手が捕ったら走路の内野側(ベースの一塁側の面から三塁側へ0.5m、走路から5.8m)へ動く(
src/config.ts の CAMERA)。向きと画角は、プレーを作った時点で時刻ごとに先に計算しておく(buildTrack)
- 投球(最初のプレーだけ): 投手・打者・捕手が入る画角(約24°)で、投手が動き出して 0.55 秒(足を上げるところ)まで見せ、0.6 秒で走者を追う向きへ移る。走者のスタートは映らなくてよい(
pitchHold / pitchBlend)
- 走者を追う: 走者の全身と、走者の先の地面(塁審から見て走者と 15° 以内で、ベースまで)が入る向き・画角。画角の下限は 38°で、入らなければ広げる。1コマで変わるのは、広げるとき 0.8°、狭めるとき 2.5° まで(
leadAngle / fov / fovRate / fovRateIn)
- 捕球: 捕球の 0.25 秒前から 0.05 秒後まで、ベースに入った野手の全身・グラブ・ベース・ボール(捕る 0.05 秒前から)が入る最小の画角(下限 32°)で止める。走者を追う向きから移る時間は、振る角度に合わせて 0.5〜1.2 秒(向きが1コマ約 2.5° で変わるように)。走者は映っていなくてよい(
catchBefore / catchAfter / ballBefore / closeFov / pan / panRate / panMax)
- タッチ: 捕球の後に寄せ直し、足かタッチの早いほうの 0.12 秒前から、走者の全身・野手・グラブ・ベースが入る最小の画角で止める(判定の瞬間に目線が揺れない)。遅いほうの 0.3 秒後までの場面を入れる。走者は止める時刻までに画面へ入ってくる(
freeze / runnerIn / after)
- 捕球からタッチまでが短く、寄せ直す時間が 0.2 秒に満たないときは、捕球〜タッチを1つの止めた画角で見せる(
minMove)
- 寄せ直す間は、画角が1コマ 2°、向きが1コマ 2° より速く変わらないようにする。足りないときは、捕球の向きを少しタッチの向きへ寄せ、狭いほうの画角を広げて差を詰める(
moveFovRate / moveTurnRate)
- どの時刻も、収めたい点が余白(上 13%=得点などの表示の下、下と左右 5%)の内側に入る(目線が移る間は除く。上限 80°。
margin / pad / fovMax)
- 足がベースに触れ、タッチが起きたら(両方が起きたら)2秒以内にコールする
- スマホ: 画面下の「セーフ」(左)「アウト」(右)
- PC: F(または ←)= セーフ、J(または →)= アウト、M = BGM
- 両方が起きる前の入力は「まだ早い!」として無視する
- 誤審(時間切れを含む)が3回で失格。時間切れのときも、正しくはアウトかセーフかを出す(2秒表示)
判定のルール
- タッチが先ならアウト、足が先ならセーフ
- 正解は、プレーを作るときに決めた2つの時刻の差
margin = 足がベースに触れる時刻 − タッチの時刻 で決まる(正ならアウト)。差はいつも 0.001 秒以上あり、同時にはならない
- 画面の動き・音・リプレイは、すべて同じ時刻と位置のデータから作っている(
src/play.ts)
- 足: 走者は足から滑り込む(左足を前に伸ばし、右足は曲げる)。左の靴の先がベースの一塁側の面に届いた瞬間がベースに触れた時刻。触れた後、足はベースの面で止まる
- タッチ(
TagStyle)
- 振り下ろす(sweep): 捕ってからグラブを走者の前の足のすねへ振り下ろす。グラブは触れる瞬間まで脚の上にあり、その瞬間にすねの上の面に届く
- 足の前で待つ(wait): 捕ってからタッチまで 0.42 秒以上あるアウトのとき。グラブを靴の先の通り道に置いて待ち、靴の先が滑り込んできて触れた瞬間がタッチ
- 待っているところへ滑り込むのは見るからにアウトなので、待つタッチは差の大きい(はっきり)アウトだけに使い、際どいプレーにはしない(リクエストも出ない)。際どい・中くらいのプレーは、捕ってすぐ振り下ろすタッチにする(捕ってからの余分な間を 0.38 秒未満に抑える)
- 走者がタッチをかわす動きを足すときは、待つタッチをかいくぐるプレーを際どいプレーにしてよい(いまの決まりは
src/play.ts の canWait と close)
- ベースに入る野手の走り(
src/play.ts の coverDist、src/actors.ts の coverRun)
- 投手が投げる 0.05 秒前に走り出し、加速(0.5 秒)→ 一定の速さ → 減速(0.45 秒)でベースに着く。一定の速さは 6.0〜8.3 m/s で、捕る 0.3 秒前までに着く(間に合わないプレーは作らない)
- 足は地面についている間は止まり、腰の進む速さに合わせて運ぶ(滑らない)。走り出しは、左足を構えの位置に置いたまま右足から踏み出す
- 止まる 0.36 秒前から一歩ずつ踏み込み、捕手の方へ向き直って送球を待つ構えになる。待つ間は小さく弾む
- 捕る構えへは、ベースに着く前からでも途切れずにつなぐ
- タッチする野手の姿勢(
src/actors.ts の tagStance・reach)
- 振り下ろすタッチ: ベースのすぐ先(二塁側)に一塁の方を向いて立ち、足は走路と直角に開く(内側の足はベースの上、外側の足は外野側)。内野側は空けて、グラブと足が塁審から見えるようにする。走者の足はベースの面で止まり、曲げた右脚と体は一塁側にあるので、野手の足とは重ならない
- 足の前で待つタッチ: 触れる点の外野側(0.8m)に立つ。触れる直前から、一塁側の足から外野側へ下がって、滑ってくる走者をよける
- 一歩の時間は運ぶ距離で決める(遠いほど長く、足を高く上げる)
- 体(腰の高さと前傾)は、グラブが下りるのに合わせて下ろす。グラブより先にかがまない。低い目標では、前に倒すより腰を落とす方を先にする
- グラブを持たない右手はグラブに添える(両手で捕り、両手でタッチする)
- グラブを届かせるときは、目標の高さから決めた腰の高さと前傾から始め、届かなければ「腰を落とす・前に倒す・寄せる」を少しずつ強める(高い送球は伸び上がる)。どの姿勢でも届かないときは、いちばん近づく姿勢にする。届かせ方が目標の位置に対して連続に変わるので、コマごとに姿勢が飛ばない
- 右手が届かないとき(それた送球など)は、届くところまで伸ばす(腕が伸び切って肘が裏返らない)
- それた送球は、捕る前に両足を捕球点の方へ寄せる
- タッチの後は起き上がり、グラブを自分の方へ引き上げてボールを見せる
- 走者がベースから離れる、落球、タッチの空振りはない
時間の組み立て
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 秒 |
- 送球を受ける位置はベースの本塁側(高さ 0.7〜1.45m)。16人目からは 40% の送球がそれる(横に 0.55〜1.1m、低め 0.25〜0.5m か高め 1.6〜2.0m)
- ベースに入る野手は遊撃手(55%)か二塁手。入らない方は二塁の後ろへカバーに走り、中堅手も前進する
- 20人目からは 40% の走者がヘッドスライディングする。頭から飛び込み、胸を地面につけて腹ばいで滑る。両腕は肩から前へまっすぐ(ほぼ水平に)伸ばし、頭は両腕の間で前を見る。両脚は後ろへ伸ばす。前に伸ばした左手の指先がベースの面に触れた時刻が「ベースに触れた」時刻になる(足から滑るときは左足の靴の先)。振り下ろすタッチは左腕の上腕(手から 0.35m)へ、待つタッチは指先の前にグラブを置く。振り下ろすときの野手は、走者の手を脚で隠さないよう、ベースの先へ少し離れて立つ(
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%) |
- 得点: 正解 100 点、際どいプレーの正解 300 点。足とタッチの両方が起きてから 0.7 秒以内のコールは +20 点、1.0 秒以内は +10 点
- 段階と称号: そのゲームでの正解数で決まる(
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% |
- 差はそれぞれの範囲から一様に選ぶ。アウトとセーフは半々(練習の3プレーを除く)
- いちばん小さい差は約 1/60 秒(1コマ)以上にして、足とタッチが必ず別のコマで起きるようにした。どの段階でも、はっきりしたプレーが 2 割以上出る
- 以前の版は難しすぎた(際どいプレーが 40〜60%、上の段階では 0.001 秒の差も出て、はっきりしたプレーは 5% だけ)。一度大きく下げた(際どい 25〜50%、際どいの境目 0.03〜0.08 秒)あと、2回に分けて少しずつ上げた
This is the beginning of the README. Read the rest at the original. Read the full README ↗