Теперь сами бойцы. Сделаем их чёткими, уберём рывки между анимациями и скольжение по полу. Здесь три промпта, и третий чинит баг, который появился после второго: зелёные автотесты ещё не значат, что игра работает.
Слово «некрасиво» модель не измерит. Поэтому промпт переводит его в проверки. Спрайт на экране должен быть не меньше одного пикселя на пиксель. Кроп из игры ставится рядом с тем же кадром из исходного видео в том же масштабе. Отдельный автотест ищет скачки позы и положения на каждом кадре. И в конце прямо сказано: плавность не должна покупаться задержкой управления.
Посмотри на бойцов после шага 5. У меня тёплый свет сцены «съел» их цвета: чёрные штаны Тие Ху стали коричнево-оранжевыми, синие у Бай Лянь серо-фиолетовыми. Если у тебя цвета в порядке, удали этот пункт из промпта.
Слева до, справа после «вписывания» бойцов в свет сцены: цвета костюмов выцвели.
новый чат. прочитай AGENTS.md. локация готова, теперь самое важное для меня - сами бойцы.
посмотрел ролики боя - неплохо, но не идеально. для меня главное - ПЛАВНОСТЬ анимаций и переходов, отклик управления, никаких резких переключений и рывков, и чтобы было очень красиво. и качество персонажей хуже, чем могло бы быть: в стойке ещё ок, но в движении и когда камера отъезжает они мыльные, а по краям видны квадратики и ореол.
1. качество персонажей:
- при игровой камере на 1080p спрайт должен быть минимум 1:1 к пикселям экрана (лучше с небольшим запасом) в самом крупном плане, а при отъезде камеры не мылиться. пересобери атласы под реальный размер бойцов в кадре
- сжатие без артефактов на альфе (lossy webp по альфе даёт квадратики) и без мыла от мипмапов
- в движении смешивание двух кадров не должно давать мыло и двоение - проверь на ударах, а не только в стойке
- rim-подсветка от огня не должна давать светящийся контур вокруг всего силуэта
- после прошлого круга тёплая тонировка «съела» цвета: у Тие Ху чёрные штаны стали коричнево-оранжевыми, у Бай Лянь синие - серо-фиолетовыми, бойцы выглядят выцветшими. вписать в свет можно, но собственные цвета костюмов, чёрный и белый должны остаться как в исходнике: тонировка лёгкая, по краю и снизу, а не на весь спрайт. сравни цвета игрового кропа и кадра исходника рядом
- проверь сам: кроп игрового скриншота с бойцом и тот же кадр из исходного видео в том же масштабе рядом - в стойке, на середине удара и при отъехавшей камере. должны быть одинаково чёткими
2. плавность - главное:
- проверь все переходы: idle→каждое действие, действие→idle, удар→удар (комбо J J J, J→K), ходьба→стоп, смена направления, разворот при перепрыгивании, прыжок→удар в воздухе→приземление, получение удара посреди своей атаки, блок и выход из блока, нокдаун→подъём, KO
- никаких телепортов позы и позиции, резких смен силуэта, дёрганья ног
- сделай автотест плавности: на каждом кадре меряй смещение центра масс/силуэта и изменение позы между соседними кадрами, находи скачки и чини, пока их не будет
- запиши себе переходы покадрово (шаг 1/60 с), собери контактные листы и посмотри глазами
- ходьба: убери шаговый snap на склейке цикла и скольжение ног по полу
3. отклик управления оставь таким же быстрым - плавность не за счёт задержки. после правок прогони свой тест отзывчивости, цифры не должны ухудшиться по сравнению с прошлым отчётом.
в конце - таблица до/после по чёткости, скачкам и отзывчивости.
git add -A && git commit -m "промпт 07: чёткость и плавность"
У меня это самый долгий промпт: почти 5 часов. Бойцы стали крупнее и чётче, цвета вернулись, подсветка по краю стала тонкой. Модель написала тест, который проверяет 10 сценариев переходов с шагом 1/60 секунды, и гоняла его по кругу. Отклик не ухудшился.
Смотрим в замедлении
После промпта 07 я посмотрел бой в замедлении в четыре раза. На обычной скорости многое проскакивает, а в замедлении видно всё. У меня было вот что:
бойцы плавают по полу: ноги стоят, а тело едет, на сильном ударе больше чем на метр;
прыжок выше роста бойца, голова уходит за верх кадра;
при смене анимации боец на пару кадров становится полупрозрачным.
Полупрозрачный «призрак» при смене анимации.
Внимание, это важно. В тесте скольжения моя модель тихо стала показывать медиану вместо худших значений: «медиана будет около нуля». Цифры стали красивыми, а бойцы как плавали, так и плавали. Если цифры в отчёте резко улучшились, а на экране всё по-старому, посмотри, что именно модель стала мерить.
Следующий промпт описывает симптом своими словами и называет приём: двигать бойца по опорной ноге из видео. Мои замеры в нём оставлены как пример: модель перемерит у себя сама. Ещё в нём просьба сжать спрайты: у меня они занимали около гигабайта видеопамяти, а на обычном ноутбуке так игра будет тормозить или вылетать.
новый чат. прочитай AGENTS.md и свой отчёт о прошлом круге (он в docs/) - прошлый круг был про чёткость и плавность, чёткость и цвета стали отличные, спасибо.
но я посмотрел бой целиком и в замедлении 0.25×. главное, что бросается в глаза: бойцы плавают по полу. ноги стоят, а тело едет - после пропущенного удара, в блоке, при нокдауне, а на сильном ударе их уносит больше чем на метр, как на коньках. и прыгают они слишком высоко - будто летают.
перемерь сам в бою ИИ против ИИ (40 с): сколько боец проезжает по полу за пропущенный удар, на сильном ударе, в блоке, после нокдауна, и какой высоты прыжок. в похожей версии игры замеры были такие:
- за один пропущенный удар Бай Лянь проезжает до 0.7 м, хотя в клипе hit ноги стоят
- на сильном ударе оба сдвигаются до 1.4 м
- в блоке уезжают назад до 0.5 м в неподвижной стойке
- после нокдауна тело ещё едет по полу на полметра
- прыжок у Бай Лянь - почти 1.9 м вверх, выше её роста. в кадре голова и плечи уходят за верхний край экрана, видны одни ноги
хочу как в нормальном файтинге: если нога стоит на полу, она стоит и никуда не едет. перемещение бойца бери из самого видео: найди в каждом кадре опорную ногу и сдвигай бойца ровно настолько, чтобы она оставалась на месте. где в видео есть шаг или рывок, там и движение; где ноги стоят, там и тело стоит. отдачу от удара и блока сделай небольшой и только там, где в клипе ноги реально сдвигаются, или добавь короткий шажок назад.
прыжок так же: высота и траектория - как в видео прыжка, без лишнего подброса сверху. камера не должна терять прыгающего бойца.
ещё в замедлении видно: при смене анимации боец на несколько кадров становится полупрозрачным - сквозь тело видно фон, два силуэта наложены друг на друга. особенно у Тие Ху, когда в него попадает сильный удар. тело всегда должно быть непрозрачным, переход - без «призрака».
и ещё одно, раз в игру будут играть люди на обычных ноутбуках: спрайты бойцов сейчас занимают около гигабайта видеопамяти. на слабой встроенной графике это либо вылетит, либо будет подтормаживать. сожми их в gpu-формат (ktx2/basis) без потери чёткости и прогрей все страницы на загрузке, чтобы в бою не было ни одного подлага. замерь видеопамять и вес загрузки до и после.
проверка:
- тест на скольжение ног: на каждом кадре меряй, насколько опорная нога сдвинулась относительно пола, пока она на земле. должно быть почти ноль, пара пикселей. считай по каждой ноге отдельно, а не по среднему пятну ступней
- прогони его по всем клипам и в бою ИИ против ИИ
- сам запиши бой в замедлении и посмотри на сильный удар, пропущенный удар, блок, нокдаун и прыжок
отзывчивость не трогай, цифры теста отклика не должны ухудшиться. в конце таблица до/после.
git add -A && git commit -m "промпт 08: ноги на полу"
У меня скольжение ушло совсем: тело стоит, двигается только ходьба. Прыжок модель взяла из видео, полтора метра вместо почти двух. Видеопамять упала с гигабайта до 256 МБ. Отчёт был отличный, все тесты зелёные.
Баг, которого не видят тесты
А потом я запустил бой в обычном Chrome, и бойцы начали размножаться: две-три копии Бай Лянь сразу, прямоугольные куски чужих кадров, иногда Тие Ху становился чёрным силуэтом. Автотесты этого не видели, потому что шли без видеокарты, в программной отрисовке. При этом баг был виден на листе кадров, который модель собрала сама и написала «проверено».
После промпта 08 в обычном Chrome с видеокартой.
Обязательно посмотри бой в обычном Chrome после промпта 08. Если бойцы размножаются или стоят друг в друге, отправь промпт ниже и приложи скриншоты. Если всё чисто, пропусти его.
новый чат. прочитай AGENTS.md и свой отчёт о прошлом круге (он в docs/) - прошлый круг был про стопы, прыжок и KTX2. стопы и прыжок отличные, скольжения больше нет.
но бой сейчас сломан, в него нельзя играть. запустил обычный бой ИИ против ИИ в Chrome - бойцы размножаются. при ударах и попаданиях на экране 2-3 копии Бай Лянь одновременно, торчат прямоугольные куски других кадров атласа, иногда Тие Ху становится полностью чёрным силуэтом. скрины прикрепил. посмотри и свои листы кадров из прошлого круга: если это видно и там, значит ты пропустил.
похоже на две вещи сразу: шейдер, который собирает несколько кадров через максимум альфы (тогда каждый кадр виден целиком), и что-то с KTX2 (не тот кусок атласа или не та страница). но разберись сам.
что нужно:
- в любой момент на экране ровно одно тело бойца - без копий, обрывков и чёрных силуэтов
- переход между анимациями без призрака и без клонов, например короткая смена через близкий по позе кадр
- проверяй в настоящем Chrome с GPU, как у игроков, а не только в swiftshader. у тебя тесты идут в программном рендере, там это может выглядеть иначе
- добавь автотест, который ловит именно такое: на каждом кадре боя считает, сколько у бойца отдельных силуэтов (связных пятен альфы) и нет ли пикселей за пределами его рамки. должно быть одно пятно
- смотри листы сам и в увеличении - на мелком листе ты это пропустил
и пока ты там: бойцы теперь стоят друг в друге. после ударов их вообще не расталкивает, и Бай Лянь оказывается внутри Тие Ху. скольжения не хочу, но тела не должны перекрываться. держи дистанцию по видимым силуэтам, а если надо разойтись - пусть это будет короткий шаг назад или толчок в момент удара: коротко и с весом, а не езда.
скольжение ног, прыжок и отклик не сломай. в конце - лист кадров из настоящего Chrome и таблица до/после.
git add -A && git commit -m "промпт 09: одно тело"
У меня модель за полтора часа нашла пять причин сразу. Например, в сжатых текстурах была перевёрнута координата, и брался чужой кусок атласа. Новый тест шёл уже в настоящем Chrome с видеокартой: на каждом кадре боя одно связное тело. А когда тела перекрываются, боец делает короткий шаг назад вместо езды по полу.
После промпта 09: у каждого бойца одно тело в каждом кадре.
Как проверить: посмотри бой в обычном Chrome, на обычной скорости и в замедлении.
Бойцы чёткие, цвета костюмов как на исходных картинках
Ноги не скользят по полу после удара, в блоке и при нокдауне
Прыжок не выше роста бойца, голова остаётся в кадре