我正在开发一个基于cocos2d的应用程序,其中有一个空间背景,我正在利用CCQuadParticleSystem制作闪烁的星星。我用ParticleDesigner生成了这个粒子系统。当我加载粒子系统时,代表星星的白点开始出现在背景中,过了一会儿它们逐渐淡出,这样,在粒子系统到达政体状态的几秒钟之后,出现了满是星星的夜空。
我的问题是,我想知道是否有办法让粒子系统从未来的特定时间开始(例如t0 = 3秒),这样我就不必等待所有的开始闪烁。
我希望我已经清楚地解释了这个问题
提前谢谢
安德烈
答案 0 :(得分:7)
我这样做了,它完全按照我想要的方式工作。
for (int i = 0 ; i < 300 ; i++)
[emitter update:.1];
答案 1 :(得分:2)
你试过吗
id actions = [CCSequence actions:[CCDelayTime actionWithDuration:3.0f],
[CCCallFunc actionWithTarget:self selector:@selector(onStallComplete)],
nil];
[self runAction:actions];
好吧,授予它可能会滥用API的原始意图,但是很有用 如果你有多个这样的延迟反应,请注意onStallComplete中的重新入侵。
注意:SO的新手,希望代码片段看起来正确
答案 2 :(得分:0)
我不认为有一种方法可以在未来3秒内快速推进粒子系统。或者,根据您的具体情况,我可以想象两种不同的解决方案:
答案 3 :(得分:0)
我想不出直接实现这个的方法,但你可以尝试这样的解决方法吗?我担心由于其他错误我还没有能够测试这个,但是正在努力。
{
...
//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倍。这是一个问题吗?
答案 4 :(得分:0)
我假设您在游戏循环中使用某种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.
}
注意从这一点来说,如果你想停止渲染,你只需像init
方法那样重置2个变量,就会产生同样的效果。< / p>
EDIT2: 进一步说明后,我们只需要调整粒子的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不允许您出于某种原因这样做。我在网上找到了一个similar question,他们建议您使用posVar
和speed
进行游戏,以便在转换到场景时使其足够大,并且一旦完全转换为在场景中,将值重置为正常。你可能想尝试一下!
希望有帮助!