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

时间:2011-07-08 11:11:09

标签: iphone ios cocos2d-iphone particles

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

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

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

提前谢谢

安德烈

5 个答案:

答案 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秒内快速推进粒子系统。或者,根据您的具体情况,我可以想象两种不同的解决方案:

  1. 将粒子加载到另一个场景(例如空白场景)后面。 3秒后切换到具有现在漂亮的粒子效果的场景。这可以工作,你可以使用,用户需要等待3秒,而你只是不希望他们看到粒子系统,而一切都在一起,或者如果你在粒子系统的场景之前有另一个场景。
  2. 记录粒子系统,将其存储在文件中,然后在场景中重放。录音我的意思是存储每个粒子的位置和颜色。缺点是,它每次看起来都一样,如果你想比你录制的更长时间运行它,你需要确保在循环中重放它仍然看起来不错。

答案 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,他们建议您使用posVarspeed进行游戏,以便在转换到场景时使其足够大,并且一旦完全转换为在场景中,将值重置为正常。你可能想尝试一下!

希望有帮助!