Objective c 指定无动画更改的随机粒子开始颜色?

Objective c 指定无动画更改的随机粒子开始颜色?,objective-c,sprite-kit,skemitternode,Objective C,Sprite Kit,Skemitternode,有没有一种方法可以让粒子根据当前的“颜色渐变”生成随机的每粒子颜色?这些粒子在其生命周期内不会改变颜色,它们只是在出生时沿着“颜色渐变”的某个地方被分配一种颜色,并保持这种颜色直到它们死亡 这样做的结果将是出生时粒子与从红色到蓝色的混合颜色的混合 在我的测试中,我似乎只能得到粒子以红色繁殖,然后在接近屏幕底部时逐渐变成蓝色的行为 好吧,看来您不能为SKEmitterNode使用预定义的sks文件。。。我可以通过编程方式创建SKEmitterNode来解决这个问题。其原因是,当您使用sks启动

有没有一种方法可以让粒子根据当前的“颜色渐变”生成随机的每粒子颜色?这些粒子在其生命周期内不会改变颜色,它们只是在出生时沿着“颜色渐变”的某个地方被分配一种颜色,并保持这种颜色直到它们死亡

这样做的结果将是出生时粒子与从红色到蓝色的混合颜色的混合

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


好吧,看来您不能为
SKEmitterNode
使用预定义的
sks
文件。。。我可以通过编程方式创建
SKEmitterNode
来解决这个问题。其原因是,当您使用
sks
启动
SKEmitterNode
时,它看起来不像是对
setParticleColor:
做出响应,而是通过编程方式启动一个

今天,过去的这一个小时,是我第一次弄乱SKEmitterNode,所以你必须忍受我,因为我不知道如何使雪花效果完美,但我相信你可以弄乱
SKEmitterNode
允许你更改的值

在任何情况下,我都会假设
SKEmitterNode
出现在SKScene上(这是我知道如何获得所需效果的唯一方法)

首先,您需要将自己设置为
SKEmitterNode
全局/属性/etc,因为以后需要访问它


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];
}
因此,我在这里所做的是通过编程创建粒子效果,在这里您将更改动画/速度/etc变量,以获得您想要的最佳粒子效果。 我建议你提供更多细节


现在还记得我说过需要在现场展示吗?这是因为我们将利用
update:(CFTimeInterval)currentTime
函数,它与
SKScene
一起提供

更新中:(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文件加载的,然后颜色属性被类覆盖。

您不希望这些属性设置为屏幕底部的动画,但希望它们保持不变并更改颜色?@JohnRiselvato-使用颜色渐变,粒子将从红色(顶部)设置为蓝色(底部)。我所追求的是根本不让粒子以颜色设置动画,而是以恒定的颜色(从渐变)生成,然后在其整个生命周期内保持该颜色。就像秋天的树叶从树上落下一样,有些是绿色的,有些是黄色的,有些是橙色的,它们只是从它们各自的颜色开始落下(它们在落下时不会改变颜色)我使用雪作为原始颜色,然后将雪碧改为树叶(插图,添加上面的*.png)我认为问题在于颜色渐变只会随着时间的推移而起作用,所有粒子总是以红色开始(然后你可以选择从红色混合到蓝色),我认为这并不能让你在每个粒子的基础上指定一个固定的混合颜色(基于渐变)。嗨,John,谢谢你花时间和精力把这个答案放在一起。我知道你在做什么,我觉得不错,明天早上我会试一试。非常感谢,完美的答案。如果您将SKEmitterNode的'particleColorSequence'变量设置为nil,那么SKParticleColor将不再被忽略。创建SKS通常会将其设置为非nil,从而忽略其他颜色属性。