Для создания спрайтовой анимации нам потребуются последовательность спрайтов, зашитых в один файл. Возьмем для примера такой: Создадим новый QML-элемент Sprite: import QtQuick 1.0 Item{ id:spriteAnimation
property int framesHorizontCount:0 // колличество спрайтов по горизотали property int framesVerticalCount:0 // колличество спрайтов по вертикали property int framesCount:(framesHorizontCount*framesVerticalCount) // кол-во спрайтов в файле property int currentFrame:0 // текущий спрайт при анимации property string sourcePath:"" // местонахождении файла со спрайтами property int animationSpeed:0 // скорость анимации x:0 y:0 z:0 clip:true height:spriteAnimationImage.height/framesVerticalCount width:spriteAnimationImage.width/framesHorizontCount // размер одного спрайта Image{ // выводимый на эран спрайт id:spriteAnimationImage source:sourcePath x:-((spriteAnimation.currentFrame*spriteAnimation.width) -Math.floor(spriteAnimation.currentFrame/spriteAnimation.framesHorizontCount) *(spriteAnimation.framesHorizontCount*spriteAnimation.width)) y:-(Math.floor(spriteAnimation.currentFrame/spriteAnimation.framesHorizontCount)*spriteAnimation.height) // координаты текущего спрайта } }
Теперь в основной программе создаем и инициализируем новый спрайт: Sprite{ id:explosion
framesHorizontCount:15 framesVerticalCount:1 framesCount:(framesHorizontCount*framesVerticalCount) currentFrame:-1 sourcePath:"MEDIA/explosion.png" animationSpeed:40 x:0 y:0 }
Далее - создаем таймер для анимации: Timer{ id:explosionTimer interval:explosion.animationSpeed running:false repeat:true
onTriggered:{ explosion.currentFrame++ if (explosion.currentFrame==explosion.framesCount){ explosionTimer.stop() } } }
Ну и для примера будем выводить анимированный взрыв в месте клика мышкой: MouseArea { anchors.fill: parent onClicked: { explosion.x=mouseX-explosion.width/2 explosion.y=mouseY-explosion.height/2 explosion.currentFrame=-1 explosionTimer.start() } }
Получаем что-то типа такого:
Рабочий пример можно скачать тут:
qml.ucoz.com
|