Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/402.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在变量达到特定值时运行函数_Javascript_Jquery - Fatal编程技术网

Javascript 在变量达到特定值时运行函数

Javascript 在变量达到特定值时运行函数,javascript,jquery,Javascript,Jquery,我有一个canvas游戏,每次在游戏中执行一个动作来增加分数时,它都会调用incScore函数 在incScore中,我有一些if语句来绘制特定的图像,以表示画布上的级别编号 我还想有一个健全的发挥每一级了。按照我的方式,每次乐谱与if语句匹配时,lvlup声音都会播放 有人能帮我弄到这个吗?这样当音量改变时,声音只会播放一次,直到下一个音量改变时才会播放?我还提到我正在使用jQuery,以防它有任何可以帮助我的东西 incScore(); //everytime an action in th

我有一个canvas游戏,每次在游戏中执行一个动作来增加分数时,它都会调用incScore函数

在incScore中,我有一些if语句来绘制特定的图像,以表示画布上的级别编号

我还想有一个健全的发挥每一级了。按照我的方式,每次乐谱与if语句匹配时,lvlup声音都会播放

有人能帮我弄到这个吗?这样当音量改变时,声音只会播放一次,直到下一个音量改变时才会播放?我还提到我正在使用jQuery,以防它有任何可以帮助我的东西

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();
  }
}