QML粒子系统-ParticleSystem

825 阅读3分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第 3 天,点击查看活动详情


📒博客首页:何名取 的个人主页 - 文章 - 掘金 (juejin.cn)
🎉欢迎关注🔎点赞👍收藏⭐️留言📝
❤️ 期待一起交流!
🙏作者水平很有限,如果发现错误,求告知,多谢!
🌺有问题可私信交流!!!


ParticleSystem介绍

ParticleSystem是一种包括渲染器、发射器和影响器类型的系统。

ParticleSystem类型用来将其他粒子系统中的类型关联在一起,并管理它们共享的时间线。渲染器、发射器、影响器必须使用相同的ParticleSystem,从而实现它们之间的交互。可以同时创建多个ParticleSystem,以及各自的渲染器、发射器和影响器,这样可以保证逻辑分离的情况下来使用多个粒子系统实现不同的特效。

ParticleSystem类型主要用来对整个粒子系统的运行进行整体控制,比如paused属性和running属性分别用来控制模拟的暂停和开始,相应的还有一些控制函数,如pause()、reset()、restart()、resume()、start()和stop()等。

Properties属性

  • empty : bool
  • particleStates : list<Sprite>
  • paused : bool
  • running : bool

empty : bool

当系统中没有存活的粒子时,Empty被设置为true。

可以使用这个暂停系统,让它不再花费任何时间更新,但需要恢复它,以便系统产生额外的粒子。

要清除系统中的所有粒子,使用生命影响器。

particleStates : list<Sprite>

可以在这个属性中定义粒子群的一个子集,以便为它们提供随机状态转变。

这个列表中的每个QtQuick::Sprite都被解释为与具有相同名称的粒子组相对应。在这些精灵中定义的任何过渡也会对粒子组产生影响。此外,在其中一个精灵中定义的TrailEmitters、Affectors和ParticlePainters会自动与相应的粒子组相关联。

paused : bool

如果暂停设置为true,粒子系统将不会推进模拟。当暂停再次被设置为false时,模拟将从暂停的同一点继续。

如果检测到没有剩余的活动粒子,模拟将自动暂停,当新的活动粒子被添加时,将重新暂停。

它也可以通过pause()和resume()方法来控制。

running : bool

如果将running设置为false,粒子系统将停止模拟。当系统重新启动时,所有的粒子都会被摧毁。

它也可以用start()和stop()方法来控制。

方法函数

  • pause()
  • reset()
  • restart()
  • resume()
  • start()
  • stop() pause()
    如果正在运行,则暂停模拟。

reset()
丢弃所有当前存在的粒子。

restart()
如果模拟正在运行,则停止它,然后再启动它。

resume()
如果暂停,则恢复模拟。

start()
如果还没有运行,则启动模拟。

stop()
如果正在运行,则停止模拟。

实战使用

编写代码

import QtQuick 2.2
import QtQuick.Particles 2.0
import QtQuick.Controls 1.1

Rectangle {
    id: root; width: 300; height: 300; color: "black"
    Button {
        text: "开始"; y:0;
        onClicked:{
            particles.start()
            runText.text = "running:"+particles.running
            pauseText.text = "paused:"+particles.paused
        }
    }
    Button {
        text: "暂停"; y:70;
        onClicked:{
            particles.pause()
            runText.text = "running:"+particles.running
            pauseText.text = "paused:"+particles.paused
        }
    }
    Button {
        text: "恢复"; y:140;
        onClicked:{
            onClicked: particles.resume()
            runText.text = "running:"+particles.running
            pauseText.text = "paused:"+particles.paused
        }
    }
    Button {
        text: "停止"; y:210;
        onClicked:{
            onClicked: particles.stop()
            runText.text = "running:"+particles.running
            pauseText.text = "paused:"+particles.paused
        }
    }
    Button {
        text: "重启"; y:280;
        onClicked:{
            onClicked: particles.restart()
            runText.text = "running:"+particles.running
            pauseText.text = "paused:"+particles.paused
        }
    }
    Button {
        text: "重置"; y:350;
        onClicked:{
            onClicked: particles.reset()
            runText.text = "running:"+particles.running
            pauseText.text = "paused:"+particles.paused
        }
    }

    Button {id: runText; x:200; text:"running:"+particles.running}
    Button {id: pauseText; x:400; text:"paused:"+particles.paused}



    ParticleSystem { id: particles; running: false}

    ItemParticle {
        system: particles
        delegate:
            Rectangle{
            id: rect; width: 10; height: 10;
            color: "red"; radius: 10
        }
    }

    Emitter {
        system: particles; x: 100; width: 200
        velocity: PointDirection {y:300; yVariation: 100; }
    }
}

运行效果

image.png

  • 初始画面 初始画面上没有任何粒子存在,running和paused标志位都为false。
  • 开始 点击开始按钮,running标志位变为true,paused标志位变为false。
  • 暂停 点击暂停按钮,paused标志位变为true。
  • 恢复 点击恢复按钮,paused标志位变为false。
  • 停止 点击停止按钮,running标志位变为true。
  • 重启 点击重启按钮,running标志位变为true,paused标志位变为false。
  • 重置 点击重置按钮,会清空所有粒子。

image.png