diff --git "a/docs/SPEC_03_\343\203\227\343\203\255\343\203\210\343\202\277\343\202\244\343\203\227_\347\247\273\345\213\225\343\203\206\343\202\271\343\203\210.txt" "b/docs/SPEC_03_\343\203\227\343\203\255\343\203\210\343\202\277\343\202\244\343\203\227_\347\247\273\345\213\225\343\203\206\343\202\271\343\203\210.txt" new file mode 100644 index 0000000..b4400cd --- /dev/null +++ "b/docs/SPEC_03_\343\203\227\343\203\255\343\203\210\343\202\277\343\202\244\343\203\227_\347\247\273\345\213\225\343\203\206\343\202\271\343\203\210.txt" @@ -0,0 +1,107 @@ +======================================================================== +プロトタイプ仕様書: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人全員が動いていても,各端末が受け取るデータ量を視界内のみに限定する. \ No newline at end of file