Specify random particle start colour with no animated change?

我只是一个虾纸丫 提交于 2019-12-05 07:43:42
John Riselvato

Well, It looks like you can't use a predefined sks file for the SKEmitterNode... I was able to figure this out by programmatically creating the SKEmitterNode. The reason why is because it doesn't look like when you initiate an SKEmitterNode with an sks, it doesn't respond to setParticleColor: but programmatically initiating one does.

Now today, this past hour, was the first time I ever messed with an SKEmitterNode, so you'll have to bear with me because I couldn't figure out how to get the snow effect perfect, but I'm sure you can just mess with the values an SKEmitterNode allows you to change.

In any case, I'm going to assume that the SKEmitterNode is presented on the SKScene (that's the only way I know how to get your desired effect).

First you'll need to make you're SKEmitterNode a global/property/etc because you'll need access to it later.


In the 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];
}

So what i've done here is programatically created the particle effect, this is where you'll change the animation/speed/etc variables to get the best particle effect you are looking for. I would suggest reading this for more details.


Now remember how I said that it needs to be presented on the SKScene? Well that's because we are going to be taking advantage of the update:(CFTimeInterval)currentTime function that comes along with an SKScene.

Inside the update:(CFTimeInterval)currentTime is the location where we will be changing the SKEmitterNode's color. Since this update function is called every frame it makes it easy to change the color without any fancy timers or such. Not sure if this is a good idea, but it's the idea that counts.

-(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 */
}

In this case, we are changing the color to a random RGB value but i'll let you select the colors yourself.


In return this is what my code has produced:


All this said, it doesn't look like you can get the effect you want solely using the particle interface unfortunately.

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!