2015-08-20 2 views
2

У меня есть 11 звуков для каждого звукового пакета. Они названы:Самый простой способ случайного воспроизведения звуков

  • testpack1.mp3,
  • testpack2.mp3 и так далее.

Плеер инициализирует их с этим кодом:

NSString * strName = [NSString stringWithFormat:@"testpack%ld", (long) (value+1)]; 
    NSString * strPath = [[NSBundle mainBundle] pathForResource:strName ofType:@"mp3"]; 
    NSURL * urlPath = [NSURL fileURLWithPath:strPath]; 
    self.audioplayer = [[AVAudioPlayer alloc] initWithContentsOfURL:urlPath error:NULL]; 

Это звучит будет воспроизводиться с помощью кнопок. Например, я создал 4 кнопки, эти 4 кнопки воспроизводят каждый раз только testpack1-4.mp3, но я хочу, чтобы мой плеер случайно выходил из 11 звуков. Какое самое простое решение?

Примечание: Я не хочу повторять mp3, если все играются

ответ

2

Как насчет этого?

int randNum = rand() % (11 - 1) + 1; 

formuale как ниже

int randNum = rand() % (maxNumber - minNumber) + minNumber; 
+0

Ровно, и в публикуемую вопрос первой строке кода, замените значение + 1 с randNum из этого ответа. – Bamsworld

+0

спасибо, но я забыл сказать, что каждый звук следует принимать только один раз ... – iOSBeginner

+0

@iOSBeginner: ok ... создайте массив числа, который будет выполнен, и проверьте, выполнено ли это число, снова вызовите randNum .. это оно... –

-2

Вы пробовали это:

NSUInteger value = arc4random(11) + 1;

или

NSUInteger value = arc4random_uniform(11) + 1; (IOS> 4,3)

Это даст вам случайное число от 0 до 10, а затем добавит 1. Таким образом, ваши файлы перейдут с вашегоString1 на вашString11.

2

Предложение:

Это объявляет 3 переменные как статические переменные, played является простым С-Массив

static UInt32 numberOfSounds = 11; 
static UInt32 counter = 0; 
static UInt32 played[11]; 

Метод playSound() сбрасывает C-массив для нулевых значений, если значение счетчика равно 0 и устанавливает счетчик количества звуков. Когда метод называется случайным генератором, создается номер индекса.

  • Если значение в этом индексе в массиве равно 0, звук воспроизводится, индекс в массиве устанавливается и счетчик уменьшается.
  • Если звук в этом индексе еще не воспроизведен, проведите цикл до тех пор, пока не будет найден неиспользуемый индекс.

    - (void)playSound 
    { 
        if (counter == 0) { 
        for (int i = 0; i < numberOfSounds; i++) { 
         played[i] = 0; 
        } 
        counter = numberOfSounds; 
        } 
        BOOL found = NO; 
        do { 
        UInt32 value = arc4random_uniform(numberOfSounds) + 1; 
        if (played[value - 1] != value) { 
         NSString * strName = [NSString stringWithFormat:@"testpack1-%d", value]; 
         NSString * strPath = [[NSBundle mainBundle] pathForResource:strName ofType:@"mp3"]; 
         NSURL * urlPath = [NSURL fileURLWithPath:strPath]; 
         self.audioplayer = [[AVAudioPlayer alloc] initWithContentsOfURL:urlPath error:NULL]; 
         played[value - 1] = value; 
         counter--; 
         found = YES; 
        } 
        } while (found == NO); 
    } 
    
Смежные вопросы