3

私が作成しているゲームでは、10 秒間だけ表示してから消えたいというパワーアップがあります。そのため、パワーアップするたびに、Timer初期遅延を 10 秒 (10_000) に設定してスイングを実行し、繰り返しを false に設定して、1 回だけ実行するようにします。

最初に電源を入れると、意図したように 10 秒間しか表示されませんが、もう一度取得すると、ランダムな時間だけ表示されます (ただし、10 秒を超えることはありません)。そのため、繰り返されるようです。 . setRepeats(false);では、動作しないときに一度実行した後に停止するにはどうすればよいですか?

これは、電源を入れたときに何が起こるかのコードです。

if(!power.getPowerUp()){
 double xAirdrop = xSize - 500;
 double yAirdrop = ySize - 500;
 power.setX(Math.random() * xAirdrop + 64);
 power.setY(Math.random() * yAirdrop + 150);
 power.setPowerUp(true);
 Timer powerTimer = new Timer(10_000, new ActionListener(){
  public void actionPerformed(ActionEvent e){
   power.setPowerUp(false);  
   power.setWidth(power.getCrate().getWidth(null) + 250);
   power.setHeight(power.getCrate().getHeight(null) + 250);
  }
 });
 powerTimer.setInitialDelay(10_000);
 powerTimer.setRepeats(false);
 powerTimer.start();
}
4

1 に答える 1

2

問題は、イベントが発生していなくてもタイマーがまだ実行されているため、実行start()するとサイクルの途中になることです。これにより、実行時間が 10 秒より短くなります。後続の実行restart()ではなく実行する必要があります。start()最初の実行でも機能する場合があります。

 powerTimer.setInitialDelay(10_000);
 powerTimer.setRepeats(false);
 powerTimer.restart();

javadoc から:

restart() Timer を再起動し、保留中の起動をキャンセルして、最初の遅延で起動させます。

http://docs.oracle.com/javase/6/docs/api/javax/swing/Timer.html#restart()

于 2013-05-05T07:38:10.233 に答える