1. 程式人生 > >Qt移動應用開發(四):應用粒子特效

Qt移動應用開發(四):應用粒子特效

ons -i 遊戲 direct mit class png pop 狀態

Qt移動應用開發(四):應用粒子特效

上一篇文章介紹了Qt Quick是如何對幀動畫進行支持的。幀動畫的實現離不開狀態機、而狀態機、動畫和狀態切換(transitions)則是Qt框架的核心內容。也就是說它們能夠建立在不論什麽一個QObject對象中而不必非得依賴Qt的不論什麽圖形顯示模塊。拿一個樣例說吧。假設你想實現背景音樂的平滑過渡,你能夠不用寫多余的代碼。將背景音樂的音量作一下動畫插值就能夠達到效果了。其實我制作的遊戲《吃藥了》就是這麽實現效果的。

而這一篇文章將要聚焦的是Qt Quick另外一個很強大的系統——粒子系統。

原創文章,反對未聲明的引用。原博客地址:

http://blog.csdn.net/gamesdev/article/details/34114501

得益於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移動應用開發(四):應用粒子特效