2012-02-01 6 views
0

Я работаю над приложением OpenGL ES, где у меня есть космический корабль с 6 пушками. Каждое оружие использует анимацию ключевого кадра для интерполяции между двумя наборами вершин начальной и конечной позиции.OpenGL ES Выполнить селектор после случайной задержки

У меня есть способ rotateGun:, что я передаю переменную gunNumber, относящуюся к тому, что касается огня, который должен стрелять. Когда rotateGun: срабатывает, он создает лазерный взрыв, который я удаляю от корабля через вектор, указывающий вниз по стволу орудия в его месте при вызове метода. Все это прекрасно работает, но я хочу добавить случайные интервалы времени для каждого пушки, чтобы стрелять, так как сейчас они, похоже, срабатывают одновременно.

Я попытался создать временную задержку и запустить мой rotateGun: метод с использованием performSelector:afterDelay:, но это не сработает. Затем я попытался использовать метод mainGunFire: после задержки, а затем позвонил rotateGun: по основному потоку ... это тоже не сработало. Под «не работает» я имею в виду, что NSLog I, вставленный непосредственно перед тем, как мои призывы рисования в методе rotateGun: действительно печатает, но оружие и взрывы никогда не рисуются.

Если я просто выполняю функциюSelectorOnMainThread для вызова rotateGun:, тогда оружие и взрывы рисуются как прежде, и взрывы, похоже, срабатывают одновременно. Я явно ничего не понимаю. Может кто-то, пожалуйста, помогите мне понять, как слегка рандомизировать мои лазерные взрывы, чтобы они не стреляли одновременно? Благодаря!

// Randomly Fire Gun 
- (void)mainGunFire:(NSNumber *)gunNumber { 

    // Perform the Gun animation and fire on main thread 
    [self performSelectorOnMainThread:@selector(rotateGun:) withObject:gunNumber waitUntilDone:YES]; 

} 

// Draw and Rotate the Guns 
- (void)drawRotateGuns { 

    // Only shoot if this is not a ship life 
    if (self.isLife == NO) { 

     // Gun 1 

     // Set the pass variable to 1 and call the method 
     // after a variable amount of time 
     int randomTime = 0; 
     //[self performSelector:@selector(mainGunFire:) withObject:[NSNumber numberWithInt:1] afterDelay:randomTime]; 
     [self performSelectorOnMainThread:@selector(rotateGun:) withObject:[NSNumber numberWithInt:1] waitUntilDone:YES]; 

     // Gun 2 ... 

     // Gun 3 ... 

    } 
} 
+0

'[NSNumber numberWithInt: 1]' - вставить случайное значение вместо 1. В целом ваш подход неправилен в дизайне, я бы рекомендовал использовать готовый с открытым исходным кодом двигатель;) – brigadir

+0

ОК спасибо за вход! – PhilBot

ответ

0

Самое простое решение состоит в использовании вместо !(rand()%some_number) 1. Эксперимент с some_number значением (оно должно быть различным для каждой пушки). Но это должно быть не очень большим.

Например, если вы используете 2, то вероятность !(rand()%2) == 1 составляет около 0,5. Поэтому, если вы рендерите 60 кадров в секунду, вы получите около 30 огней в секунду. Для! (Rand()% 20) вы должны получить около 3 огней в секунду. Надеюсь, вы это поняли. Некоторый псевдокод:

if(!(rand()%2)) { 
    [gun1 fire]; 
} 

if(!(rand()%3)) { 
    [gun2 fire]; 
} 
+0

Это очень похоже на то, что я закончил делать - спасибо. – PhilBot

 Смежные вопросы

  • Нет связанных вопросов^_^