【问题标题】:Specify random particle start colour with no animated change?指定没有动画变化的随机粒子起始颜色?
【发布时间】:2013-11-06 13:22:26
【问题描述】:

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

这样做的结果是粒子在出生时就混合了从红色到蓝色的混合颜色。

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

【问题讨论】:

  • 您不希望它们动画到屏幕底部,而是留在原地并更改颜色?
  • @JohnRiselvato - 使用颜色渐变,粒子从红色(顶部)动画到蓝色(底部)。我所追求的根本不是让粒子以颜色动画,而是以恒定颜色(从渐变)生成,然后在其整个生命周期内保持该颜色。就像秋天的树叶从树上飘落一样,有的绿,有的黄,有的橙,只是从各自的颜色开始落下(落下时不会变色)
  • 我用的是雪原,然后把精灵改成了叶子(生病了,上面加*.png)
  • 我认为问题在于色带只会随着时间的推移而起作用,所有粒子总是从红色开始(然后你可以选择从红色混合到蓝色)我不认为这会给你能够为每个粒子分配固定的混合颜色(基于渐变)。

标签: objective-c sprite-kit skemitternode


【解决方案1】:

好吧,看来您不能为SKEmitterNode 使用预定义的sks 文件...我能够通过以编程方式创建SKEmitterNode 来解决这个问题。原因是因为当您使用sks 启动SKEmitterNode 时,它看起来不像,它不会响应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)currentTimeSKScene 一起提供的功能。

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 值,但我会让您自己选择颜色。


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


说了这么多,不幸的是,仅使用粒子界面似乎无法获得想要的效果。

【讨论】:

  • 嗨,约翰,感谢您花费时间和精力来整理这个答案。我看到你在做什么,对我来说看起来不错,我会在早上试一试。非常感谢,完美的答案。
  • 如果将 SKEmitterNode 的 'particleColorSequence' 变量设置为 nil,则 SKParticleColor 不再被忽略。创建 SKS 通常会将其设置为非零,从而导致其他颜色属性被忽略。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多