处理P5 - 使用millis()定时器问题

时间:2011-11-25 04:09:18

标签: java timer milliseconds processing

我正在Processing制作一个类似于那些吉他英雄风格游戏的小游戏,我正在尝试做两件事:

  1. 当游戏加载时,停止移动时间
  2. 在游戏过程中,允许暂停功能
  3. 现在,我知道我不能停止时间,因为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是我自己编写的Note类型的对象数组。它有2个成员变量,noteToBePlayedtimeToBePlayed。方法getStartTime()返回timeToBePlayed,这是一个毫秒值。

    感谢任何帮助。 感谢

2 个答案:

答案 0 :(得分:3)

当您暂停并使用它来抵消游戏计时器时,如何使用另一个整数来存储时间?

因此,在'gameInProgress'模式下,您更新currentTimerValuepreviousTimerValue,并在'暂停/菜单'模式下更新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"));
}

单击草图切换模式并在控制台中查看次数。你会注意到你只能在肘节之间松动几毫米,这是可以接受的。

答案 1 :(得分:0)

不使用系统计时器,而是使用具有暂停功能的特殊计时器类。我相信你自己实施这样的课程并不困难。我知道java有Timer类,但不幸的是它不支持暂停功能。