10 KiB
Day 8 (продовження): WeaponHudC, ZombieInvasionHudC, InstallBanner-рестайл, шрифт, ротація (2026-08-13)
Усе нижче — ще не закомічено (тільки 4a22a9b/63609ee в git; це
робота вже після другого коміту). npm run export вже прогонявся раз
успішно (з побічним авто-встановленням three.quarks, бо в export.cjs
своя мережева воркфлоу — див. окремий output_export_browser_en.html).
WeaponHudC.ts/ZombieInvasionHudC.ts — нові статичні/напівстатичні юайки
Реалізовані аналогічно HudC (окремий контролер на юайку, init() з
TestSceneC). Ассети: ZombiePunk_Icon-Bottom.webp+Tool_2.webp для
зброї, REF_1.png (насправді webp, розширення джерела — брехня,
перевірено по сирих байтах RIFF/WEBP заголовку) для голови зомбі.
ZombieInvasionHudC пройшов кілька раундів фідбеку:
- Спочатку
.zombie-invasion__barмав суцільний зеленийbackground(статично "повний" від t=0) — користувач: "WARNING_FRACTION чомусь почався тільки коли шкала повністю заповнилась". Причина НЕ в таймінгу (114000мс з 120000мс— точно останні 5%, перевірено), а в тому, що шкала і так ЗАВЖДИ виглядала на 100% — різницю "майже" vs "повна" було неможливо побачити. Фікс: реальна заливка (.zombie-invasion__trackзoverflow:hidden+.zombie-invasion__fill, ростеwidth:0%->100%зright:0, стартує в ТОЙ САМИЙ тік з тією ж тривалістю, що й голова — їхні межі математично завжди збігаються, без пофреймової синхронізації). - Голова мала бути БІЛЬШОЮ за саму шкалу (
0.24 * widthпроти0.15 * widthвисоти бару) — але.zombie-invasion__barмавoverflow:hiddenдля заливки, що обрізало б і голову. Фікс: голова винесена сиблінгом.zombie-invasion__track(не її дитиною) — обрізає тільки заливку/флеш, не голову.
InstallBanner (SDK-компонент) — свідомо НЕ переписаний, лише CSS-рестайл
Круглий портрет персонажа + кнопка "INSTALL" знизу — це не наша
юайка, а SDK InstallBanner (node_modules/@hitplay/playable_template,
підключений в beforeResourcesLoadedCb.ts) з реальним кліком
(AnalyticsC.sendDownload() -> Template.end()) і власною
конфіг-системою (src/configUIParams/installBanner.ts, upload_file
- X/Y/scale-відсотки окремо для portrait/landscape — реальні значення це
треті числа в кожному
values: [min, max, default]). Користувач попросив "уніфікувати" з іншими юайками — явно спитав черезAskUserQuestion, чи переписувати логіку самому, чи тільки CSS — вибрав тільки CSS-рестайл (безпечний варіант). Додано лише адитивні властивості (filter: drop-shadow,-webkit-text-strokeна.bannerButtonText) — нічого, що конфліктувало б з інжектованим SDK-стилем.
⚠️ Знахідка: purgecss мовчки вирізає .bannerButton, але не .bannerLogo/.bannerButtonText
При білді (не тільки в dev) purgecss скановує лише src/**/*.{js,ts,tsx}
**/*.htmlна предмет "чи цей клас реально використовується" — аInstallBanner's класи призначаються в JS всередині ВЖЕ мінифікованого SDK dist-бандла (не в нашомуsrc/). Емпірично перевірено в реальному білд-виводі (export/index.html):.bannerLogo{filter:...}і.bannerButtonText{...}виживають, а.bannerButton{filter:...}— ні, навіть як окреме правило. Ймовірна причина: мінифікатор пакета де-дублював рядок"bannerButton"(4 похідні: сам +Holder/Img/Text) на спільний префікс, тож він більше не існує цілим рядком у бандлі —"bannerLogo"(лише 2 похідні) не досяг порогу для такої оптимізації. Поза нашим контролем (сторонній пакет) — просто не писати CSS-правила під.bannerButtonокремо, вони будуть мертвим кодом.
gameFont нарешті став реальним шрифтом
font-family: gameFont, sans-serif використовувався в main.css/ui.css
з самого початку проєкту, але gameFont НІКОЛИ не був заведений через
@font-face — тихо відкатувався на дефолтний sans-serif усюди. Користувач:
"весь юай має використовувати шрифт PassionOne-Black, він у нас є в
temp". Додано @font-face в main.css (src/resources/fonts/PassionOne-Black.otf)
під іменем gameFont — усі існуючі посилання почали резолвитись сами,
без жодної іншої зміни. Технічний нюанс: для шрифтів (на відміну від
images.ts/ConvertToBase64WhenRelease-паттерна) НЕ треба нічого
особливого — assetsInlineLimit: 100000000 в vite.config.js
(через defineConfigTemplate) вже інлайнить будь-який url() в CSS як
base64 і в dev, і в білді. Перевірено прямо в білд-виводі (не на око).
--lvh/--lvw замість сирого vh/vw/vmin — ротація/адаптивність
Користувач (Day 8 чекліст, "All UI elements must be adaptive to changing
device rotation"): розвернув екран — нічого не змінилось. Знахідка:
SDK має OrientationC (node_modules/@hitplay/playable_template), який
під лок-режимом орієнтації обгортає сторінку в
transform: rotate(-90deg)..., щоб контент лишався візуально портретним
навіть на фізично горизонтальному екрані. Сирі vh/vw/vmin
ігнорують transform батьків і завжди рахуються від фізичного
(неповернутого) вьюпорта — тож будь-який розмір у vh стає неправильним
щойно лок реально спрацює. OrientationC для цього тримає --lvw/--lvh
("логічні" версії, коректно стежать за поворотом; в Adaptive-режимі без
локу — просто дорівнюють фізичним vw/vh, тобто нічого не коштують) —
той самий підхід, що вже й в InstallBanner.ts (--lvw в коментарях
"physical vw doesn't follow the orientation lock"). Усі --*-width в
ui.css тепер calc(var(--lvh, 100vh) * ratio).
⚠️ Важливо: дефолт в src/configUIParams/orientation.ts — "Adaptive",
НЕ лок. У цьому режимі --lvh == vh і фікс вище нічого не змінює
візуально прямо зараз — це радше "правильно про запас", коли/якщо
проєкт зрештою поставлять на Portrait Lock (майже неминуче для
вертикального плейбла). Коли користувач після цього фіксу все одно
сказав "нічого не змінилось, юайка так само зосереджена в центрі" —
попросив медіа-правила замість покладання на --lvh/лок-механізм.
Фінал: кожна з трьох юайок (resource-hud/weapon-hud/zombie-invasion)
тепер має власний @media (orientation: landscape) { ... } блок одразу
після portrait-правила, що перевизначає top/left/right/bottom і
--*-width — незалежно від OrientationC/локу, реагує на реальне
співвідношення сторін вьюпорта. Значення в landscape-блоках зараз лише
дублюють portrait як стартову точку — ще НЕ підтверджені користувачем
візуально, він вже почав підкручувати .resource-hud's landscape
--hud-width (з 0.09 на 0.19 — бачив у diff, не сам робив).
Стан на кінець цієї сесії
- Working tree:
src/configUIParams/installBanner.ts(можливо просто line-ending, не досліджував — не моя зміна),TestSceneC.ts,main.css,ui.css,images.ts— модифіковані;WeaponHudC.ts,ZombieInvasionHudC.ts,resources/fonts/, три нові.webp— нові. Не закомічено. stats.html— як завжди, build-артефакт, свідомо не в git.- Наступний крок, якщо буде запит: підтвердити/підкрутити landscape
@media-значення разом з користувачем, коли він реально побачить це на розгорнутому екрані.