-
Nikitos создал
Три пункта «дешёвого P1» (docs/TASKS.md §1.6): ноги персонажа должны оставаться на месте при вращении, рамки интерфейса — тянуться, вода и факелы — течь. * .pivot(x, y) и .pivotAt(x, y): точка вращения и масштаба. Спрайт в C вращается вокруг центра своего прямоугольника, поэтому движок сдвигает прямоугольник так, чтобы пивот оказался в точке узла. Без пивота сдвига нет — поведение прежнее, кадры совпадают побитово; * .slice(insets) — nine-slice: девять частей, углы целые, края тянутся, центр заполняет. Толщина 0..1 — доля стороны, больше 1 — пиксели; при нехватке места полосы ужимаются. Части кэшируются (regionSprite), поворот применяется к каждой части; * .tileset({ frames, fps|interval, ids, random, offset }) — анимация тайлов: кадры идут строками листа, время берётся из tickTilemap (игровое, поэтому пауза и --fixed-dt работают), геттер .tileAnimation(). Рисуются только тайлы в видимом диапазоне камеры, новые текстуры не создаются; * тест нашли баг: отрицательное время (сдвиг фазы) давало отрицательный индекс кадра — приведено к неотрицательному остатку. Проверка: tests/agent/highlevel_sprite_test.py (15 проверок: пивот меняет кадр и возвращается к исходному, nine-slice, ход времени анимации), tests/js/tile_anim_test.mjs (8 проверок чистых функций), полный набор qjs и агентских тестов зелёный.db8b8b59