2

ゲームでアクションが実行されるたびに関数incScoreを呼び出してスコアを上げるキャンバスゲームがあります。

incScore内には、キャンバス上のレベル番号を表す特定の画像を描画するためのifステートメントがいくつかあります。

また、レベルアップごとに1回音を鳴らしたいです。私が行った方法では、スコアがifステートメントと一致するたびにlvlupサウンドが再生されます。

レベルが変更されたときにサウンドが1回だけ再生され、次のレベルが変更されるまでサウンドが再生されないように、誰かがこれを取得するのを手伝ってもらえますか?また、jQueryに役立つものがある場合に備えて、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();
    }
}
4

6 に答える 6

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()
    }
}
于 2013-01-19T01:36:21.190 に答える
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
}

[編集、コメントに基づく] 3行目は、いわゆる三項演算子、つまり条件演算子です。MDNを参照してください。より多くの条件を使用できます。

スコアが最初のレベルに達する前にサウンドを再生しないようにするには、を使用できます
if (incScore.level!=='L0' && incScore.level !== lvlimg)

モックアップjsFiddleを作成しました

于 2013-01-19T01:36:35.170 に答える
2

最も簡単な解決策は、これらのifステートメントからサウンドを除外することです。レベルがそのように素晴らしく規則的であり(500ポイントごと)、レベルアップしたときに常に500の倍数に正確に着地するようにポイントが常に増加する場合は、次のようにする必要があります。

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

次のレベルへのゲートに常に直接着地するとは限らない場合(おそらく、プレイヤーは一度に1〜15ポイントのどこでも獲得できます)、インクリメントする前に、これに沿って何かを使用することで取得できるはずです。プレーヤーのスコア:

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

レベルの境界がそのように規則的でない場合は、明らかに少し複雑になりますが、それで始めることができます。

于 2013-01-19T01:47:16.170 に答える
1

これは、すべてのスコア(つまり、0から無限)のすべてのステートメントにinがあるためです。

次のようなinnerifステートメントを記述する必要があります。

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

}
   }
于 2013-01-19T01:35:34.617 に答える
1

スコアの増分が1しかない場合は、スコアが新しいレベルのしきい値に等しいときにのみトーンを再生します。

スコアを1以上増やすことができる場合は、ポイント数を渡し、前後のスコアをチェックして、数値がしきい値の両側にあるかどうかを確認できます。

それでもうまくいかない場合は、「レベル」とポイントに関する詳細情報をいただければ幸いです。

于 2013-01-19T01:35:50.937 に答える
1

このようなものを試してください(デモ):

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次に、スコアカットオフを変数に追加することで、レベルを簡単に追加できます。

于 2013-01-19T03:38:36.037 に答える