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移动应用开发(四):应用粒子特效

时间: 2024-10-12 06:25:11

Qt移动应用开发(四):应用粒子特效的相关文章

【Unity 3D】学习笔记四十二:粒子特效

粒子特效 粒子特效的原理是将若干粒子无规则的组合在一起,来模拟火焰,爆炸,水滴,雾气等效果.要使用粒子特效首先要创建,在hierarchy视图中点击create--particle system即可 粒子发射器 粒子发射器是用于设定粒子的发射属性,比如说粒子的大小,数量和速度等.在创建完粒子对象后,在右侧inspector视图中便可以看到所有的粒子属性: emit:是否是使用粒子发射器. min size:粒子最小尺寸. max size:粒子最大尺寸. min energy:粒子的最小生命周期

Qt移动应用开发(五):场景切换

上篇文章讲到了如何用QtQuick实现绚丽的粒子特效.粒子特效的出现可以说给了开发人员一个个性化界面开发的一个契机,以后可以创造出更多有趣的界面出来,并适配到Android.iOS等移动平台上,从而让你的程序变得更加有趣! 原创文章,反对未声明的引用.原博客地址:http://blog.csdn.net/gamesdev/article/details/34840415 这一次我将介绍我在实际应用开发的时候是如何实现场景的切换的.场景的切换问题是一个架构上的问题,有很多的实现方式,而Qt Qui

一个3D粒子特效编辑器(Particle Universe For Torchlight)

地址:https://code.csdn.net/langresser/particleuniversefortorchlight      在Bin文件夹有编译好的版本,装个vc2013的运行时库就可以直接运行了. 因为cocos2d-x没有3D粒子特效,所以主程就把OGRE和ParticleUniverse给加到项目中.我第一眼看的时候以为很牛,但是现在回过头来看,能加快开发进度和简化开发难度的才是真的牛.而PU的加入不是牛而是坑,因为特效看了一个多月,说不会用...... 于是我决定来填这

Qt Quick应用开发介绍 1-5

Qt Quick应用开发介绍 Introduction to Application Development with Qt Quick Release 1.0 Chapter1 Introduction 介绍 1.1 谁应该阅读这份教程 本教程解释了Qt Quick应用开发的基础以及使用示例代码帮助全面了解; 教程包含标准Qt Quick文档和基础概念, API以及详细的源码信息; 本教程是为了新接触Qt Quick的你准备的, 虽然从基础开始, 但你还是要熟悉编程的概念, 有JavaScri

[GEiv]第六章:粒子特效 绚丽的火焰与爆炸

第六章:粒子特效 绚丽的火焰与爆炸 本章节主要介绍粒子特效设计的方法论,其中有相当的知识量是平台无关的:在本文中会以"爆炸"这个实际的例子为线索,进行详细的设计讲解,并最终使用GEiv实现它. [为什么要使用"粒子"] 实现粒子特效的首要目的,是对一些环境效果进行模拟仿真,常见的环境效果,例如火焰.爆炸.雨.雪.雾等,都是无数微小的粒子以某些规律共同作用的结果.而对于计算机来讲,虽然没有足够的运算能力对每一个自然粒子进行抽象,但我们可以借鉴其原理,使用相对更少的粒子

【Qt编程】基于Qt的词典开发系列<二>--本地词典的设计

我设计的词典不仅可以实现在线查单词,而且一个重大特色就是具有丰富的本地词典库:我默认加入了八个类型的词典,如下所示: 由于是本人是通信专业,因此加入了华为通信词典.电子工程词典,又由于我喜爱编程,也加入了c语言基本函数词典.下面介绍如何设计本地词典: 词典类型的选择 当然是txt格式的最好了,因为我们可以用程序直接进行读取.可是网上词典一般都是用mdx格式.ld2格式的,我无法用Qt来直接读取.最终,经过不断摸索,网上查找,发现我们可以将mdx格式的词典通过软件转化为txt格式的! mdx词典的

【Qt编程】基于Qt的词典开发系列<三>--界面美化设计

本文讲一讲界面设计,作品要面向用户,界面设计的好坏直接影响到用户的体验.现在的窗口设计基本都是扁平化的,你可以从window  XP与window 8的窗口可以明显感觉出来.当然除了窗口本身的效果,窗口中各种控件的特效也是特别重要的一环.下面讲讲我在词典软件中的一些设计:说到界面美化的设计,不得不提到美工,一个好的美工是想当的重要!软件毕竟少不了图标,而不懂美工的我,也就只能在网上使用别人的图标了. 如何得到网上的图标? 直接百度就可以了,当然还有另一种方法:就是从别人的文件中提取这些图标文件.

Mask裁切UI粒子特效或者3D模型

刚好前几天有人问我这个问题,再加上新项目也可能用,所以这两天就研究了一下.其实如果粒子特效 和3D模型 都用RenderTexture来做的话就不会有裁切的问题,但是粒子特效用RenderTexture来做会有显示的问题,所以还是得用摄像机.废话不多说了,进入正题. 原理就是把Mask的裁切区域传给粒子特效Shader,当超出这个区域那么直接让它完全透明即可.粒子特效的源生shader大家可以去unity官网下载,我在这里把需要修改的地方标注给大家. //add 注释中的内容就是我做修改的地方.

Unity中的粒子特效的 RendererQ 排序

这里接https://www.cnblogs.com/luguoshuai/p/10021660.html 这里介绍两套粒子排序的方法. 首先声明,这两套排序方法均不是本人所写,是在项目开发的过程当中,看到同事的设计,然后我就记录了下来了,作为后续的学习与使用. 方法一: 1 using System.Collections.Generic; 2 using UnityEngine; 3 4 public class UIRenderQueueSorter : MonoBehaviour 5 {