我正在用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()打电话时的逻辑,我认为这应该保持不变。

10-06 09:46