1

私が作っている私のプログラムはテトリスです。私が行き詰まった部分の1つは、プレーヤーが特定のスコアに達したときにタイマーの速度を下げることでした。たとえば、200ポイントごとに(モジュロでチェックされます)、時間はたとえば50減少します。最初は、時間は500ミリ秒で開始されました。タイマーを作成すると、渡される時間は変わらないので、それを減らす方法がわかりません。

**タイマーをインスタンス化する私のコンストラクター。

public PlayingPanel(SidePanel p)
{
  pf = new PlayingField(p);
  generateNewPiece(); 
  setFocusable(true);
  addKeyListener(new KeyEvent());
  timer = new Timer(time, new BlockListener());
  timer.start();   
}

public void startTimer()
{
  time -= 20;
}

/**
 * generates new piece
 */
public void generateNewPiece()
{
  startTimer();
  ...
}
4

4 に答える 4

3

Timer.setDelay(int ms)

タイマーのイベント間遅延、連続するアクションイベント間のミリ秒数を設定します。これは、setInitialDelayメソッドで設定できる初期遅延プロパティには影響しません。

于 2012-04-19T00:48:05.787 に答える
2

デフォルトでは、イベントjavax.swing.Timer合体します。この効果が見られる場合があります。ここに示すように、アニメーションの時間をセルフタイムにして、最高速度(最短期間)で利用可能なアニメーションバジェットを超えていないことを確認できます。

于 2012-04-19T01:01:52.570 に答える
0

タイマーオブジェクトは、時間変数への変更を取得することはありません。現在のタイマーをキャンセルして、-20を引数として新しいタイマーを作成し、新しいタイマーでイベントを更新できます。私のSwingJava-fuは弱いですが、1.6では、setDelayを呼び出して、既存のタイマーをミリ秒単位の新しい時間で更新できる場合があります。

于 2012-04-19T00:52:12.820 に答える
0

すべての時間ベースのイベントを処理するGameTimerなどのクラスを作成できます。GameTimerはそれ自体をタイマーに登録するか、選択した時間測定方法を使用します。その後、他のオブジェクトはGameTimerに(おそらく希望の頻度で)登録でき、GameTimerはそれに応じて通知します。このようにして、タイマーから自分自身を抽象化します。これは一般的には良い考えであり、時間ベースのイベントの処理方法をより適切に制御できます。GameTimerがタイマーに登録し、10msで更新するように指示した場合、最大100fpsの精度で十分です。その後、GameTimerにBlockListenerに通知させることができます。

これは、時間を測定するためのより良い方法を見つけた場合でも、複数の場所でコードを変更する必要がないことも意味します。

于 2012-04-19T01:16:47.053 に答える