После того, как по спрайтам было написано три урока, от их рисования , до их практического применения в Qt в этой и этой статьях, считаю, что нельзя пройти мимо применения спрайтов в QML Qt .
Спрайты в QML применяются ещё проще, чем в Qt/C++, поскольку в QML имеются классы, которые специально созданы для работы со спрайтами: Sprite и AnimatedSprite.
Структура проекта для работы со Sprite и AnimatedSprite
Проект создаётся как стандартный проект QtQuick with controls, после чего я выкидываю всю лишнее, типо менюбара и кнопок. Оставляю только то, что мы будем использовать для демонстрации.
- main.cpp - основной файл проекта, в котором запускается qml файл;
- main.qml - окно приложения;
- MainForm.ui.qml - форма для работы с дизайнером;
- sprite_sheet.png - изображение нашего спрайта.
sprite_sheet.png
main.qml
Поскольку сам по себе урок достаточно простой, то остановлюсь на программном коде только этого файла.
В данном уроке предлагаю два варианта применения спрайтов. Один вариант - это применение с помощью SpriteSequence, в который можно помещать различные спрайты, с различными источниками. А второй вариант - это с использованием AnimatedSprite, в котором берётся один источник. Оба варианта применения спрайтов в данном уроке дадут одинаковый результат.
В SpriteSequence задаётся размер спрайта и его положение в главном окне приложения, тогда как размер кадра спрайта и количество его кадров задаётся уже в объекте Sprite, который помещается в SpriteSequence. При этом в SpriteSequence можно поместить несколько таких объектов Sprite.
В случае с AnimatedSprite все параметры размеров и местоположения, а также размеров кадра и его количества задаются в самом AnimatedSprite. Разница в том, что в качестве источника спрайтов может быть взят только один файл.
Также необходимо указать параметр frameSync как true. Тогда спрайты будут работать синхронно, если этого не сделать, то они будут работать медленно и поочерёдно.
- import QtQuick 2.5
- import QtQuick.Controls 1.4
- import QtQuick.Dialogs 1.2
- ApplicationWindow {
- visible: true
- width: 640
- height: 480
- title: qsTr("Hello World")
- MainForm {
- // Растягиваем форму главного окна по всему окну приложения
- anchors.fill: parent
- /* Объект последовательности спрайтов
- * В данном объекте можно задавать различные спрайты
- * с различными картинками и их последовательноть
- * */
- SpriteSequence {
- id: image
- width: 20 // Ширина области под спрайт
- height: 20 // Высота области под спрайт
- // Спрайт находится слева вверху окна приложения
- anchors.left: parent.left
- anchors.leftMargin: 100
- anchors.top: parent.top
- anchors.topMargin: 100
- // Сам объект спрайта
- Sprite {
- id: sprite
- // Источник, спрайтовая картинка
- source: "sprite_sheet.png"
- frameCount: 15 // Количество кадров
- frameWidth: 20 // Ширина фрейма
- frameHeight: 20 // Высота фрейма
- frameSync: true // Синхронизация
- }
- }
- AnimatedSprite {
- id: animatedSprite
- width: 20 // Ширина области под спрайт
- height: 20 // Высота области под спрайт
- // Спрайт находится справа вверху окна приложения
- anchors.right: parent.right
- anchors.rightMargin: 100
- anchors.top: parent.top
- anchors.topMargin: 100
- // Источник, спрайтовая картинка
- source: "sprite_sheet.png"
- frameCount: 15 // Количество кадров
- frameWidth: 20 // Ширина фрейма
- frameHeight: 20 // Высота фрейма
- frameSync: true // Синхронизация
- }
- }
- }
Итог
В результате Вы получите приложение в левом и правом углу которого будут располагаться одинаково работающие спрайты взрывов. Демонстрация приложения приведена в видеоуроке, также в видеоуроке показаны варианты поведения спрайтов при неправильной настройке.