Как обычно, я ищу простейшее решение, которое соответствует моим потребностям, и я нашел его.
Я создал класс TilesetEngine, который загружает плитки в QImages (потому что это так просто), обрабатывает их и затем преобразует их в QPixmaps, где они разбиваются на отдельные тайлы и кэшируются в памяти для скорости (льготы крошечных простых тайлов 8x8, нет места для памяти). Движок позволяет вам напрямую запросить номер кадра, и он будет отображать изображение stati c с анимированными плитками, соответствующими запрошенному номеру кадра.
Это была сложная часть, потому что было довольно много обработки и постобработка, но на этом пути я создал QQuickImageProvider, который служит своего рода свободным мостом и допускает дополнительные параметры в «id», такие как указание размера масштаба в id, так как Qt Quick не вызывал const QSize& requestedSize
. Это было довольно легко сделать.
После регистрации в QML я просто перетаскиваю одну строку идентификатора, строка идентификатора задает все параметры того, как я хочу, чтобы движок отображал набор плиток из кадра анимации, определенные наложения , то есть набор плиток и т. д. c ... и строка идентификатора также сообщает провайдеру, хочу ли я масштабировать его, или я хочу получить все изображение набора плиток или только один идентификатор плитки. Это было очень легко и очень весело.
Затем, для большего удовольствия, я включил таймер в QML и запросил все кадры в анимации один за другим, и у него было l oop. Здесь я мог наблюдать, как анимация и набор плиток или плиток оживают и оживляют.
Все это было очень просто, легко и доставило массу удовольствия. Единственной трудной частью был движок, который получил реальные преимущества в манипулировании пикселями, но QImage, QPaint, QPixelmap и QColor взяли на себя большую часть работы, так что это могло бы быть сложнее, если бы не классы удобства Qt.
Я так рад, что никогда не искажал ничего из OpenGL или моего первоначального плана, QQuickItem или QQuickPainted Item. Это решение было идеальным и простым и подходит для всего, что мне нужно,