2017-06-17 2 views
0

私はフルーツバスケットゲームを作りたいと思う。ここでのアイデアは、画面の上から下に果物を描きたいのですが、私はタイマーでそれをやりたいのです。私はいくつかの方法を試しましたが、結果はありません。ここに私がしたことがありますが、それは完全に間違っています。ゲームのためのタイマーを設定する

Timer timer = new Timer(); 
while (getY() != 1500) { 
     timer.schedule(new DrawFruit(frame, g, x) { 
      @Override 
      public void run() { 

       g.drawImage(Toolkit.getDefaultToolkit().getImage(Panel.class.getResource(Consts.ImageResource.APRICOT_DIR)), 500, getY(), frame); 
       frame.repaint(); 
       setY(getY() + 30); 

      } 
     }, 0, 1000); 
    } 

とDrawFruitクラス

abstract class DrawFruit extends TimerTask { 
private JFrame jFrame; 
private Graphics g; 
private int x; 

public JFrame getJFrame() { 
    return jFrame; 
} 

public void setJFrame(JFrame jFrame) { 
    this.jFrame = jFrame; 
} 

public Graphics getG() { 
    return g; 
} 

public void setG(Graphics g) { 
    this.g = g; 
} 

public int getX() { 
    return x; 
} 

public void setX(int x) { 
    this.x = x; 
} 

public DrawFruit(JFrame frame , Graphics g , int x){ 
    setJFrame(frame); 
    setG(g); 
    setX(x); 
} 


@Override 
public void run() { 

} 

}

+0

ようこそスタックオーバーフロー!デバッグの助けを求める質問( "なぜこのコードは動作しないのですか?")には、目的の動作、_a特定の問題またはerror_を含める必要があります。明確な問題文がない質問は、他の読者にとって有用ではありません。参照:[最小限で完全で検証可能なサンプルの作成方法](http://stackoverflow.com/help/mcve) –

+0

あなたがやっていることは、問題を引き起こします...タイマーベースのソリューションは、アニメーションループの素朴な実装です。 ** Delta-Timeループ**を調べてアニメーションに使用する理由を強くお勧めします。 – XenoRo

答えて

1

あなたは、ループのコードを使用してはいけません。タイマーのポイントは、ループを置き換えることです。すべてのタイマーは、指定された時間間隔でイベントを生成します。イベントが生成されると、 "Y"値を調整してコンポーネントを再描画するだけです。

ただし、このためにTimerTaskを使用しないでください。

スイングコンポーネントは、Event Dispatch Thread (EDT)で更新する必要があります。したがって、Swing Timerを使用する必要があります。実際の例については、チュートリアルを読んで始めましょう。

関連する問題