【问题标题】:cocos2d starting particles from a specific time in the futurecocos2d 从未来的特定时间开始粒子
【发布时间】:2011-07-08 11:11:08
【问题描述】:

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

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

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

提前谢谢你

安德烈亚

【问题讨论】:

  • 您找到解决方案了吗?我*我遇到了同样的问题(下雪)
  • Alex 你有没有设法从未来的某个时间启动你的粒子系统?
  • 很遗憾没有。否则我会发布代码。 (就像每个编码员应该的那样;)我认为唯一的解决方法是弄乱更新时间/重力,直到屏幕被填满并将更新时间/重力设置为正常。 (未经测试,但可能有效)

标签: iphone ios cocos2d-iphone particles


【解决方案1】:

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

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

【讨论】:

  • 这对我也有用,我不知道你为什么被否决。它基本上快进了初始粒子的发射,这使得它看起来好像你是从较晚的时间点开始的。
  • 这肯定是正确的答案。谢谢!
【解决方案2】:

你试过了吗

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

好吧,这可能是在滥用 API 的初衷,但很有用
如果您有多个此类延迟反应,请注意 onStallComplete 中的重新进入。

注意:SO 的新手,希望代码 sn-p 出来看起来正确

【讨论】:

  • 我认为你想使用 CCCallFuncN 而不是 CCCallFunc。
  • @imran ... 是的,我是凭记忆这样做的,只是为了让大家了解这个想法。我自己对此的使用范围从超简单(如本例所示)到情况需要时复杂的多路复用版本。
【解决方案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.
}

注意,从这里开始,如果你想停止它的渲染,你只需要像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 出于某种原因不允许您这样做。我在网上找到了一个similar question,他们建议你玩posVarspeed,以便在你过渡到场景时让它们足够大,一旦你完全过渡到场景中,重置值正常。您可能想尝试一下!

希望有帮助!

【讨论】:

  • 您好,感谢您的回答,但是我不想在未来启动粒子系统。我希望它从应用程序的开头开始,但我希望它像从某个时间(例如 3 秒)运行一样开始。
  • 等一下,你的意思是要启动应用程序,并让一个粒子立即运行,看起来好像已经运行了 3 秒,即使场景刚刚开始了吗?
  • 是的,这正是我的意思。问题是我正在使用粒子系统来表示充满星星的天空。粒子系统启动时没有星星,但几秒钟后(即 3 秒)它会用闪烁的白点填充屏幕。我想要的是避免过渡时间并启动粒子系统,就好像已经过了 3 秒一样。有什么办法吗?
  • 这个想法很好但是:我正在使用 CCQuadParticleSystem,它扩展了 CCParticleSystem 并且只继承了更新方法(不是 updateWithDelta)但是更新方法实际上采用了一个参数((ccTime)dt),其中 ccTime 是浮点数.因此,我通过调用 update 而不是 updateWithDelta 尝试了您建议的代码。不幸的是它不起作用,我继续寻找粒子系统,就像什么都没发生一样:(
  • 我在回答中打错了字,更新为 delta 而不是固定的 (1/60)。查看-(void) update: (ccTime) dt; 的代码,似乎这应该没有问题。该方法与全局 updateWithDelta: 方法无关。您确定在执行上述循环之前 BEFORE 初始化了粒子吗?
【解决方案4】:

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

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

【讨论】:

    【解决方案5】:

    我想不出直接实现这一点的方法,但你能尝试这样的解决方法吗?恐怕由于其他错误,我还无法对此进行测试,但正在努力。

    { 
        ...
    
        //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 倍。这是个问题吗?

    【讨论】:

    • 我实际上已经尝试过了,但它似乎并没有像我预期的那样工作。你试过了吗?它对你有用吗?我还尝试将 elapsed 字段设置为 @property 以调用此 [particleSystem setElapsed: 3] 但它不起作用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-30
    • 2010-11-11
    • 1970-01-01
    • 2023-04-03
    • 1970-01-01
    相关资源
    最近更新 更多