処理P5 - millis()によるタイマーの問題

私は処理でGuitar Heroスタイルのゲームに似た小さなゲームを作っています。私は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 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 私が書いたコード>。これには、 noteToBePlayed timeToBePlayed という2つのメンバ変数があります。 getStartTime()メソッドは、ミリ秒の値である timeToBePlayed を返します。

どんな助けもありがとうございます。 ありがとう

0

2 答え

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

したがって、 'gameInProgress'モードでは currentTimerValue previousTimerValue を更新し、 'paused/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"));
}

スケッチをクリックしてモードを切り替え、コンソールで時間を調べます。あなたはトグルの間にわずか数ミリメートルしか緩和しないことに気付くでしょう。

3
追加された
うわー、私はそれが何か単純だと分かっていた!私は、オフセットを追跡するために余分な数値を必要としていると考えましたが、その周りに私の頭を包むことはできませんでした。ありがとう。
追加された 著者 eoinzy,

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

0
追加された