我正在用Java制作一个简单的棋盘游戏,我想在那里制作骰子滚动动画。所以我闪现了这样一个骰子的图片:
public Timer roll_dice = new Timer(50, this);
...
public void actionPerformed(ActionEvent evt) {
if(roll_dice.getDelay() > 500){
roll_dice.setDelay(50);
roll_dice.stop();
movePiece();
}else{
roll_dice.setDelay(roll_dice.getDelay() + 50);
dice_panel.repaint(0);
}
}
}
movePiece(){
//do some more painting
}
所以模具会显示随机数几次,然后慢慢确定一个数字。完成后,我想调用
movePiece()
方法。然而,事实上,重绘是偶尔发生的,并且会把所有的事情都搞砸,以便在骰子滚动实际完成动画之前调用movePiece()
。有没有人知道,只有在完成最后的重新喷漆后,我才能调用movepiece?
最佳答案
所以模具会显示随机数几次,然后慢慢确定一个数字。完成后,我想调用movePiece()方法。然而,事实上,重绘是偶尔发生的,并且会把所有的事情都搞砸,这样在骰子滚动实际完成动画制作之前,movePiece()就会被调用。
让我担心的是为什么你的画只是偶尔出现——它根本不应该这样做,也许这就是你需要修复的地方。我想知道你是否每次画图时都在读取文件中的图像,或者是其他导致画图速度减慢的原因。如果你在这个问题上需要更多的帮助,那么你就必须给我们更多关于你如何画画的信息。无论如何,您应该避免让程序逻辑依赖于绘制,因为您无法完全控制何时甚至是否会发生绘制。
与其重绘图像并调用repaint(),不如在程序启动时将滚动骰子图像放入ImageIcons,然后在Swing计时器中交换jLabel中的图标?当延迟时间足够长时,停止计时,在if块中,移动你的棋子。
因此,假设您有几个骰子,每个骰子都可以由一个jlabel显示,这个jlabel保存在一个称为dicelabels的jlabel数组中,imageicons可以保存在一个称为diceicons的数组中。然后你可以做如下事情:
public void actionPerformed(ActionEvent e) {
if (roll_dice.getDelay() > 500) {
roll_dice.setDelay(50);
roll_dice.stop();
movePiece(); // I like this -- this shouldn't change
} else {
roll_dice.setDelay(roll_dice.getDelay() + 50);
// dice_panel.repaint(0);
for (JLabel dieLabel : diceLabels) {
int randomIndex = random.nextInt(diceIcons.length);
dieLabel.setIcon(diceIcons[randomIndex]);
}
}
}
我喜欢你给
movePiece()
打电话时的逻辑,我认为这应该保持不变。