我正在Processing制作一个类似于那些吉他英雄风格游戏的小游戏,我正在尝试做两件事:
现在,我知道我不能停止时间,因为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个成员变量,noteToBePlayed
和timeToBePlayed
。方法getStartTime()
返回timeToBePlayed
,这是一个毫秒值。
感谢任何帮助。 感谢
答案 0 :(得分:3)
当您暂停并使用它来抵消游戏计时器时,如何使用另一个整数来存储时间?
因此,在'gameInProgress'模式下,您更新currentTimerValue
和previousTimerValue
,并在'暂停/菜单'模式下更新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类,但不幸的是它不支持暂停功能。