编辑(更具体):
我有以下情况。我正在用JavaScript构建一个实验性的合成器接口。我正在使用howler.js插件来处理音频。 这个想法是,如果满足某个条件,就会播放声音。我有一个数字存储变量,其值通过iPhone指南针的标题更改。 我使用compass.js。它有一个名为heading的变量。
$(function(){
Compass.watch(function (heading) {
$('.degrees').text(Math.floor(heading) + '°');
$('#rotate').css('-webkit-transform', 'rotate(' + (-heading) + 'deg)');
if (heading >= 10 && heading <= 30) {
sound.play("myFirstSound");
}
else if (heading >= 31 && heading <= 60) {
sound.play("mySecondSound");
} else { etc etc...
});
});
即使标题是常量,.play命令也不会执行一次,而是一遍又一遍地执行,导致音频引擎耗尽内存。如何只在if循环中执行一次命令?我无法访问罗盘功能之外的标题值。我总是得到 var标题不存在错误。
答案 0 :(得分:2)
只需使用布尔变量。
var alreadyPlayed = false;
for(somecondition){
if(alreadyPlayed) continue;
sound.play("myFirstSound");
alreadyPlayed = true;
}
你明白了。
答案 1 :(得分:1)
创建boolean flag
并仅在false
时播放声音。
var isPlayed = false;
var oldValue = myVariable;
if (myVariable >= 10 && myVariable <= 30 && !isPlayed) {
sound.play("myFirstSound");
isPlayed = false;
}
然后在需要时初始化变量...对于你说的我猜你需要一个变量来比较循环内的值并将isPlayed
标志设置为false
:
if (myVariable != oldValue)
isPlayed = false;
答案 2 :(得分:1)
采用类似
的布尔变量var checkOnce= false;
if (myVariable >= 10 && myVariable <= 30) {
checkOnce=true;
sound.play("myFirstSound");
}
else if (myVariable >= 31 && myVariable <= 60) {
checkOnce=true;
sound.play("mySecondSound");
} else { etc etc...
在循环中检查checkOnce的值。循环将运行直到checkOnce = false
答案 3 :(得分:1)
布尔值是个好主意。您还可以使用onend
对象的sound
属性,这样您就可以知道何时可以再次开始播放声音。像这样:
var playing = false;
sound.onend = function () { playing = false; };
while (condition) {
if (!playing & ...)
...
...
}
答案 4 :(得分:1)
看到您对该问题的编辑,为下一次触发添加延迟,指南针可能会发射太快。不熟悉compass.js,但正如我所看到的那样,它每度发射一次,这就是很多......如果你将手机倾斜180度,即180度触发。 像,
setTimeout(function() { your_func(); }, 50);
延迟50ms
您还可以通过添加10的计数器将可用的触发器限制在360到36或更少,1度计数为1。所以它只在10度移动后触发。
$(function(){
var counter = 0;
Compass.watch(function (heading) {
if(counter <=10){
counter++;
}
else{
counter = 0;
$('.degrees').text(Math.floor(heading) + '°');
$('#rotate').css('-webkit-transform', 'rotate(' + (-heading) + 'deg)');
if (heading >= 10 && heading <= 30) {
sound.play("myFirstSound");
}
else if (heading >= 31 && heading <= 60) {
sound.play("mySecondSound");
} else { etc etc...
}
});
});
答案 5 :(得分:0)
只添加一小部分抽象,以跟踪当前正在播放的内容。
var nameOfSoundPlaying = null;
function play(soundName) {
if (nameOfSoundPlaying == soundName) {
return;
} else {
if (nameOfSoundPlaying != null) {
// stop currently playing sound (if still playing)
...
}
nameOfSoundPlaying = soundName;
sound.play(soundName);
}
}
然后它会简化您的代码:
$(function(){
Compass.watch(function (heading) {
$('.degrees').text(Math.floor(heading) + '°');
$('#rotate').css('-webkit-transform', 'rotate(' + (-heading) + 'deg)');
if (heading >= 10 && heading <= 30) {
play("myFirstSound");
}
else if (heading >= 31 && heading <= 60) {
play("mySecondSound");
} else { etc etc...
});
});