Qt移動應用開發(四):應用粒子特效
Qt移動應用開發(四):應用粒子特效
上一篇文章介紹了Qt Quick是如何對幀動畫進行支持的。幀動畫的實現離不開狀態機、而狀態機、動畫和狀態切換(transitions)則是Qt框架的核心內容。也就是說它們能夠建立在不論什麽一個QObject對象中而不必非得依賴Qt的不論什麽圖形顯示模塊。拿一個樣例說吧。假設你想實現背景音樂的平滑過渡,你能夠不用寫多余的代碼。將背景音樂的音量作一下動畫插值就能夠達到效果了。其實我制作的遊戲《吃藥了》就是這麽實現效果的。
而這一篇文章將要聚焦的是Qt Quick另外一個很強大的系統——粒子系統。
原創文章,反對未聲明的引用。原博客地址:
得益於Qt Quick對粒子系統的理解和抽象,我們能夠使用粒子系統制作出非常多強大的特效,盡管官方給出的樣例僅僅有2D的粒子,可是我們能夠通過自己定義頂點著色器和片斷著色器來讓它支持3D的樣例特效。
以下是Qt自帶的粒子系統演示程序截圖:
而制作一個這麽美輪美奐的粒子系統效果也不難。
接下來我們就創建一個簡單的項目來看看:
import QtQuick 2.2 import QtQuick.Controls 1.1 import QtQuick.Particles 2.0 ApplicationWindow { visible: true width: 640 height: 480 title: qsTr("測試粒子系統") menuBar: MenuBar { Menu { title: qsTr("文件") MenuItem { text: qsTr("退出") onTriggered: Qt.quit(); } } } ParticleSystem { anchors.centerIn: parent ImageParticle { source: "qrc:///particleresources/fuzzydot.png" colorVariation: 1.0 } Emitter { emitRate: 20 size: 10 lifeSpan: 4000 velocity: AngleDirection { magnitude: 100 angleVariation: 360 } } } Text { anchors.right: parent.right anchors.bottom: parent.bottom text: qsTr("本例用來測試粒子系統") } }
程序的效果截圖例如以下:
那麽從上面的演示程序我們能夠得知,一個粒子系統基本是由ParticleSystem、ImageParticle以及Emitter組成的。當中ParticleSystem不可缺少,由於這是要控制好各個粒子系統組件的必備類型。假設ParticleSystem是不作為Emitter的父類存在的話,那麽Emitter有一個成員system必需要指定ParticleSystem的id。Emitter也是一個不可缺少的類,它的作用是規定這些樣例以何種方式發射、以及規定粒子的大小和生命周期。而ImageParticle是ParticlePainter的子類,它不是必備的,我們能夠採用ParticlePainter的其他子類CustomParticle和ItemParticle來指定。它的作用是規定粒子的圖片以及旋轉、顏色、透明度等信息。
事實上在三者之外,另一個不可忽視的類。那就是Affector。一般來說,粒子在Emitter作用後會保持初始的速度、加速度和大小進行運動,此後這些數值不再受Emitter控制了,僅僅有Affector才幹控制粒子在執行過程中的數值大小。
這裏Affector僅僅是一個基類,在它的基礎上定義出來了非常多依據不同效果而定義的子類。比方說Age、Attractor、Friction、Gravity、GroupGoal、SpriteGoal、Turbulence和Wander。這裏我們拿出一個簡單的Affector——Gravity來繼續我們的實驗。
ParticleSystem { anchors.centerIn: parent ImageParticle { source: "qrc:///particleresources/fuzzydot.png" colorVariation: 1.0 } Emitter { emitRate: 20 size: 10 lifeSpan: 4000 velocity: AngleDirection { magnitude: 100 angleVariation: 360 } } Gravity { angle: 90 magnitude: 100 } }
演示程序的截圖例如以下:
能夠看到,通過指定Gravity的angle(下落的方向)以及magnitude(下落的加速度),我們能夠在粒子執行中控制粒子的各類參數。
在我的獨立遊戲《吃藥了》中也用到了各種粒子系統。比方說場景切換時候有大約6000個膠囊往右上角30度方向飛行。細菌和膠囊消除後會出現粉碎的特效;以及背景中膠囊浮空的特效。這些都用到了粒子效果。
其實好的粒子特效能夠讓玩家眼前一亮。也能夠達到某種程度的快感。
本文參加了CSDN博文大賽,請大家支持我。為我投一票!
Qt移動應用開發(四):應用粒子特效