========================================================================
プロトタイプ仕様書:50人同時移動テスト (Prototype Spec: Movement Test)
========================================================================
1. プロトタイプ概要 (Overview)
------------------------------------------------------------------------
1-0. 目的
50人のプレイヤーが同じフィールド上で遅延なく移動できる通信基盤を検証する.
衝突判定,塗り処理,ゲーム進行管理などの付随要素は実装せず,純粋な「移動同期」と「負荷検証」にフォーカスする.
1-1. 検証範囲
・マップ: 100×100マスのグリッドマップ
・人数: 最大50クライアント同時接続
・動作: 360度移動,カメラ追従,他者位置の同期表示
2. クライアント実装仕様 (Client Implementation)
------------------------------------------------------------------------
2-0. 目的
入力処理,移動計算,および描画の基本ロジックを定義する.
2-1. 入力・操作系
■ ジョイスティック操作
・左側エリア: 画面左半分をタッチ可能な移動ジョイスティック領域とする.
・入力形式: 360°全方位入力.
・ベクトル正規化:
- 入力ベクトルの長さが1.0を超える場合,1.0に正規化する.
- これにより,斜め移動時の意図しない加速を防止する.
■ 誤操作防止 (UX Protection)
・スクリーンロック:
- ゲーム画面に対するスクロール,拡大縮小(ピンチ操作)を無効化する.
・エッジデッドゾーン:
- 画面左右の端(10px〜)を入力無効領域とし,OSのジェスチャー機能暴発を防ぐ.
2-2. 移動・演算ロジック
■ キャラクター仕様
・サイズ: 0.8マス×0.8マス
・移動速度: 秒速4〜5マス
■ 時間管理 (Time Management)
・DeltaTime対応:
- 毎フレームの移動量計算に「前フレームからの経過時間 (DeltaTime)」を乗算する.
- 計算式: `Position += Velocity * Speed * DeltaTime`
- 目的: 端末のフレームレート(30fps/60fps/120fps)に依存せず,移動速度を一定に保つ.
■ 座標管理
・内部座標(計算・通信用):
- Float(浮動小数点)で管理し,滑らかな移動を実現する.
・グリッド座標(表示目安):
- 内部座標の小数点以下を切り捨て(Floor)た値を現在のマスとする.
2-3. カメラシステム (Camera System)
■ カメラ追従 (Camera Follow)
・挙動:
- 常に「自キャラクター」が画面の中央に配置されるよう,カメラ座標を毎フレーム更新する.
- マップ端に到達した場合のクランプ(固定)処理は,本プロトタイプでは実装不要とする(黒背景が見えても良い).
3. 通信アーキテクチャ (Network Architecture)
------------------------------------------------------------------------
3-0. 目的
50人の座標をリアルタイムに同期するためのデータ構造と通信フローを定義する.
3-1. 通信フローと役割分担
| カテゴリ | クライアント (Client) | サーバー (Server) |
| :--- | :--- | :--- |
| **自キャラ** | **予測 (Prediction)**: 入力を即時反映し座標を更新・送信. | **中継 (Relay)**: 受信座標を正とし,他者へブロードキャスト. |
| **他キャラ** | **補間 (Interpolation)**: 受信した過去の座標間を滑らかに補間移動. | **間引き (AoI)**: 距離に応じ送信情報を圧縮・除外. |
3-2. サーバー更新ループ (Server Loop)
■ ティックレート (Tick Rate)
・頻度: 20Hz(50ms間隔)
・処理内容:
1. 受信バッファ内の全クライアントからの入力を取り出す.
2. AoI(関心領域)判定を行い,各クライアントに必要なデータをフィルタリングする.
3. 全クライアントへ「スナップショット」を一斉送信する.
■ スナップショット送信 (Snapshot)
・送信データ:
- 視界範囲内にいる全キャラクターの ID,座標,向き.
- サーバータイムスタンプ(補間計算用).
3-3. データ構造・最適化
■ パケット設計
・形式: バイナリパケット(ArrayBuffer等)を採用し,JSON等のテキスト形式は使用しない.
■ 座標の量子化 (Quantization)
・目的: 通信帯域の削減.
・手法:
- Float座標(0.0〜100.0)を,Unsigned Short(0〜65535)の整数値に変換して送信する.
- 受信側で再度Floatに戻して使用する.
■ 送信データ (Input Data)
クライアントからサーバーへ毎フレーム(または間引き)送信するデータ.
・現在座標 (Position): 物理演算(DeltaTime適用)後の確定座標 (x, y).
・移動ベクトル (Velocity): 補間予測用の補助データ.
・角度 (Rotation): キャラクターの向き.
■ エリア別同期 (AoI)
・ロジック:
- 各プレイヤーを中心とした一定範囲(例: 画面サイズの1.5倍)外にいる他プレイヤーの座標データは送信しない.
- これにより,50人全員が動いていても,各端末が受け取るデータ量を視界内のみに限定する.