在这个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);
}
希望这有任何意义......我现在一步一步地修复它。
答案 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
}
}
}