Newer
Older
PixelPaintWar / docs / 04_Spec / SPEC_03_プロトタイプ_移動テスト.txt
========================================================================
プロトタイプ仕様書: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人全員が動いていても,各端末が受け取るデータ量を視界内のみに限定する.