指定随机粒子起始颜色没有动画更改?

时间:2013-11-06 13:22:27

标签: objective-c sprite-kit skemitternode

有没有办法让粒子根据当前的“颜色渐变”以随机的每粒子颜色生成?颗粒在其使用寿命期间不会改变颜色,只是在出生时沿着“颜色渐变”的某处分配颜色,并保持颜色直到它们死亡。

这样做的结果是出生时的颗粒混合,从RED到蓝色的混合颜色。

Color Blend

在我的测试中,我似乎只能得到粒子产生为RED的行为,然后逐渐转向BLUE作为接近屏幕的底部。

enter image description here Falling Leaves

2 个答案:

答案 0 :(得分:8)

好吧,看起来您无法为sks使用预定义的SKEmitterNode文件...我能够通过编程方式创建SKEmitterNode来解决这个问题。原因是因为当您使用SKEmitterNode发起sks时它看起来不像,但它不会响应setParticleColor:,但会以编程方式启动它。

今天,过去一个小时,这是我第一次搞乱SKEmitterNode,所以你不得不忍受我,因为我无法弄清楚如何让雪效果完美,但我确定你可以搞砸SKEmitterNode允许你改变的值。

无论如何,我将假设SKEmitterNode出现在SKScene上(这是我知道如何获得所需效果的唯一方式)。

首先,您需要让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];
}

所以我在这里所做的是以编程方式创建粒子效果,这是您将更改动画/速度/等变量以获得您正在寻找的最佳粒子效果的位置。 我建议reading this了解更多详情。


现在还记得我是怎么说它需要在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值,但我会让您自己选择颜色。


作为回报,这是我的代码产生的:

enter image description here


所有这一切都说,不幸的是,看起来你不能仅仅使用粒子界面就能得到你想要的效果。

答案 1 :(得分:0)

我发现无需向 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 文件加载,然后颜色属性被类覆盖。