2

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

6 回答 6

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()
    }
}
于 2013-01-19T01:36:21.190 回答
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).

我创建了一个模型 jsFiddle

于 2013-01-19T01:36:35.170 回答
2

最简单的解决方案是将声音从这些 if 语句中剔除。如果水平像那样好且有规律(每 500 点),并且点数总是以一种方式增加,当你升级时,你总是会精确地落在 500 的偶数倍上,这样的事情应该这样做:

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

如果您不会总是直接降落在通往下一个级别的大门上(也许玩家一次可以获得 1 到 15 分之间的任何点),那么您应该能够在增加之前使用类似的东西来获得玩家得分:

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

如果你的关卡边界不是那样的规则,显然它会变得有点复杂,但这应该让你开始。

于 2013-01-19T01:47:16.170 回答
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();

}
   }
于 2013-01-19T01:35:34.617 回答
1

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

如果他们可以将他们的分数提高 1 以上,那么您可以传递分数并检查前后分数,看看分数是否落在阈值的每一侧。

如果这仍然不起作用,将不胜感激有关“级别”和积分的更多信息。

于 2013-01-19T01:35:50.937 回答
1

尝试这样的事情(演示):

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然后,您可以通过将分数截止值添加到变量来轻松添加其他级别。

于 2013-01-19T03:38:36.037 回答