3

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

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

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

先感谢您

安德烈亚

4

5 回答 5

7

我这样做了,它完全按照我想要的方式工作。

for (int i = 0 ; i < 300 ; i++)
    [emitter update:.1];
于 2012-12-10T22:39:28.167 回答
2

你试过一个

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

好的,当然这可能是在滥用 API 的原始意图,但
如果您有多个此类延迟反应,则可以在 onStallComplete 重新进入时进行观察。

注意:SO的新手,希望代码片段看起来正确

于 2011-09-03T16:52:46.577 回答
0

我不认为有办法让你的粒子系统快进 3 秒。或者,我可以根据您的情况想象两种不同的解决方案:

  1. 在另一个场景后面加载带有粒子的场景(例如,一个空的黑色场景)。3 秒后切换到具有现在漂亮粒子效果的场景。如果用户需要等待 3 秒并且您只是不希望他们在所有东西都聚集在一起时看到粒子系统,或者如果您在粒子系统场景之前还有另一个场景,这对您来说是可以的。
  2. 记录粒子系统,将其存储在文件中,然后在场景中重播。对于记录,我的意思是存储每个粒子的位置和颜色。缺点是,它每次看起来都一样,如果你想运行它比你录制的时间长,你需要确保在循环中重放它仍然看起来不错。
于 2011-09-02T20:49:52.000 回答
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 倍。这是一个问题吗?

于 2011-09-03T08:51:33.167 回答
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个变量,就会出现同样的效果。

EDIT2:经过进一步澄清,我们只需要调整init您的粒子的方法。我将在这里做出 2 个假设,您只需稍微更改它们即可满足您的需求。假设您的更新周期为每秒 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 出于某种原因不允许您这样做。我在网上发现了一个与此类似的问题,他们建议你在过渡到场景时使用posVarspeed使它们足够大,一旦你完全过渡到场景中,将值重置为正常值。您可能想尝试一下!

希望有帮助!

于 2011-09-04T08:01:07.393 回答