Javascript 在变量达到特定值时运行函数
我有一个canvas游戏,每次在游戏中执行一个动作来增加分数时,它都会调用incScore函数 在incScore中,我有一些if语句来绘制特定的图像,以表示画布上的级别编号 我还想有一个健全的发挥每一级了。按照我的方式,每次乐谱与if语句匹配时,lvlup声音都会播放 有人能帮我弄到这个吗?这样当音量改变时,声音只会播放一次,直到下一个音量改变时才会播放?我还提到我正在使用jQuery,以防它有任何可以帮助我的东西Javascript 在变量达到特定值时运行函数,javascript,jquery,Javascript,Jquery,我有一个canvas游戏,每次在游戏中执行一个动作来增加分数时,它都会调用incScore函数 在incScore中,我有一些if语句来绘制特定的图像,以表示画布上的级别编号 我还想有一个健全的发挥每一级了。按照我的方式,每次乐谱与if语句匹配时,lvlup声音都会播放 有人能帮我弄到这个吗?这样当音量改变时,声音只会播放一次,直到下一个音量改变时才会播放?我还提到我正在使用jQuery,以防它有任何可以帮助我的东西 incScore(); //everytime an action in th
incScore(); //everytime an action in the game causes the score to increase
function incScore(){
if (scoreTotal < 500){
lvlimg = "L01";
drawLevel(lvlimg);
lvlupSound();
}
else if (scoreTotal > 500 && scoreTotal < 1000){
lvlimg = "L02";
drawLevel(lvlimg);
lvlupSound();
}
else{
lvlimg = "L03";
drawLevel(lvlimg);
lvlupSound();
}
}
incScore()//游戏中的每一次动作都会导致分数增加
函数incScore(){
如果(总分<500){
lvlimg=“L01”;
水位(lvlimg);
lvlupSound();
}
否则如果(scoreTotal>500&&scoreTotal<1000){
lvlimg=“L02”;
水位(lvlimg);
lvlupSound();
}
否则{
lvlimg=“L03”;
水位(lvlimg);
lvlupSound();
}
}
这是因为对于每个分数,您在每个语句中都有相同的值(即从0到无限)
您需要编写内部if语句,例如
if (scoreTotal < 500){
lvlimg = "L01";
drawLevel(lvlimg);
if(scoreTotal x times of each the level) // That means for each level completed
{
lvlupSound();
}
}
if(总分<500){
lvlimg=“L01”;
水位(lvlimg);
if(每个级别的总得分x次)//这意味着每个级别都已完成
{
lvlupSound();
}
}
如果您的分数增量仅为1,则仅在分数等于新级别的阈值时播放音调
如果他们可以将分数提高1以上,那么您可以将分数通过,并在前后检查分数,以查看分数是否落在阈值的每一侧
如果这仍然不起作用,请提供有关“级别”和点数的更多信息。一个简单的解决方案是将当前级别与旧级别进行比较,以检测级别何时更改:
function scoreToLevel(score)
if(score < 500){
return 1
}else if (score < 1000){
return 2
}else{
return 3
}
}
function incScore()
var next_level = scoreToLevel(scoreTotal)
if(next_level !== current_level){
lvlimg = "L0" + next_level;
drawLevel(lvlimg)
lvlupSound()
}
}
功能评分等级(评分)
如果(分数<500){
返回1
}否则如果(分数<1000){
返回2
}否则{
返回3
}
}
函数incScore()
var next_level=得分水平(总得分)
如果(下一级!==当前级){
lvlimg=“L0”+下一级;
水位(lvlimg)
lvlupSound()
}
}
您可以缩短函数并使用半静态属性保存状态。使用该功能,您可以将当前音量与前一音量进行比较,如果它们不同,则播放声音
function incScore(){
incScore.level = incScore.level || 'L0'; //< initialize property
lvlimg = "L0" + scoreTotal < 500 ? 1 : scoreTotal < 1000 ? 2 : 3;
drawLevel(lvlimg);
if (incScore.level!=='L0' &&
incScore.level !== lvlimg) { lvlupSound(); };
// ^compare local level to current
incScore.level = lvlimg;
// ^ update local level
}
函数incScore(){
incScore.level=incScore.level | |“L0”;/
[编辑,基于注释]第三行是所谓的三元运算符或条件运算符。看见您可以使用更多条件
为了避免在乐谱达到第一级之前播放声音,您可以使用if(incScore.level!='L0'&&incScore.level!==lvlimg)
我已经创建了一个最简单的解决方案是将这些if语句的声音排除在外。如果级别很好且规则(每500点一次),并且当您升级时,分数总是以500的偶数倍的方式增加,那么这样做应该可以:
if(scoreTotal % 500 === 0 && scoreTotal < 1001)
{
lvlupSound();
}
如果你的级别边界不是那样规则的,显然会变得有点复杂,但这应该让你开始了。试试这样的方法():
然后,您可以通过将分数截止值添加到
levels
变量来轻松添加其他级别。是的,分数远大于1,它是由特定事件的数字乘以级别数字计算的。但我明白你的意思-如果我在之前得到分数,如果分数在之后突破阈值,那么声音就会播放。是的,没错。正如Taicho所说,在if/else语句的每一段中都有lvlupSound()
,这就是为什么它总是起作用的原因。不过,我认为您仍然需要调整它,使其仅在oldScore=lvlThreshold
时播放。为此,我觉得第三行有点问题,我觉得这对我来说有点高级。我有20个级别,因此首先我放弃了L0前缀,并相应地重命名了图像。但我不知道如何将我的级别阈值应用于该行。一级得分总和>500,二级得分总和>500和得分总和<20000,三级得分总和>20000和得分总和<50000,依此类推。。。以及如何避免在第一级播放声音。@Kooilnc感谢这一点,它还突出了我的代码是多么低效!有一个问题是,我需要在游戏结束时重置什么才能在后续游戏中立即停止levelup声音的播放?你可以重置incScore.level:我已经调整了JSFIDLE以证明(@)。标题有误导性。它不应该改为“如果某个值在特定值发生更改,则运行函数”@try catch最后,您可以单击“编辑”链接并更改标题。如果在审核后接受编辑,您甚至可以获得更高的声誉。
if( (scoreTotal % 500) > ((scoreTotal + increment) % 500)
{
lvlupSound();
}
var scoreTotal,
lastLevel = 0,
levels = [500, 1000, 2500, 5000, 10000, 25000, 50000, 75000],
currentLevel = 0,
lvlImg;
function incScore() {
while (scoreTotal > levels[currentLevel]) {
currentLevel++;
}
if (lastLevel !== currentLevel) {
lastLevel = currentLevel;
// gives a two digit number with a leading zero
lvlImg = ('0' + currentLevel).slice(-2);
drawLevel("L" + lvlimg);
lvlupSound();
}
}