我正在制作一个Java游戏,想添加一个射击技师,如果用户单击它,将立即射击子弹,但如果按住它,它将以连续速率射击子弹。我可以通过使用Timer
并以固定的速率安排任务来部分实现此目标,但是如果用户再次单击该位置,它将立即拍摄,从而无法达到固定速率延迟的目的。
这是我到目前为止所拥有的:
private Game game;
private Timer timer = new Timer();
@Override
public void mousePressed(MouseEvent e) {
this.timer = new Timer();
this.timer.scheduleAtFixedRate(new TimerTask() {
@Override
public void run() {
for(int i = 0; i < game.playerGun.getBulletsPerShot(); i ++) {
try {
game.shoot();
TimeUnit.MILLISECONDS.sleep((long) (game.playerGun.getDelayBetweenEachBullet() * 1000) );
} catch (IOException | InterruptedException e1) {
e1.printStackTrace();
}
}
}
}, (long)game.playerGun.getDelayBetweenEachShot() * 1000, (long) (game.playerGun.getDelayBetweenEachShot() * 1000));
}
@Override
public void mouseReleased(MouseEvent e) {
this.timer.cancel();
}
我还读到Timer最好用ScheduledExecutorService
代替,而使用sleep()
则可能会引起漂移,而且不太灵活。