OpenGL ES Выполнить селектор после случайной задержки

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

У меня есть метод 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 ...

    }
}

person PhilBot    schedule 01.02.2012    source источник
comment
[NSNumber numberWithInt:1] - вставить случайное значение вместо 1. Вообще ваш подход неверен в дизайне, я бы рекомендовал использовать готовый опенсорсный движок ;)   -  person brigadir    schedule 01.02.2012
comment
Хорошо, спасибо за вклад!   -  person PhilBot    schedule 01.02.2012


Ответы (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];
}
person Max    schedule 06.02.2012