OpenGL ES выполняет селектор после случайной задержки - PullRequest
0 голосов
/ 01 февраля 2012

Я работаю над приложением 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 Ответ

0 голосов
/ 07 февраля 2012

Самое простое решение - использовать !(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];
}
...