OpenGL ES выполняет селектор после случайной задержки
Я работаю над приложением OpenGL ES, где у меня есть космический корабль с 6 пушками. Каждый пистолет использует анимацию ключевого кадра для интерполяции между 2 наборами вершин начальной и конечной позиции.
У меня есть метод rotateGun:
что я передаю переменную gunNumber, указывающую на то, какой пистолет должен выстрелить когда rotateGun:
стреляет, это создает лазерный взрыв, который я удаляю от корабля через вектор, указывающий вниз на ствол орудия в его месте, когда вызывается метод. Это все работает нормально, но я хочу добавить случайные интервалы времени для каждого оружия, чтобы стрелять, так как сейчас они, кажется, стреляют одновременно.
Я попытался создать задержку и запустить мой rotateGun: метод, используя performSelector:afterDelay:
, но это не работает. Затем я попытался использовать метод mainGunFire:
после задержки, а затем позвоните rotateGun:
в основной теме... это тоже не сработало. Под "не работает" я подразумеваю, что NSLog я вставил непосредственно перед вызовами рисования в rotateGun:
Метод печатает, но оружие и выстрелы никогда не рисуются.
Если я просто делаю executeSelectorOnMainThread для вызова 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 ...
}
}
1 ответ
Самое простое решение - использовать !(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];
}