1

我正在制作的程序是俄罗斯方块。我坚持的一个部分是当玩家达到一定分数时降低计时器的速度。例如,每 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();
  ...
}
4

4 回答 4

3

Timer.setDelay(int ms)

设置 Timer 的事件间延迟,即连续动作事件之间的毫秒数。这不影响初始延迟属性,可以通过 setInitialDelay 方法设置。

于 2012-04-19T00:48:05.787 回答
2

默认情况下,javax.swing.Timer合并事件;您可能会看到这种效果。您可以对动画进行自定时,如此处所示以验证您在最高速度(最短周期)下没有超出可用动画预算。

于 2012-04-19T01:01:52.570 回答
0

您可以创建一个类,例如处理所有基于时间的事件的 GameTimer。GameTimer 会将自己注册到 Timer,或使用您选择的任何时间测量方法。然后,您的其他对象可以将自己注册到 GameTimer(可能以他们想要的频率),GameTimer 会相应地通知他们。通过这种方式,您可以将自己从 Timer 中抽象出来,这通常是一个好主意,并且您可以更好地控制如何处理基于时间的事件。如果 GameTimer 注册到一个计时器并告诉它以 10 毫秒更新,那对于高达 100 fps 的精度应该足够了。然后你可以让 GameTimer 通知 BlockListener 任何你想要的度量。

这也意味着,如果您找到了一种更好的方法来测量时间,您将不必在多个地方更改代码。

于 2012-04-19T01:16:47.053 回答
0

计时器对象永远不会让您更改时间变量。您可以取消当前计时器并创建一个新计时器,使用 -20 作为参数并使用新计时器更新您的事件。我的 Swing Java-fu 很弱,但在 1.6 中,您可能可以调用 setDelay 以使用新时间(以毫秒为单位)更新现有计时器。

于 2012-04-19T00:52:12.820 回答