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

Run a function as far as a variable reaches specific values

本文关键字:运行 函数 变量      更新时间:2023-09-26

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

在incScore中,我有几个if语句来绘制一个特定的图像来表示画布上的级别数。

我还希望每升级一次都有声音播放。我所做的事情的方式是,每次分数匹配if语句时,都会播放levelup声音。

谁能帮我得到这个,这样的声音只会播放一次,当水平的变化,而不是再次,直到下一个级别的变化?我还提到我正在使用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();
    }
}

您可以缩短函数并使用半静态属性来保存状态。使用它,你可以将当前关卡与之前的关卡进行比较,并在它们不同时播放声音。

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
}

[edit,基于注释]第三行是所谓的三进制,或条件运算符。看到 MDN 。你可以使用更多的条件。

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

我创建了一个模型jsFiddle

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

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

最简单的解决方案是将声音从这些if语句中剔除。如果关卡是这样的(每500个点数)并且点数总是以某种方式增加,当你升级时,你总是会落在500的偶数倍上,那么像这样的内容应该可以做到:

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

如果你不能总是直接进入下一关的大门(也许玩家一次可以获得1到15分),那么你应该在增加玩家的分数之前使用类似的东西:

if( (scoreTotal % 500) > ((scoreTotal + increment) % 500)
{
    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();
}
   }

如果你的分数增量只有1,那么只在分数等于新关卡的阈值时播放音调

如果他们的分数增加超过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变量中来轻松添加其他关卡。