连接四个下降动画

时间:2013-04-24 05:03:11

标签: java swing graphics graphics2d updating

我目前正在创建一个连接四游戏以获得乐趣,当我决定添加一个下降动画会很酷时,它就要完成了。我知道有几种不同的方法,但我不确定什么是“最好的”。

由于我的GUI由JComponents组成,我认为我应该使用javax.swing.Timer来保护线程安全。

ActionListener update = new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                // TODO Auto-generated method stub
            };
        };
        Timer timer = new Timer(10, update);
        timer.start();

我真正的问题是如何更新我的游戏板? 最好是调用repaint()(甚至可能是repaint(Rectangle rec))并处理paint()中的所有内容,或者为连接四件创建另一个类,并将该组件添加到我的GUI中。

我连接四件的另一课目前就是这个......

public class Piece extends JLabel{
private Color color;
private Ellipse2D circle;

public Piece(Color color, int radius) {
    this.color = color;
    circle = new Ellipse2D.Float(0, 0, radius, radius);
}

@Override
protected void paintComponent(Graphics g) {
    Graphics2D g2 = (Graphics2D)g;
    g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
    super.paintComponent(g2);
    g2.setColor(color);
    g2.fill(circle);
}
}

如果我将组件添加到GUI,我必须经常调用invalidate()validate(),因为我目前的计时器速度很快,而且我不确定这是好还是坏而不是致电repaint()

我已经尝试了这两种方式,两者似乎都运行良好,我只是不确定哪种更有效?为了学习目的,我宁愿不要让它变得更加繁重。

如果有比我想象的更好的方式,请告诉我。我对所有建议持开放态度

2 个答案:

答案 0 :(得分:1)

这将取决于。最简单的解决方案(从我的角度来看)是使用自定义绘画(使用repaint并处理paintComponent中的所有内容,因为它可以让您更好地控制图形层(IHMO)。

作为练习,你可以做到这两点。

基本上,它需要您(直接或间接)管理您自己的部件和板的布局管理器。

答案 1 :(得分:1)

你的作品是一个组成部分。您所要做的就是调用setLocation(...),组件将自动重新绘制。无需任何自定义绘画。

  

如果我将组件添加到GUI,我将不得不调用invalidate()和validate()

只需将布局设置为null即可。您需要设置组件的大小,但不需要调用invalidate()或validate(),因为布局管理器使用这些方法。