2012-04-19 2 views
1

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

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

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(); 
    ... 
} 

ответ

3

Timer.setDelay(int ms)

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

+0

Прошу прощения, я только что добавил последнюю версию Java Doc за 1.7, чтобы указать на ссылку :-) –

0

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

2

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

+0

Я все еще новичок, но то, что я пытаюсь сделать, это просто обновить время. Я просто не могу понять, как его обновить. Я могу изменить значение для него, но я не могу заставить его перейти в объект Timer, чтобы уменьшить скорость. –

+0

Этот [пример] (http://stackoverflow.com/a/5048863/230513) использует 'setDelay()' для изменения скорости, как предлагает @Greg Kopf. – trashgod

0

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

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

Смежные вопросы