在java中实现Swing Timer的难度

时间:2014-09-14 22:25:10

标签: java swing timer

在这个java游戏中,我有一个动画类,可以从spritesheet渲染帧。特别是对于攻击,我做了一个不同的渲染方法(renderAttack),因为我希望它渲染动画的所有16帧,每个帧之间有30毫秒。我正在研究如何延迟drawImage调用,并决定一个Swing Timer可能是最好的选择。但是,我正在努力把它放进去。这就是我想要做的事情,没有计时器:

public class Animation {

    public void renderAttack(Graphics g, int x, int y, int width, int height) {

        for(int index = 0; index < 16; index++)
        {
            g.drawImage(images[index], x, y, width, height, null);
            //wait 30ms
        } 
    }
}

要等待那30毫秒,我尝试在这里使用定时器。到目前为止我有这个:

public class Animation {

    public void renderAttack(Graphics g, int x, int y, int width, int height) {

        ActionListener taskPerformer = new ActionListener();
        Timer timer = new Timer(30, taskPerformer);
        timer.start();
    }
}

但是,它会在哪里发生,它接受的ActionEvent是什么?我怎样才能传入索引变量?

public void actionPerformed(ActionEvent e) {

    g.drawImage(images[index], x, y, width, height, null);
}

希望这有任何意义......我现在一步一步地修复它。

1 个答案:

答案 0 :(得分:1)

Swing是一个单线程环境。您需要在单独的线程中创建动画。我会建议这样的事情:

public class Animation {
    Image[] images = null;

    public Animation() {
        // Define your images here and add to array;        
    }

    class AttackTask extends SwingWorker<Void, Void> {

        Graphics g = null;
        int x,y,width,height;

        AttackTask(Graphics g, int x, int y, int width, int height) {
            this.g = g;
            this.x = x;
            this.y = y;
            this.width = width;
            this.height = height;
        }

        @Override
        protected Void doInBackground() throws Exception {

            for(int frame = 0; frame < 16; frame++)
            {
                g.drawImage(images[frame], x, y, width, height, null);
                Thread.sleep(30);
            }

            return null;
        }

        @Override
        protected void done() {
            // Do something when thread is completed                    
        } 
    }
}