0

私はProcessingで、GuitarHeroスタイルのゲームに似た小さなゲームを作成しています。2つのことをしようとしています。

  1. ゲームがロードされたら、時間が移動しないようにします
  2. ゲーム中に、一時停止機能を許可します

これで、millis()がアプリケーションの起動からミリ秒を返すため、時間を止めることができないことがわかりました。したがって、タイマーはmillis() - millis()開始時にゼロに等しくなる必要があります。したがって、ユーザーがSTARTを押すと、明らかに開始時に開始できます。 。ゲームは、字幕ファイルと同様に、再生されるノートと画面に表示されるミリ秒単位の時間を含むファイルを開始時に読み取ります。

私の問題は、ゲームを一時停止するとタイマーが動き続け、ゲームの一時停止を解除すると、コードからわかるように、ロジックが原因ですべてのメモが「束ねられる」ことです。

誰かが私が使用しているものよりも優れたアルゴリズムを提案できますか?その遅く、私はこれに昼夜を問わず取り組んできました。問題は以下にあると思いfor()ます:

public void draw()
{
    if (gameInProgress)
    {
        currentTimerValue = millis(); // Update the timer with the current milliseconds
        // Check to see if the note times falls between the current time, or since the last loop (difficult to match exact millisecond)
        for(int i=0 ; i<songNotes.length ; i++)
        {
             if( songNotes[i].getStartTime() > previousTimerValue && songNotes[i].getStartTime() <=currentTimerValue)
                notes.add(songNotes[i]);
        }

        noStroke();
        textFont(f,18);
        drawButtons();  //Draws coloured buttons relating to Button presses on the controller
        drawHighScoreBox(); // Draws high score box up top right
        drawLines();  // Draws the strings
        moveNotes();  // Moves the notes across from right to left
        //Now set the cutoff for oldest note to display
        previousTimerValue=currentTimerValue;  //Used everytime on the following loop
    }
    else
    {
        drawMenu(); // Draw the Main/Pause menu
    }
}

注:ブール値gameInProgressは、ユーザーが一時停止ボタン(たとえば、「P」)を押すと下に設定され、私が自分で作成したsongNotesタイプのオブジェクトの配列です。Note2つのメンバー変数、noteToBePlayedおよびがありtimeToBePlayedます。このメソッドは、ミリ秒の値をgetStartTime()返します。timeToBePlayed

どんな助けでも大歓迎です。ありがとう

4

2 に答える 2

3

一時停止したときに時間を保存するために別の整数を用意し、それを使用してゲームタイマーをオフセットするのはどうですか?

したがって、「gameInProgress」モードでは更新currentTimerValueし、「paused previousTimerValue/menu」モードpausedTimerValueでは「currentTimerValue」をオフセットするために使用するを更新します。私はこれが理にかなっていることを願っています、それは言葉でもっと複雑に聞こえます、これが私が意味することです:

boolean gameInProgress = true;
int currentTimerValue,previousTimerValue,pausedTimerValue;
void setup(){

}
void draw(){
  if(gameInProgress){
    currentTimerValue = millis()-pausedTimerValue;
    println("currentTimerValue: " + currentTimerValue + " previousTimerValue: " + previousTimerValue);  
    previousTimerValue=currentTimerValue;
  }else{
    pausedTimerValue = millis()-currentTimerValue;
  }
}
void mousePressed(){
  gameInProgress = !gameInProgress;
  println("paused: " + (gameInProgress ? "NO" : "YES"));
}

スケッチをクリックしてモードを切り替え、コンソールで時間を確認します。トグルの間に数ミリしか緩んでいないことに気付くでしょう。これは許容範囲です。

于 2011-11-25T20:26:23.283 に答える
0

システムタイマーではなく、一時停止機能を備えた特別なタイマークラスを使用します。そのようなクラスを自分で実装するのは難しいことではないと確信しています。JavaにはTimerクラスがあることは知っていますが、残念ながら一時停止機能はサポートされていません。

于 2011-11-25T16:58:47.917 に答える