我在我的应用中面临的新问题,这不是一个错误,而是一个我遇到问题的挑战。
所以在我的应用程序中,当检测到一定程度的声音时,计数器(在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一次计数1将需要永远。除非我非常快地计算这个很好,但我不确定这是否可行。所以在那个例子中,我目前每隔100毫秒计算一次312'345(测试的随机数)(每秒3'123'450)。
所以我不能简单地说......
if(currentPowerlevel == 300000){mSounds.play(etc)}
由于计数增量,可能会跳过此确切数字。所以我尝试使用......
if(currentPowerlevel> 300000&& currentPowerlevel< 612344){mSounds.play(etc)}
希望这意味着文件只会播放一次,即使在计数器上准确达到300'000,下一个计数将是612'345,因为该层的增量金额。但是这不仅是混乱的,而且如果对层/计数速度进行更改,则需要进行大量麻烦的代码更改,但它似乎仍然无法正常工作并重复播放文件。
所以我会在下面发布所有相关代码,希望有人能克服这个挑战!理想情况下,我希望以下内容成立:
有一种冷却时间,或每10秒最大允许播放声音,以阻止文件重复播放。
public void 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) + 8012345;
} else if (currentAmplitude <= 8999 && currentPowerLevel >= 150000000 && currentPowerLevel <= 799999999) {
currentPowerLevel = (currentPowerLevel) - 801234;
}
if (currentPowerLevel > 800000000) {
currentPowerLevel = (currentPowerLevel) - 801234;
}
// 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);
}
}
更新:
好的,我想出了我认为应该有用的东西,但由于某种原因,它不起作用......
// 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;
}
}
有什么想法吗?
更新2:
我弄清楚为什么上面的代码不起作用,整个块在处理程序中循环。因此,在soundPlayed整数设置为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;
}
}
声音播放从0开始。当功率电平在1到299'999之间时,并且soundPlayed等于0,声音将被播放,变量soundPlayed现在将被设置为1.此代码每次触发100毫秒(每秒10次),因为它是我的Runnable Handler的一部分。在循环的第二次和每次其他迭代中,它将检查soundPlayed是否为0,它不是(因为它现在为1)并且不会再次播放音频文件。
然后一旦达到300'000,它现在将检查soundPlayed是否等于1,它是。它再次播放声音文件,现在将soundPlayed设置为2.
我可以将它设置为0,但这意味着如果功率水平下降(下降)回到299'999或更低,声音会再次播放,这是我不想要的。
希望这可以帮助其他任何需要达到类似效果的人!