Skip to main content

Module game

Module game 

Source
Expand description

Граница клиентского generic-каркаса ↔ игровой предикт (Этап 4b плана распила, PLAN.md §3.6/§4b). ClientState<G> (этот модуль) владеет сетевым буфером (Interpolator), очередью событийных кадров и hot-буфером рендер-тика; конкретная игра (TanksClient и т.п.) реализует GameClientDef — client-side prediction своего актора, визуальный спавн эффектов, панель. Форма трейта валидирована фикстурой (tests в этом модуле, TestClient) до миграции танков — см. PLAN_4_details.md.

Камера и predicted-хвост hot-буфера разделены: движок пишет камеру как [f32; 2] (общий для любой игры смысл — «куда смотреть»), а форму хвоста (набор полей актора) собирает игра — движок дописывает его в hot-буфер как непрозрачный Vec<f32>, не зная раскладки (см. RenderOverlay).

Тем же хвостом игра перекрывает и ЧУЖИЕ строки кадра (GameClientDef::render_rows): предсказанные телом игры сущности — динамика карты, контактирующие чужие акторы — дописываются записями после predicted-хвоста, а разбор hot-буфера кладёт запись в game[key][id], поэтому последняя запись перекрывает интерполированную.

Structs§

ClientState
Generic оркестрация клиентского ядра поверх игровой G: GameClientDef: сетевой буфер (interpolator), очередь событийных кадров, hot-буфер рендер-тика. Байтовая раскладка hot-буфера (флаги/камера/N танков×поля/M динамики×поля/predicted-хвост) не меняется — см. write_hot.
PredictedRow
Строка рендер-тика, которой игра перекрывает интерполированную: key_id — числовой id ключа снапшот-реестра, id — id строки (gameId для Indexed8, индекс для IndexedNoNull8), fields — поля по схеме этого ключа. Ширину движок приводит к схеме сам: лишние поля отбрасываются, недостающие дописываются нулями, иначе одна кривая запись сдвинула бы разбор всего хвоста.
RenderOverlay
Predicted-запись рендер-тика: камера (общий смысл) + непрозрачный хвост hot-буфера (раскладку полей актора знает только игра).

Traits§

GameClientDef
Игровая половина клиентского ядра — зеркало crate::sim::GameSim<G> на клиентской стороне. ClientState<G> (ниже) зовёт эти методы в фиксированных точках рендер-тика; Self хранит всё нужное для предикта (модели, оружие, историю ввода) само — ClientState<G> игровых конфигов не хранит.