• Nikitos's avatar
    Пивот спрайта, nine-slice и анимация тайлов
    · db8b8b59
    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