QML粒子系统-Emitter(1)

930 阅读5分钟

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


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


Emitter简介

发射器Emitter类型向粒子系统中发射逻辑粒子。这些粒子从发射器的位置发射,包含轨迹和寿命,但并没有可视化外观。

发射器会使用指定的初始化属性来发射逻辑粒子,并且至少需要一个渲染器ParticlePainter类型来使其可视化。在粒子寿命的任意时刻都可以使用影响器Affector类型来修改指定的属性,包括寿命lifespan属性。

另外,还有一个TrailEmitters类型,它是一种特殊类型的发射器,可以从其他逻辑粒子的位置发射粒子,该类型会在后面的内容中详细介绍。

Emitter类型属性

属性类型描述
accelerationStochasticDirection发射的粒子的起始加速度。
emitRatereal每秒发射的粒子数。
默认值是10个粒子每秒。
enabledbool如果设置为false,发射器将停止发射,直到它被设置为true。
默认值为true。
endSizereal粒子在生命末期的像素大小。大小将在粒子的生命周期内从这个值和size线性插值。如果endSize为-1,则粒子的大小将在初始大小时保持不变。
默认值是-1。
groupstring这是它将发射进去的逻辑粒子群。
默认值为""(空字符串)。
lifeSpanint以毫秒为单位的每个发射粒子的时间应该持续。
如果你不希望粒子在一段时间后自动死亡,例如你希望手动处理它们,将lifeSpan设置为Emitter.InfiniteLife。(无穷大)
超过或等于600000(10分钟)的寿命将被视为无限。寿命小于或等于0的粒子一开始是死亡的。
默认值是1000(1秒)。
lifeSpanVariationint粒子的寿命无论在哪个方向上都会相差这么多。
默认值为0。
maximumEmittedint发射体在同一时间内能够存活的最大粒子数。
这可以设置为性能优化(当使用突发和脉冲时)或交错排放。
如果这个数值设置为0以下,那么这个发射器可以有活粒子的数量就没有最大限制。
默认值为-1。
shapeShape这个形状应用于发射器的大小。粒子将从该形状覆盖的任何区域随机发射。
默认形状是一个填充的矩形,它对应于发射器的完整边界框。
sizereal粒子的大小,以像素为单位在它们的生命之初。
默认值是16。
sizeVariationreal粒子的大小可以从size/endSize上下变化这么多。对单个粒子的size和endSize进行相同的随机添加。
默认值为0。
startTimeint如果这个值是在发射器加载时设置的,那么它将从过去发射粒子,直到startTime毫秒以前。这些将模拟如果他们当时发射,但不会有任何影响应用到他们。影响者将从现在起生效。
systemParticleSystem这是发射器将发射到的粒子系统。如果发射器是ParticleSystem的直接子元素,这可以省略。
velocityStochasticDirection粒子发射的起始速度。
velocityFromMovementqreal如果这个值是非零,那么发射器的任何运动都会根据运动为粒子提供额外的开始速度。额外的矢量将与发射器的运动相同的角度,其大小是发射器运动的大小乘以velocityFromMovement。
默认值为0。

Emitter类型信号

  • emitParticles(Array particles)

当粒子被发射时,这个信号被发射。particles是一个JavaScript的粒子对象数组。可以在处理程序中直接修改粒子属性。

注意:JavaScript执行速度较慢,所以不建议在大容量粒子系统中使用它。

注意:对应的处理程序是onEmitParticles。

Emitter类型函数

  • burst(int count, int x, int y)

立即从该发射器发射由计数指定的粒子数。粒子被发射,就像发射器被放置在(x, y),但所有其他属性都是相同的。

  • burst(int count)

立即从该发射器发射由计数指定的粒子数。

  • pulse(int duration)

如果发射器未启用,则在指定的持续时间内启用它(以毫秒为单位),然后将其关闭。

简单使用

编写代码

将前面ParticleSystem的代码中Emitter发射器的代码进行如下修改。

    ItemParticle {
        system: particles
        delegate:
            Text {
                id: txt
                text: qsTr("♥")
                font.pixelSize: 28
                color: "red";
            }
    }

    Emitter {
        system: particles;
        x: 100; width: 500

        emitRate: 20                                            
        lifeSpan: 2000                                          
        size: 16                                                
        endSize: 20                                             
        sizeVariation: 6                                        
        lifeSpanVariation: 1000                                 
        velocity: PointDirection {y:100; yVariation: 50; }      
    }
  • emitRate: 20设置发射速度为每秒20颗粒子
  • lifeSpan: 2000设置每个粒子生存时间2秒,这里的时间单位是毫秒。
  • size: 16设置发射粒子时初始时粒子大小为16px
  • endSize: 20粒子大小是可变的,末期时粒子大小变成了20px
  • sizeVariation: 6粒子之间的大小差异
  • lifeSpanVariation: 1000同一个方向上的粒子寿命差异为1秒
  • velocity: PointDirection {y:100; yVariation: 50; } 设置发射粒子的初始速度为沿y轴正方向,即画面中的从上往下。

效果

emitter.gif