Таймер в java, убывающая скорость

Моя программа, которую я делаю, это тетрис. Одна часть, на которой я застрял, заключалась в уменьшении скорости таймера, когда игрок набирает определенное количество очков. Например, каждые 200 точек (по модулю будет проверяться) будут уменьшать время, скажем, на 50. Первоначально время начиналось с 500 мс. Я не могу понять, как его уменьшить, потому что после того, как я создал таймер, переданное время не изменилось.

** Мой конструктор, который создает экземпляр таймера.

public PlayingPanel(SidePanel p)
{
  pf = new PlayingField(p);
  generateNewPiece(); 
  setFocusable(true);
  addKeyListener(new KeyEvent());
  timer = new Timer(time, new BlockListener());
  timer.start();   
}

public void startTimer()
{
  time -= 20;
}

/**
 * generates new piece
 */
public void generateNewPiece()
{
  startTimer();
  ...
}

person Java investor    schedule 19.04.2012    source источник


Ответы (4)


Timer.setDelay(int ms)

Устанавливает задержку таймера между событиями, количество миллисекунд между последовательными событиями действия. Это не влияет на свойство начальной задержки, которое можно установить методом setInitialDelay.

person Greg Kopff    schedule 19.04.2012
comment
Прошу прощения, я только что добавил последнюю версию Java Doc для 1.7, чтобы указать на ссылку :-) - person nIcE cOw; 19.04.2012

По умолчанию javax.swing.Timer будет объединять события; вы можете видеть этот эффект. Вы можете синхронизировать свои анимации, как показано здесь, чтобы убедиться, что вы не превышаете максимально доступный бюджет анимации. скорость (кратчайший период).

person trashgod    schedule 19.04.2012
comment
Я все еще новичок, но я пытаюсь просто обновить время. Я просто не могу понять, как его обновить. Я могу изменить его значение, но я не могу заставить его войти в объект Timer, чтобы уменьшить скорость. - person Java investor; 19.04.2012
comment
Этот пример использует setDelay() для изменения скорости, как предлагает @Greg Kopf. - person trashgod; 19.04.2012

Объект таймера никогда не получит ваши изменения в переменной времени. Вы можете отменить текущий таймер и создать новый с -20 в качестве аргумента и обновить свои события с помощью нового таймера. Мой Swing Java-fu слаб, но в 1.6 вы можете вызвать setDelay, чтобы обновить существующий таймер новым временем в мс.

person Nick Martin    schedule 19.04.2012

Вы можете создать класс, скажем, GameTimer, который обрабатывает все события, зависящие от времени. GameTimer зарегистрируется в таймере или будет использовать любой метод измерения времени, который вы выберете. Затем другие ваши объекты могут зарегистрироваться в GameTimer (возможно, с желаемой частотой), и GameTimer уведомит их соответствующим образом. Таким образом, вы абстрагируетесь от Timer, что, как правило, является хорошей идеей, и лучше контролируете, как обрабатываются временные события. Если GameTimer регистрируется на таймере и сообщает ему об обновлении через 10 мс, этой точности должно быть достаточно для скорости до 100 кадров в секунду. Затем вы можете сделать так, чтобы GameTimer уведомлял BlockListener о каждой мере, которую вы хотите.

Это также означает, что если вы когда-нибудь найдете лучший способ измерения времени, вам не придется менять код в нескольких местах.

person elite5472    schedule 19.04.2012