gpt4 book ai didi

java - 处理 P5 - millis() 的计时器问题

转载 作者:行者123 更新时间:2023-12-02 00:34:11 26 4
gpt4 key购买 nike

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

  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
}
}

注意:当用户按下暂停按钮(例如“P”)时, boolean 值 gameInProgress 在下面设置,而 songNotes 类型的对象数组注意是我自己写的。它有 2 个成员变量,noteToBePlayedtimeToBePlayed。方法getStartTime()返回timeToBePlayed,它是一个毫秒值。

感谢任何帮助。谢谢

最佳答案

当你暂停时使用另一个整数来存储时间并使用它来抵消游戏计时器怎么样?

因此,在“gameInProgress”模式下,您更新 currentTimerValuepreviousTimerValue,在“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"));
}

单击草图可切换模式并在控制台中查看时间。您会注意到切换之间只损失了几毫秒,这是可以接受的。

关于java - 处理 P5 - millis() 的计时器问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8264738/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com