只要变量达到特定值,就运行函数
Run a function as far as a variable reaches specific values
我有一个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
变量中来轻松添加其他关卡。
- jQuery在元素的上下文中运行函数
- Promise函数在.then之后未运行函数化
- 在.append之后运行函数
- 在on.change事件之后运行函数
- 如果文本或值以字符开头,请运行函数
- 如何在节点模块中从命令行运行函数
- 在Fancybox中提交表单时运行函数
- Don'如果字段为空,则不运行函数
- Javascript:如何在页面重新加载后运行函数
- 成功ajax:如果是200状态代码,则运行函数else另一个函数
- 运行函数ifsuccess($.ajax)有200个状态代码
- JavaScript只有在最后一次被调用时才运行函数
- 在异步AJAX调用完成后,通过变量运行函数
- ng中继器打印结果0;当我运行函数时
- 谷歌扩展:如何在弹出窗口中按下按钮时在我的javascript文件中运行函数
- 获取对在 JavaScript 中运行函数的对象的引用
- 运行函数时出错
- 节点.js子进程中的运行函数
- $.getJSON 在返回数据后不会运行函数
- 如果onchange为true,如何运行函数