Qt移动应用开发(四):应用粒子特效

上一篇文章介绍了Qt Quick是如何对帧动画进行支持的。帧动画的实现离不开状态机、而状态机、动画和状态切换(transitions)则是Qt框架的核心内容。也就是说它们能够建立在不论什么一个QObject对象中而不必非得依赖Qt的不论什么图形显示模块。拿一个样例说吧。假设你想实现背景音乐的平滑过渡,你能够不用写多余的代码。将背景音乐的音量作一下动画插值就能够达到效果了。其实我制作的游戏

recrefer=SE_D_%E5%90%83%E8%8D%AF%E4%BA%86#btn-install-now-log">《吃药了》就是这么实现效果的。

而这一篇文章将要聚焦的是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度方向飞行。细菌和胶囊消除后会出现粉碎的特效;以及背景中胶囊浮空的特效。这些都用到了粒子效果。

其实好的粒子特效能够让玩家眼前一亮。也能够达到某种程度的快感。

articleid=34114501">本文參加了CSDN博文大赛,请大家支持我。为我投一票!

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

  1. 【Qt编程】基于Qt的词典开发系列<四>--无边框窗口的缩放与拖动

    在现在,绝大多数软件都向着简洁,时尚发展.就拿有道的单词本和我做的单词本来说,绝大多数用户肯定喜欢我所做的单词本(就单单界面,关于颜色搭配和布局问题,大家就不要在意了). 有道的单词本: 我所做的单词 ...

  2. 【Qt编程】基于Qt的词典开发系列<十四>自动补全功能

    最近写了一个查单词的类似有道词典的软件,里面就有一个自动补全功能(即当你输入一个字母时,就会出现几个候选项).这个自动补全功能十分常见,百度搜索关键词时就会出现.不过它们这些补全功能都是与你输入的进行 ...

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

    粒子特效 粒子特效的原理是将若干粒子无规则的组合在一起.来模拟火焰,爆炸.水滴,雾气等效果. 要使用粒子特效首先要创建,在hierarchy视图中点击create--particle system就可 ...

  4. 快速全面了解QT软件界面开发技术

    快速全面了解QT软件界面开发技术     目录 前言 一. 学习QT可能的目的是什么? 只想体验一下QT? 当前的项目选择了用QT. 为将来做QT技术储备. 二. QT的核心技术优势是什么? QT在软 ...

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

    刚好前几天有人问我这个问题,再加上新项目也可能用,所以这两天就研究了一下.其实如果粒子特效 和3D模型 都用RenderTexture来做的话就不会有裁切的问题,但是粒子特效用RenderTextur ...

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

    本文讲一讲界面设计,作品要面向用户,界面设计的好坏直接影响到用户的体验.现在的窗口设计基本都是扁平化的,你可以从window XP与window 8的窗口可以明显感觉出来.当然除了窗口本身的效果,窗口 ...

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

    我设计的词典不仅可以实现在线查单词,而且一个重大特色就是具有丰富的本地词典库:我默认加入了八个类型的词典,如下所示: 由于是本人是通信专业,因此加入了华为通信词典.电子工程词典,又由于我喜爱编程,也加 ...

  8. [原][粒子特效][spark]深入浅出osgSpark

    背景: 目前我使用的spark粒子特效库是2.0 这个库好像是原来鬼火引擎的一部分,需要从github上找 现在我要将其使用到我自己开发的基于osgearth开的三维地图引擎中 步骤: 1.编译spa ...

  9. Unity中的粒子特效的 RendererQ 排序

    这里接https://www.cnblogs.com/luguoshuai/p/10021660.html 这里介绍两套粒子排序的方法. 首先声明,这两套排序方法均不是本人所写,是在项目开发的过程当中 ...

随机推荐

  1. 基于纯注解的spring开发的介绍

    几个核心注解的介绍1.@Configuration它的作用是:将一个java类修饰为==配置文件==,在这个java类进行组件注册1package com.kkb.config; import org ...

  2. vue.js中的表单radio,select,textarea的v-model属性的用法

    只要是表单元素,其值已经不会再用value来定义了,但是placeholder还是可以用来设置默认值. section1--input:type="text" type=" ...

  3. Spring Data Redis入门示例:字符串操作(六)

    Spring Data Redis对字符串的操作,封装在了ValueOperations和BoundValueOperations中,在集成好了SPD之后,在需要的地方引入: // 注入模板操作实例 ...

  4. Yii1 获取当前请求的url

    echo Yii::app()->getRequest()->getUrl();

  5. Mybatis 头信息

    在使用IDEA开发中,如果不使用Mybatis-Generator时,那么就需要手写Mapper文件,而在创建xml文件时无法直接创建带有mybatis头信息的mapper文件,这里来记录一下Myba ...

  6. 常见的网络命令--ping.hostname

    hostname命令 作用:显示以及设置主机名 一.  显示系统主机名 第一种方式:hostname 第二种方式:cat /etc/sysconfig/ntework 使用举例: 从上面可以看到我的系 ...

  7. MySQL连接使用及分类

    SQL连接 SQL 连接(JOIN)子句用于将数据库中两个或者两个以上表中的记录组合起来.连接通过共有值将不同表中的字段组合在一起. 考虑下面两个表,(a)CUSTOMERS 表:+----+---- ...

  8. mysql EXPLAIN Join Types 手册解释 及数据实操

     第一部分:名称解释 文档地址 https://dev.mysql.com/doc/refman/5.7/en/explain-output.html EXPLAIN Join Types: The ...

  9. MySQL教程之存储过程与函数

    存储程序分为存储过程和函数 可以使用CALL来调用存储过程,只能输出变量返回值.存储过程可以调用其他存储过程 函数可以从语句外调用,也能返回标量值 什么是存储过程? 简单的说,就是一组SQL语句集,功 ...

  10. Java关于条件判断练习--统计一个src文件下的所有.java文件内的代码行数(注释行、空白行不统计在内)

    要求:统计一个src文件下的所有.java文件内的代码行数(注释行.空白行不统计在内) 分析:先封装一个静态方法用于统计确定的.java文件的有效代码行数.使用字符缓冲流读取文件,首先判断是否是块注释 ...