Обработка P5 - проблема таймера с миллис () - PullRequest
0 голосов
/ 25 ноября 2011

Я делаю небольшую игру в Обработка , которая похожа на те игры в стиле 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<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, что является значением в миллисекундах.

Любая помощь приветствуется. Спасибо

Ответы [ 2 ]

3 голосов
/ 26 ноября 2011

Как насчет другого целого числа для сохранения времени, когда вы останавливаетесь и используете его для смещения таймера игры?

Итак, в режиме '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"));
}

Нажмите на эскиз, чтобы переключить режимы и посмотрите в консоль время. Вы заметите, что теряете всего несколько миллисекунд между переключателями, что является приемлемым.

0 голосов
/ 25 ноября 2011

Используйте не системный таймер, а специальный класс таймера с функцией паузы. Я уверен, что реализовать такой класс несложно. Я знаю, что в Java есть класс Timer, но, к сожалению, он не поддерживает функцию паузы.

...