cocos2d从未来的特定时间开始粒子

我正在开发一个基于cocos2d的应用程序,其中我正在利用CCQuadParticleSystem来制作闪烁的星星。 我用ParticleDesigner生成了这个粒子系统。 一旦我加载了粒子系统,代表恒星的白色圆点开始出现在背景中,过一段时间后,它们逐渐消失,这样,在粒子系统达到状态的几秒钟之后,就会出现一个满是星星的夜空。

我的问题是,我想知道是否有一种方法可以使粒子系统从未来的特定时间开始(例如t0 = 3秒),这样我就不必等待所有的开始闪烁。

我希望我已经清楚地解释了这个问题

先谢谢你

安德里亚

我假设你在游戏循环中使用某种updateWithDelta:方法来更新粒子。 如果你想要粒子在一定的时间间隔后启动,请制作自己的计时器。

编辑:根据您的评论下面,我的方法仍然很好,只需要一些调整。 您只需要删除粒子系统上的updateWithDelta:方法中的条件。 这样,它仍然会更新这3秒,但不会渲染,因此看起来就是你描述的方式。

在.h文件中:

 BOOL particleShouldUpdate; float particleTimer; 

在你的init方法中:

 particleShouldRender = NO; particleTimer = 3.0f; 

在你的updateWithDelta:方法中:

 if(!particleShouldRender){ particleTimer -= delta; if(particleTimer < 0){ particleShouldRender = YES; } } // update your particle. 

最后,在你的渲染方法中:

 if(particleShouldRender){ // render your particle. } 

注意 ,从这一点来看,如果你想停止渲染,你只需要重新设置2个variables,就像在init方法中一样,同样的效果也会发生。

编辑2:进一步澄清,我们只需要调整你的粒子的init方法。 我会在这里做两个假设,你只需要稍微改变它们以适应你的需要。 假设您的更新周期为每秒60帧,最小粒子寿命为1.01,并且在开始游戏之前需要3秒的更新。 然后在init方法中,尝试:

 for(float delta = 0.0f; delta < 3.0f; delta += (1/60)){ [particle updateWithDelta:(float)(1/60)]; } 

这会像通常那样更新你的粒子,但是不会在每个间隔进行渲染,也不会在其他任何更新之前进行渲染。 或者,如果您在更新粒子时担心速度,可以尝试:

 for(int i = 0; i < 3; i++){ [particle updateWithDelta:1]; [particle updateWithDelta:0.02]; } 

这将会更快,但根据您的粒子参数可能会有一些问题。

EDIT3:所以进一步观察,cocos2D不会让你做这个由于某种原因。 我在网上发现了一个类似的问题 ,他们build议你玩posVar并且在转换到场景时speed ,使它们足够大,一旦完全转换到场景中,将值重置为正常。 你可能想尝试一下!

希望帮助!

我做到了这一点,它的工作方式正是我想要的。

 for (int i = 0 ; i < 300 ; i++) [emitter update:.1]; 

你试过了吗?

 id actions = [CCSequence actions:[CCDelayTime actionWithDuration:3.0f], [CCCallFunc actionWithTarget:self selector:@selector(onStallComplete)], nil]; [self runAction:actions]; 

好吧,认为它可能滥用API的原始意图,但是很有用
如果你有多个这样的延迟反应,请注意onStallComplete中的重入。

注意:新手在SO,希望代码片断出来看起来是正确的

我不认为有一种方法可以在未来3秒内快速处理您的粒子系统。 或者,我可以根据您的情况设想两种不同的解决scheme:

  1. 将粒子加载到另一个场景之后(例如,一个空的黑场景)。 3秒钟后,切换到现在好看的粒子效果。 如果用户需要等待3秒钟,并且你不希望他们看到粒子系统,而所有的东西都被凝聚在一起,或者如果在粒子系统的场景之前有另一个场景的话,这可以起作用。
  2. logging粒子系统,将其存储在一个文件中,然后在场景中重播。 logging我的意思是存储每个粒子的位置和颜色。 缺点是,它每次看起来都一样,如果你想运行它比你录制的时间更长,你需要确保在循环中重播它仍然看起来不错。

我想不出一种直接实现的方法,但是你可以尝试这样的解决方法吗? 恐怕由于其他错误,我还没有能够testing这个,但是正在研究它。

 { ... //This attempts to make 3 seconds pass 100 times quicker [[CCScheduler sharedScheduler] setTimeScale:100]; [self schedule:@selector(cancelIncreasedTimeScale) interval:3]; ... } int numberOfTimesCancelled = 0; -(void) cancelIncreasedTimeScale { numberOfTimesCancelled ++; //Two because the scheduler is also called straight away? Remove if it's only called after waiting an initial (3/100) seconds if (numberOfTimesCancelled == 2) { [self unschedule:@selector(cancelIncreasedTimeScale)]; [[CCScheduler sharedScheduler] setTimeScale:1]; } } 

我担心的问题是你场景中的其他项目也会跑100倍。 这是一个问题吗?