admin管理员组

文章数量:1379725

I have a canvas game which calls a function incScore every time an action is performed in the game to increase the score.

Inside incScore I have a few if statements to draw a particular image to represent a level number on the canvas.

I also want to have a sound play once per level up. The way I've gone about things the lvlup sound will play every time the score matches the if statement.

Can anyone please help me get this so that the sound will only play once when the level changes and not again until the next level change? I'm also mention I'm using jQuery incase it has anything that could help me.

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

I have a canvas game which calls a function incScore every time an action is performed in the game to increase the score.

Inside incScore I have a few if statements to draw a particular image to represent a level number on the canvas.

I also want to have a sound play once per level up. The way I've gone about things the lvlup sound will play every time the score matches the if statement.

Can anyone please help me get this so that the sound will only play once when the level changes and not again until the next level change? I'm also mention I'm using jQuery incase it has anything that could help me.

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();
    }
}
Share Improve this question edited Jan 20, 2013 at 7:50 try-catch-finally 7,6446 gold badges49 silver badges71 bronze badges asked Jan 19, 2013 at 1:29 maomao 1,0773 gold badges24 silver badges44 bronze badges 2
  • The title is misleading. Shouldn't it rather read "Run function if a value changes at specific values" – try-catch-finally Commented Jan 19, 2013 at 9:55
  • @try-catch-finally You can click the "edit" link and change the title. You even gain more reputation if the edit is accepted after review. – That Brazilian Guy Commented Jan 20, 2013 at 1:21
Add a ment  | 

6 Answers 6

Reset to default 3

You could shorten your function and use a semi static property to save the state. Using that, you can pare the current level to the previous and play a sound if they differ.

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(); };
        //  ^pare local level to current
        incScore.level = lvlimg;
        //             ^ update local level
}

[edit, based on ment] The third line is a so called ternary, or conditional operator. See MDN. You can use more conditions.

To avoid playing a sound before the score has reached a first level, you could use
if (incScore.level!=='L0' && incScore.level !== lvlimg).

I've created a mockup jsFiddle

A simple solution could be paring the current level to the old one, to detect when the level changed:

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

The easiest solution is to factor the sound out of those if statements. If the levels are nice and regular like that(every 500 points) and the points always increase in a way that you will always land exactly on an even multiple of 500 when you level up, something like this should do:

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

If you won't always land directly on the gate to the next level(maybe the player can earn anywhere between 1 and 15 points at a time) then you should be able to get by using something along the lines of this before you increment the player's score:

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

if your level boundries are not regular like that obviously it gets a little bit more plex, but that should get you started.

That is because you have the in every statement for every score (which means from 0 to infinite).

You will need to write inner if statements such as;

if (scoreTotal < 500){
        lvlimg = "L01";
        drawLevel(lvlimg);
        if(scoreTotal x times of each the level) // That means for each level pleted
{
        lvlupSound();

}
   }

If your score increment is only 1, then only play the tone when the score equals the threshold for a new level.

If they can increase their score by more than 1, then you could pass the number of points in and check the score before and after to see if the numbers fall on each side of the threshold.

If that still doesn't work, some more info on the "level" and points would be appreciated.

Try something like this (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();
  }
}

Then you can easily add additional levels by adding the score cutoff to the levels variable.

本文标签: javascriptRun a function as far as a variable reaches specific valuesStack Overflow