我有一个画布游戏,每次在游戏中执行动作时都会调用函数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();
}
}
答案 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
变量来轻松添加其他级别。