我正在制作的节目是俄罗斯方块。我坚持的一个部分是当玩家达到一定分数时降低计时器的速度。例如,每200个点(模数将检查)将减少50个时间。最初时间从500毫秒开始。我无法弄清楚如何减少它,因为一旦我创建了Timer,传入的时间就不会改变。
**我的构造函数实例化计时器。
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();
...
}
答案 0 :(得分:3)
设置Timer的事件间延迟,即连续动作事件之间的毫秒数。这不会影响初始延迟属性,可以通过setInitialDelay方法设置。
答案 1 :(得分:2)
默认情况下,javax.swing.Timer
会合并事件;你可能会看到这种效果。您可以自动定制动画,如here所示,以确认您没有超过最高速度(最短时间段)的可用动画预算。
答案 2 :(得分:0)
计时器对象永远不会对时间变量进行更改。您可以取消当前计时器并创建一个新计时器,以-20作为参数,并使用新计时器更新您的事件。我的Swing Java-fu很弱,但在1.6中,您可以调用setDelay以新的时间更新现有的计时器,单位为ms。
答案 3 :(得分:0)
你可以创建一个类,比如GameTimer来处理所有基于时间的事件。 GameTimer会将自己注册到Timer,或者使用您选择的任何时间测量方法。然后,您的其他对象可以将自己注册到GameTimer(可能具有所需的频率),GameTimer将相应地通知他们。这样你就可以从Timer中抽象出来,这通常是一个好主意,你可以更好地控制基于时间的事件的处理方式。如果GameTimer注册到一个计时器并告诉它在10ms更新,这应该足够精确到高达100fps。然后,您可以让GameTimer通知BlockListener,无论您想要什么样的度量。
这也意味着如果您找到更好的方法来衡量时间,您就不必在多个地方更改代码。