標籤:ext qt quick sprite 數值 ima 檔案 resource eva
Qt行動裝置 App開發(四):應用粒子特效
上一篇文章介紹了Qt Quick是如何對幀動畫進行支援的。幀動畫的實現離不開狀態機器、而狀態機器、動畫和狀態切換(transitions)則是Qt架構的核心內容。也就是說它們能夠建立在不論什麼一個QObject對象中而不必非得依賴Qt的不論什麼圖形顯示模組。拿一個範例說吧。假設你想實現背景音樂的平滑過渡,你能夠不用寫多餘的代碼。將背景音樂的音量作一下動畫插值就能夠達到效果了。其實我製作的遊戲《吃藥了》就是這麼實現效果的。
而這一篇文章將要聚焦的是Qt Quick另外一個很強大的系統——粒子系統。
原創文章,反對未聲明的引用。原部落格地址:http://blog.csdn.net/gamesdev/article/details/34114501
得益於Qt Quick對粒子系統的理解和抽象,我們能夠使用粒子系統製作出非常多強大的特效,儘管官方給出的範例僅僅有2D的粒子,可是我們能夠通過自己定義頂點著色器和片斷著色器來讓它支援3D的範例特效。
以下是Qt內建的粒子系統示範程式:
而製作一個這麼美輪美奐的粒子系統效果也不難。
接下來我們就建立一個簡單的項目來看看:
import QtQuick 2.2import QtQuick.Controls 1.1import QtQuick.Particles 2.0ApplicationWindow { 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行動裝置 App開發(四):應用粒子特效