我试图让角色为攻击而移动,然后在攻击发生后再移回。我尝试先用thread.sleep
进行第一次移动,然后再进行攻击并向后移动,但它只会影响整个代码,就好像它是在所有内容之前而不是在中间。
我查了很多类似的问题,但没有一个能够适用于我想要的东西。
JButton btnAttack = new JButton("Attack");
btnAttack.addActionListener(new ActionListener() {
int theehp = currentehp;
int yourhp = maxhp;
public void actionPerformed(ActionEvent arg0) {
int damage = 0;
//moves to sleep
label.move(300, 50);
damage = (int) (Math.random()* 4 + 1);
theehp = theehp - damage;
ehplbl.setText(String.valueOf(theehp));
ehp.setValue(theehp);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
//moves back
label.move(39,46);
if (theehp <= 0){
combat.this.setVisible(false);
clip.close();
JOptionPane.showMessageDialog(panel, "You win!");
}else{
damage = (int) (Math.random()* 2 + 1);
yourhp = yourhp - damage;
hp.setValue(yourhp);
lblhp.setText(String.valueOf(yourhp));}
if (yourhp <=0){
combat.this.setVisible(false);
clip.close();
JOptionPane.showMessageDialog(panel, "You lose!");
}
};
});
btnAttack.setBounds(39, 393, 108, 61);
panel.add(btnAttack);
答案 0 :(得分:2)
Thread.sleep()实际上会阻止当前Thread在任何时间内运行任何东西。
如果您希望在线程处于休眠状态的同时完成其他工作,则必须将该工作放在另一个线程上。研究执行者和类似的事情,看看如何创建多个线程并正确管理它们。
请注意,除非你有2个以上的线程在运行,否则你的程序一次不会做多件事(至少在业务逻辑方面,JVM在后台自己的线程上做了很多事情)。
答案 1 :(得分:1)
添加John Humphreys所说的话:
调用actionPerformed(...)
的线程是swing事件调度线程(EDT)。它是处理所有用户输入的线程,并在屏幕上执行所有绘图。
正如John H.所说,Thread.sleep()
使调用线程处于睡眠状态。所以,如果你在actionPerformed()
方法中调用它,那么你就是让EDT进入睡眠状态。您的应用程序将无法响应任何用户输入,或者在sleep()返回之前显示屏幕上发生的任何事情。