有没有办法根据当前的“颜色渐变”让粒子以随机的每个粒子颜色生成?粒子在其生命周期内不会改变颜色,它们只是在出生时从“颜色斜坡”的某个地方分配一个颜色,并保持该颜色直到它们死亡。
这样做的结果将是在出生时混合了从红色到蓝色的混合颜色的粒子。

在我的测试中,我似乎只能获得粒子以红色生成,然后在接近屏幕底部时逐渐变为蓝色的行为。

有没有办法根据当前的“颜色渐变”让粒子以随机的每个粒子颜色生成?粒子在其生命周期内不会改变颜色,它们只是在出生时从“颜色斜坡”的某个地方分配一个颜色,并保持该颜色直到它们死亡。
这样做的结果将是在出生时混合了从红色到蓝色的混合颜色的粒子。

在我的测试中,我似乎只能获得粒子以红色生成,然后在接近屏幕底部时逐渐变为蓝色的行为。

好吧,看起来你不能使用预定义的sks文件SKEmitterNode......我能够通过以编程方式创建SKEmitterNode. 原因是因为它看起来不像当你SKEmitterNode用 an启动时sks,它不会响应setParticleColor:但以编程方式启动它。
现在,今天,过去的一个小时,是我第一次弄乱 SKEmitterNode,所以你必须忍受我,因为我不知道如何让雪效果完美,但我相信你可以混乱的价值观SKEmitterNode允许你改变。
在任何情况下,我都会假设SKEmitterNodeSKScene 上显示了 (这是我知道如何获得所需效果的唯一方法)。
首先,您需要使您SKEmitterNode成为全局/属性/等,因为您稍后需要访问它。
在MyScene.m:
@implementation MyScene {
SKEmitterNode* leafEmitter;
}
-(id)initWithSize:(CGSize)size {
leafEmitter = [[SKEmitterNode alloc] init];
[leafEmitter setParticleTexture:[SKTexture textureWithImageNamed:@"saFMB.png"]];
[leafEmitter setParticleBirthRate:10];
[leafEmitter setScale:0.5];
[leafEmitter setYAcceleration:-10.0];
[leafEmitter setParticleSpeedRange:100];
[leafEmitter setParticleLifetimeRange:100.0];
[leafEmitter setParticlePositionRange:CGVectorMake(self.size.width, self.size.height)];
[leafEmitter setPosition:CGPointMake(100, 400)];
[leafEmitter setParticleBlendMode:SKBlendModeAlpha];
[self addChild:leafEmitter];
}
所以我在这里所做的是以编程方式创建粒子效果,在这里您将更改动画/速度/等变量以获得您正在寻找的最佳粒子效果。我建议阅读此内容以获取更多详细信息。
现在还记得我说过它需要在 SKScene 上呈现吗?那是因为我们将update:(CFTimeInterval)currentTime利用SKScene.
在里面update:(CFTimeInterval)currentTime是我们将改变SKEmitterNode颜色的位置。由于每帧都会调用此更新函数,因此无需任何花哨的计时器等即可轻松更改颜色。不确定这是否是一个好主意,但重要的是这个主意。
-(void)update:(CFTimeInterval)currentTime {
[leafEmitter setParticleColor:[UIColor colorWithHue:drand48() saturation:1.0 brightness:1.0 alpha:1.0]];
[leafEmitter setParticleColorBlendFactor:1.0];
/* Called before each frame is rendered */
}
在这种情况下,我们将颜色更改为随机 RGB 值,但我会让您自己选择颜色。
作为回报,这是我的代码产生的:

综上所述,不幸的是,仅使用粒子界面似乎无法获得想要的效果。
我发现不需要向 update() 函数添加代码的工作就是将以下更改应用于发射器。
@john-riselvato 是正确的(即使是现在,7 年后)使用编辑器来定义它,但是您可以使用以下代码获得所需的效果:
import Foundation
import SpriteKit
class RandomColorEmitterNode : SKEmitterNode {
override init() {
super.init()
self.particleColorSequence = nil
self.particleColorBlendFactorSequence = nil
self.particleColorBlueRange = 255
self.particleColorGreenRange = 255
self.particleColorRedRange = 255
}
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
self.particleColorSequence = nil
self.particleColorBlendFactorSequence = nil
self.particleColorBlueRange = 255
self.particleColorGreenRange = 255
self.particleColorRedRange = 255
}
}
这样,只需简单调用:
if let emitter = RandomColorEmitterNode(fileNamed: "flower.sks") {
self.addChild(emitter)
}
发射器最初是从您在编辑器中创建的 SKS 文件加载的,然后颜色属性被类覆盖。