zoukankan      html  css  js  c++  java
  • Qt移动应用开发(四):应用粒子特效

    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
         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博文大赛,请大家支持我。为我投一票!

  • 相关阅读:
    42.接雨水 Trapping Rain Water
    6.Zigzag Z 字形变换
    级数求和
    三连击(两个for循环轻松搞定)
    经济学人:Facebook的第三幕(1)
    markdown编辑器
    QUERY
    在badi中按照正常的message x…
    建workflow的时候提示Prefix …
    ALV控件的简单案例(一)
  • 原文地址:https://www.cnblogs.com/yxysuanfa/p/7156262.html
Copyright © 2011-2022 走看看