2015-10-10 1 views
0

Новая проблема, с которой я столкнулся в своем приложении, и это не совсем ошибка, а проблема, с которой у меня проблемы.Android: Воспроизведение звука, когда счетчик достигает целого числа (только для Going UP)

Итак, в моем приложении, когда обнаружен определенный уровень звука, счетчик (который отображается в TextView) начинает подсчет. Существуют определенные уровни (основанные на уровнях мощности DragonBall Z), например от 1 до 300 000, затем от 300'001 до 30'000'000 и, наконец, 30'000'001-15'000'000 в настоящее время. Когда звук больше не обнаруживается, уровень мощности медленно снижается.

У меня есть звуковой файл, который мне нужно играть, поскольку каждый уровень достигнут. Поэтому, как только начинается счетчик, звуковой файл должен воспроизводиться один раз. Затем, когда достигается второй уровень (300 000), он снова воспроизводится.

Мои условия в том, что файл должен воспроизводиться только при достижении уровня мощности, поэтому с 299'999 до 300'000 он будет играть. Но если уровень мощности упал с 300'001 до 300'000, звук не должен воспроизводиться. Кроме того, из-за большого количества достижений счетчик не увеличивается на 1, а гораздо больше, в зависимости от уровня.

Например, чтобы добраться от 300'000 до 30'000'000, считая по одному за раз, навсегда. Если бы я не собирался считать это очень быстро, что было бы здорово, но я не уверен, что это возможно. Итак, в этом примере у меня в настоящее время он подсчитывается на 312'345 (случайное число для тестирования) каждые 100 миллисекунд (так 3'123'450 в секунду).

Так что я не могу просто сказать ...

если (currentPowerlevel == 300000) {mSounds.play (и т.д.)}

Поскольку это точное число, вероятно, будет пропущен из-за увеличения счетчика. Так что я попытался с помощью ...

если (currentPowerlevel> 300000 & & currentPowerlevel < 612344) {mSounds.play (и т.д.)}

Надеясь, что это будет означать, что файл будет воспроизводиться только один раз так как даже если на счетчике должно было быть достигнуто 300 000, следующий счет будет 612'345 из-за суммы приращений на этом уровне. Но это не только бесполезно, но и требует много назойливых изменений кода, если вносить изменения в уровень/скорость счета, но также кажется, что он еще не работает должным образом и воспроизводит файл повторно.

Итак, я опубликую все соответствующие коды ниже и, надеюсь, кто-то сможет преодолеть этот вызов! В идеале я хотел бы, чтобы было правдой:

  • Счетчик увеличивается на 1 счетчик, с регулируемой скоростью для учета больших уровней, таких как 3'000'000 до 15'000'000.
  • Звуковой файл может воспроизводиться только при подсчете, но не при спуске.
  • Существует некоторое время восстановления или максимально допустимое воспроизведение звука за 10 секунд, чтобы остановить повторный файл.

    общественного недействительными countPowerLevel() {

    // Goku Start 
    if (currentAmplitude > 9000 && currentPowerLevel <= 299999) { 
        currentPowerLevel = (currentPowerLevel) + 3123; 
    } else if (currentAmplitude <= 8999 && currentPowerLevel <= 299999) { 
        currentPowerLevel = (currentPowerLevel) - 312; 
    } 
    
    // Goku Kaioken (300'000) 
    if (currentAmplitude > 9000 && currentPowerLevel >= 300000) { 
        currentPowerLevel = (currentPowerLevel) + 312345; 
    } else if (currentAmplitude <= 8999 && currentPowerLevel >= 300000 && currentPowerLevel <= 29999999){ 
        currentPowerLevel = (currentPowerLevel) - 31234; 
    } 
    
    
    // Goku Kaioken x 10 (30'000'000) 
    if (currentAmplitude > 9000 && currentPowerLevel >= 30000000) { 
        currentPowerLevel = (currentPowerLevel) + 1512345; 
    } else if (currentAmplitude <= 8999 && currentPowerLevel >= 30000000 && currentPowerLevel <= 149999999) { 
        currentPowerLevel = (currentPowerLevel) - 151234; 
    } 
    
    // Goku Super Saiyan 1 (150'000'000) 
    if (currentAmplitude > 9000 && currentPowerLevel >= 150000000) { 
        currentPowerLevel = (currentPowerLevel) + 8; 
    } else if (currentAmplitude <= 8999 && currentPowerLevel >= 150000000 && currentPowerLevel <= 799999999) { 
        currentPowerLevel = (currentPowerLevel) - 8; 
    } 
    
    if (currentPowerLevel > 800000000) { 
        currentPowerLevel = (currentPowerLevel) - 8; 
    } 
    
    // Stop power from going below 1 
    if (currentPowerLevel < 1) { 
        currentPowerLevel = 1; 
    } 
    
    // Alerts for reaching power level milestones 
    TextView textCurrentForm = (TextView) findViewById(R.id.textCurrentForm); 
    ImageView imgCurrentForm = (ImageView) findViewById(R.id.imgCurrentForm); 
    imgCurrentForm.setImageResource(R.drawable.goku); 
    
    // Goku Kaioken (300'000) 
    if (currentPowerLevel >= 300000) { 
        textCurrentForm.setText("Kaioken!"); 
        imgCurrentForm.setImageResource(R.drawable.gokukk10); 
    } 
    
    // Goku Kaioken x 10 (30'000'000) 
    if (currentPowerLevel >= 30000000) { 
        textCurrentForm.setText("Kaioken x 10!"); 
        imgCurrentForm.setImageResource(R.drawable.gokukk100); 
    } 
    
    // Goku Super Saiyan 1 (150'000'000) 
    if (currentPowerLevel >= 150000000) { 
        textCurrentForm.setText("Super Saiyan!"); 
        imgCurrentForm.setImageResource(R.drawable.gokussj); 
    } 
    
    // Trigger sounds per power level 
    if (currentPowerLevel > 1 && currentPowerLevel < 4000) { 
        mSounds.play(sndAura01, 1, 1, 1, 0, 1); 
    } 
    
    if (currentPowerLevel > 4000 && currentPowerLevel < 10000) { 
        mSounds.stop(sndAura01); 
    } 
    
    if (currentPowerLevel == 300000) { 
        mSounds.play(sndAura01, 1, 1, 1, 0, 1); 
    } 
    

    }

UPDATE:

Хорошо я придумал, что я думаю, что должно работать, но по какой-то причине это не ...

// Trigger sounds per power level 

// Count amount of times sound has been played 
int soundPlayed = 0; 

if (currentPowerLevel > 1 && currentPowerLevel <= 299999) { 
    if (soundPlayed == 0) { 
     mSounds.play(sndAura01, 1, 1, 1, 0, 1); 
     soundPlayed = 1; 
    } 
} 

if (currentPowerLevel > 300000 && currentPowerLevel <= 2999999) { 
    if (soundPlayed == 1) { 
     mSounds.play(sndAura01, 1, 1, 1, 0, 1); 
     soundPlayed = 2; 
    } 
} 

Любые мысли?

UPDATE 2:

я работал, почему этот код не работает, то весь блок зацикливания в обработчике. Поэтому сразу после того, как для soundPlayed integer установлено значение 1, он снова возвращается к 0. Работа над решением теперь ...

+0

Любые советы по рефакторингу кода будут оценены, так как я знаю, что это супер беспорядок прямо сейчас! –

ответ

0

Хорошо, я решил.

То, что я сделал, я первым установил целочисленную переменную «soundPlayed» в начале моего класса:

// Count amount of times sound has been played 
int soundPlayed = 0; 

Затем я изменил мой звук триггеров следующим образом:

if (currentPowerLevel > 1 && currentPowerLevel <= 299999) { 
    if (soundPlayed == 0) { 
     mSounds.play(sndAura01, 1, 1, 1, 0, 1); 
     soundPlayed = 1; 
    } 
} 

if (currentPowerLevel > 300000 && currentPowerLevel <= 2999999) { 
    if (soundPlayed == 1) { 
     mSounds.play(sndAura01, 1, 1, 1, 0, 1); 
     soundPlayed = 2; 
    } 
} 

Так soundPlayed начинается в 0. Когда уровень мощности находится между 1 и 299'999, а soundPlayed равен 0, звук будет воспроизводиться, и переменная soundPlayed теперь будет установлена ​​на 1. Этот код запускается каждые 100 миллисекунд (10 раз в второй), поскольку он является частью моего Runnable Handler. На второй и любой другой итерации цикла он проверяет, является ли soundPlayed равным 0, а это не так (как сейчас 1) и не будет воспроизводить аудиофайл снова.

Затем, как только будет достигнуто 300'000, он теперь проверяет, равенство soundPlayed равно 1, что и есть. Он снова воспроизводит звуковой файл и теперь устанавливает soundPlayed на 2.

Я мог бы установить его на 0, но это будет означать, что звук будет воспроизводиться снова, если уровень мощности упадет (уменьшится) до 299'999 или ниже, чего я не хочу.

Надеюсь, это поможет любому, кому когда-либо понадобится нечто подобное!