Skip to main content

Module client

Module client 

Source
Expand description

Движковые клиентские примитивы: snapshot-интерполяция (schema-driven), бинарный декодер кадра v3 (framing), 2D raycast, примитивы столкновений (SAT-контакты + импульсный решатель) и generic-оркестрация рендер-тика (game::ClientState<G>) поверх игровой предикт-логики (game::GameClientDef, реализует конкретная игра — см. games/tanks/core/src/client/mod.rs).

Modules§

collision
2D-примитивы столкновений для клиентского предсказания — порт src/lib/collision.js (срез tank-battle 2026-08): «угол объекта» → центр, OBB против OBB (SAT), сбор контактов OBB с тайловой сеткой стен. Геометрия берётся тем же Box2 и той же тайловой сеткой, что и client::raycast, — предсказание движения и предсказание выстрела обязаны видеть карту одинаково. Разрешение собранных контактов — в client::rigid_body.
divergence
Детектор рассинхрона предикта (plan/done/ai-debug/stage_5.md): сравнение предсказанного состояния своего актора с авторитетным player-блоком кадра — покомпонентно, с порогами из конфига.
game
Граница клиентского generic-каркаса ↔ игровой предикт (Этап 4b плана распила, PLAN.md §3.6/§4b). ClientState<G> (этот модуль) владеет сетевым буфером (Interpolator), очередью событийных кадров и hot-буфером рендер-тика; конкретная игра (TanksClient и т.п.) реализует GameClientDef — client-side prediction своего актора, визуальный спавн эффектов, панель. Форма трейта валидирована фикстурой (tests в этом модуле, TestClient) до миграции танков — см. PLAN_4_details.md.
interpolator
Snapshot-интерполяция — порт src/client/SnapshotInterpolator.js (срез 2.6). Кадры складываются в буфер по seq с дедупликацией, мир рендерится в прошлом (renderTime = serverNow − delay); события опоздавших кадров выдаются немедленно следующим sample().
raycast
2D raycast-примитивы для клиентского предсказания выстрелов — порт src/lib/raycast.js (срез 2.6): приближённая реплика авторитетного world.cast_ray по данным, которые уже есть у клиента (тайловая сетка стен, прямоугольники динамики карты и танков).
rigid_body
Минимальный двухтельный решатель контактов (sequential impulse) для клиентского предсказания — порт src/lib/rigidBody.js (срез tank-battle 2026-08): предсказанный актор, динамика карты и стены живут в одной симуляции, поэтому нарисованные тела не выдавливают друг друга. Это приближение Rapier, а не его копия: остаток расхождения прячет реконсиляция игрового предиктора.
unpack
Декодер бинарного кадра v5 — порт unpackFrame из src/lib/snapshotCodec.js (срез 2.6). Раскладка зеркальна упаковке core/src/snapshot.rs (big-endian); float снапшота восстанавливаются повторным округлением до 2 знаков (round2), player-блок читается без округления (точность нужна предикту).

Constants§

HOT_HAS_CAMERA
HOT_HAS_FRAMES
HOT_HAS_GAME
HOT_HAS_PREDICTED