我有一个 Canvas 游戏,每次在游戏中执行某​​项操作以增加得分时,它都会调用函数incScore。

在incScore内部,我有一些if语句来绘制特定的图像,以表示 Canvas 上的级别号。

我还希望每级升级一次声音。每当分数与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();
    }
}

最佳答案

您可以缩短函数并使用半静态属性保存状态。使用该功能,您可以将当前级别与上一个级别进行比较,并在它们不同时播放声音。

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

关于javascript - 只要变量达到特定值就运行函数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14410216/

10-11 11:10