cocos2d стартовые частицы с определенного времени в будущем - PullRequest
3 голосов
/ 08 июля 2011

Я разрабатываю приложение на основе cocos2d с космическим фоном, в котором я использую систему CCQuadParticleSystem для создания мигающих звезд.Я создал эту систему частиц с ParticleDesigner.Как только я загружаю систему частиц, на заднем плане начинают появляться белые точки, представляющие звезды, и через некоторое время они исчезают, так что через несколько секунд, в течение которых система частиц достигает режима, появляется ночное небо, полное звезд.

Моя проблема в том, что я хотел бы знать, есть ли способ заставить систему частиц начинать с определенного времени в будущем (например, t0 = 3сек), чтобы мне не пришлось ждать, чтобы получитьвсе начинает мигать.

Надеюсь, я четко объяснил проблему

Заранее спасибо

Андреа

Ответы [ 5 ]

7 голосов
/ 11 декабря 2012

Я сделал это, и это сработало именно так, как я хотел.

for (int i = 0 ; i < 300 ; i++)
    [emitter update:.1];
2 голосов
/ 03 сентября 2011

Вы пробовали

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

хорошо, если, возможно, оно злоупотребляет первоначальным замыслом API, но полезно
следите за повторным входом в onStallComplete, если у вас несколько таких задержанных реакций.

примечание: новичок в SO, надеюсь, что фрагмент кода выглядит правильно

0 голосов
/ 04 сентября 2011

Я предполагаю, что вы используете какой-то метод 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 переменные, как в методе 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];
}

Это будет быстрее, но может иметь несколько проблем в зависимости от параметров ваших частиц.

РЕДАКТИРОВАТЬ3: Так что, изучая это далее, cocos2D не позволяет вам сделать это по некоторым причинам. Я нашел похожий вопрос онлайн на этот вопрос, и они предложили вам поиграть с posVar и speed, чтобы сделать их достаточно большими, пока вы переходите на сцену, и как только вы полностью перешли на сцена, сбросьте значения до нормального. Вы можете попробовать это!

Надеюсь, что поможет!

0 голосов
/ 03 сентября 2011

Я не могу придумать способ реализовать это напрямую, но не могли бы вы попробовать что-то вроде этого в качестве обходного пути?Боюсь, я еще не смог проверить это из-за других ошибок, но работаю над этим.

{ 
    ...

    //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раз быстрее.Это проблема?

0 голосов
/ 03 сентября 2011

Я не думаю, что есть способ ускорить вашу систему частиц на 3 секунды в будущее. В качестве альтернативы я могу представить два разных решения в зависимости от ваших обстоятельств:

  1. Загрузить сцену с частицей позади другой сцены (например, пустой черной сцены). Через 3 секунды переключитесь на сцену с эффектом частиц. Это может сработать, если для вас нормально, что пользователю нужно подождать 3 секунды, и вы только не хотите, чтобы они видели систему частиц, пока все сцеплено, или если у вас есть другая сцена перед сценой с системой частиц в любом случае.
  2. Запишите систему частиц, сохраните ее в файле, а затем воспроизведите в вашей сцене. С записью я имею в виду сохранить положение и цвет каждой из ваших частиц. Недостатком является то, что он будет выглядеть одинаково каждый раз, и если вы хотите запустить его дольше, чем записали, вам нужно убедиться, что воспроизведение в цикле все еще выглядит хорошо.
...