Указать случайный начальный цвет частицы без анимированного изменения?

Есть ли способ, чтобы частицы появлялись со случайным цветом для каждой частицы на основе текущей «Цветовой шкалы»? Частицы не меняют цвет в течение своей жизни, им просто присваивается цвет где-то на «Цветовой шкале» при рождении, и они сохраняют этот цвет до самой смерти.

Результатом этого будет смесь частиц при рождении со смешением цветов от КРАСНОГО до СИНЕГО.

Смешение цветов

В моих тестах я, кажется, смог получить поведение, при котором частицы появляются как КРАСНЫЕ, а затем постепенно становятся СИНИМ по мере приближения к нижней части экрана.

введите здесь описание изображенияПадающие листья


person fuzzygoat    schedule 06.11.2013    source источник
comment
Вы не хотите, чтобы они анимировались в нижней части экрана, а оставались на месте и меняли цвета?   -  person John Riselvato    schedule 06.11.2013
comment
@JohnRiselvato - с цветовой шкалой частицы анимируются от красного (вверху) до синего (внизу). Я хотел, чтобы частицы вообще не анимировались в цвете, а скорее появлялись с постоянным цветом (из рампы), а затем сохраняли этот цвет на протяжении всей своей жизни. Как осенние листья, падающие с дерева, некоторые зеленые, некоторые желтые, некоторые оранжевые, они просто начинают со своего индивидуального цвета и падают (они не меняют цвет при падении)   -  person fuzzygoat    schedule 06.11.2013
comment
Я использовал снег в качестве оригинала, затем заменил спрайт на лист (плохо, добавьте *.png выше)   -  person fuzzygoat    schedule 06.11.2013
comment
Я думаю, проблема в том, что цветовая шкала работает только со временем, все частицы всегда начинаются с красного (а затем у вас есть возможность смешивать от красного к синему). Я не думаю, что это дает вам возможность назначить фиксированный цвет смешивания. (на основе рампы) в расчете на каждую частицу.   -  person fuzzygoat    schedule 06.11.2013


Ответы (2)


Ну, похоже, вы не можете использовать предопределенный файл 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];
}

Итак, что я сделал здесь, это программно создал эффект частиц, именно здесь вы измените переменные анимации/скорости/и т. д., чтобы получить наилучший эффект частиц, который вы ищете. Я бы посоветовал читать это для более подробной информации.


Теперь помните, как я сказал, что это нужно представить на 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, но я позволю вам выбрать цвета самостоятельно.


Взамен это то, что мой код произвел:

введите здесь описание изображения


Все это говорит о том, что, к сожалению, вы не можете получить желаемый эффект, используя только интерфейс частиц.

person John Riselvato    schedule 06.11.2013
comment
Привет, Джон, спасибо за ваше время и усилия, чтобы собрать этот ответ. Я вижу, что вы делаете, и мне это нравится, я попробую утром. Высоко ценится, идеальный ответ. - person fuzzygoat; 06.11.2013
comment
Если вы установите для переменной 'particleColorSequence' SKEmitterNode значение nil, то SKParticleColor больше не будет игнорироваться. При создании SKS обычно устанавливается значение, отличное от нуля, что приводит к игнорированию других атрибутов цвета. - person OwlOCR; 20.04.2016

То, что я обнаружил, работает без необходимости добавления кода в функцию 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, который вы создаете в редакторе, а затем атрибуты цвета переопределяются классом.

person PKCLsoft    schedule 24.03.2021