只要变量达到特定值,就运行一个函数

时间:2013-01-19 01:29:41

标签: javascript jquery

我有一个画布游戏,每次在游戏中执行动作时都会调用函数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();
    }
}

6 个答案:

答案 0 :(得分:3)

一个简单的解决方案是将当前级别与旧级别进行比较,以检测级别何时发生变化:

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

答案 1 :(得分:3)

您可以缩短功能并使用半静态属性来保存状态。使用它,您可以将当前级别与之前的级别进行比较,如果它们不同则播放声音。

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
}

[编辑,基于评论]第三行是所谓的三元条件运算符。见MDN。您可以使用更多条件。

为避免在乐谱达到第一级之前播放声音,您可以使用
if (incScore.level!=='L0' && incScore.level !== lvlimg)

我创建了mockup jsFiddle

答案 2 :(得分:2)

最简单的解决方案是将声音从if语句中分解出来。如果水平很好而且经常那样(每500分)并且积分总是会增加,当你升级时你将总是准确地落在500的偶数倍上,这样的事情应该做:

if(scoreTotal % 500 === 0 && scoreTotal < 1001)
{
    lvlupSound();
}

如果你不会总是直接降落到下一级门口(也许玩家可以一次获得1到15点之间的任何收益)那么你应该能够通过使用之前的某些东西获得你增加了玩家的分数:

if( (scoreTotal % 500) > ((scoreTotal + increment) % 500)
{
    lvlupSound();
}

如果你的等级界限不那么规则,那么显然它会变得有点复杂,但这应该让你开始。

答案 3 :(得分:1)

这是因为你在每个分数的每个陈述中都有(这意味着从0到无限)。

您需要编写内部if语句,例如;

if (scoreTotal < 500){
        lvlimg = "L01";
        drawLevel(lvlimg);
        if(scoreTotal x times of each the level) // That means for each level completed
{
        lvlupSound();

}
   }

答案 4 :(得分:1)

如果您的分数增量仅为1,则只有当分数等于新等级的阈值时才播放音调。

如果他们的分数可以增加1以上,那么你可以通过分数并检查分数前后的分数,看看数字是否落在门槛的每一边。

如果仍然不起作用,可以欣赏更多关于“关卡”和积分的信息。

答案 5 :(得分:1)

尝试这样的事情(demo):

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

然后,您可以通过将分数截止值添加到levels变量来轻松添加其他级别。