2011-10-21 9 views
1

プログラムを実行すると、すべて正常に動作しますが、すべて動作しますがグラフィックスは常に点滅します。私はこのようなことをするのが初めてで、これをどのように修正するのか分かりません。グラフィックス点滅

import java.awt.Frame; 
import java.awt.Graphics; 
import java.awt.Rectangle; 
import java.awt.event.KeyEvent; 
import java.awt.event.KeyListener; 
import java.awt.event.MouseEvent; 
import java.awt.event.MouseMotionListener; 


public class MovementTest extends Frame implements Runnable, MouseMotionListener, KeyListener { 

    private static Thread thread; 
    private int mouseX, mouseY; 
    private boolean movingRight; 
    private boolean movingLeft; 
    private boolean movingUp; 
    private boolean movingDown; 

    private Rectangle player = new Rectangle(50, 50, 100, 100); 
    private Rectangle wallOne = new Rectangle(400, 50, 100, 100); 

    public MovementTest() { 
     setSize(800, 600); 
     setVisible(true); 
     addKeyListener(this); 
     addMouseMotionListener(this); 
    } 

    public static void main(String[] args) { 
     thread = new Thread(new MovementTest()); 
     thread.start(); 
    } 

    @Override 
    public void run() { 
     try { 
      while(true) { 
       if(player.intersects(wallOne)) { 
        thread.stop(); 
        break; 
       } 
       if(movingRight) { 
        player.x++; 
       } else if(movingLeft) { 
        player.x--; 
       } 
       if(movingUp) { 
        player.y--; 
       } else if(movingDown) { 
        player.y++; 
       } 
       paint(getGraphics()); 
       Thread.sleep(5); 
      } 
     } catch (InterruptedException e) { 
      e.printStackTrace(); 
     } 
    } 

    @Override 
    public void keyPressed(KeyEvent e) { 
     int key = e.getKeyCode(); 
     if (key == KeyEvent.VK_D) 
      movingRight = true; 
     if (key == KeyEvent.VK_A) 
      movingLeft = true; 
     if (key == KeyEvent.VK_W) 
      movingUp = true; 
     if (key == KeyEvent.VK_S) 
      movingDown = true; 
    } 

    @Override 
    public void keyReleased(KeyEvent e) { 
     int key = e.getKeyCode(); 
     if (key == KeyEvent.VK_D) 
      movingRight = false; 
     if (key == KeyEvent.VK_A) 
      movingLeft = false; 
     if (key == KeyEvent.VK_W) 
      movingUp = false; 
     if (key == KeyEvent.VK_S) 
      movingDown = false; 
    } 

    @Override 
    public void keyTyped(KeyEvent arg0) { 
     // TODO Auto-generated method stub 

    } 

    public void paint(Graphics g) { 
     g.drawString("x: " + mouseX + " y: " + mouseY, 5, 35); 
     g.drawRect(player.x, player.y, 100, 100); 
     g.drawRect(wallOne.x, wallOne.y, 100, 100); 
     repaint(); 
    } 

    @Override 
    public void mouseDragged(MouseEvent e) { 
     // TODO Auto-generated method stub 

    } 

    @Override 
    public void mouseMoved(MouseEvent e) { 
     mouseX = e.getX(); 
     mouseY = e.getY(); 
    } 
} 
+3

私は最後の文を取得しません。 –

+0

最後の文はスタックオーバーフローによって生成されます。私は彼がどのように彼のポストでそれで終わったかわからない、それはちょうどメッセージだったはずです。 – corsiKa

+2

Swingを使用していない理由はありますか? 'paint()'を直接呼び出すことは想定されていません(代わりに 'repaint()'を呼び出してください)。あなた自身の更新ループをコーディングすることは、自分自身を怒らせることを求めています。 'Events' /' Listeners'を探します。 [チュートリアル](http://download.oracle.com/javase/tutorial/uiswing/index.html)を試してみてください。 –

答えて

1

ペイント方法から再描画します。あなたはそこでそれを望んでいないのです。それがあなたの問題の原因です。

これを追加すると、物事を長期的に整理しておくのに役立ちます。

public void update() { 
    repaint(); 
} 

次に、移動先の再描画メソッドを追加します。また、ペイントメソッドにクリアを追加することもできます。これは実際にあなたの矩形を移動させます。 更新:私はすでにあなたのものを再描画する何かを持っていることに気付きました。優れた。それは本当に速いです(200 fps !!)ので、間違いなくダブルバッファリングを調べたいと思うでしょう。

その後、私たちはダブルバッファリングについて話すことができます:)しかし、あなたはそれをGoogleにすることができます。

+0

ありがとう、私はそれを見ます:D – user1007883

+0

あなたの例をコンパイルした後、@userのいずれかの四角形を移動できないようです:-)あなたのペイントメソッドに次の行を追加しました: 'g.clearRect(0,0,800,600 ); - これは、毎回作業するための明確な画面を提供します。それはあなたが取り除くために二重のバッファリングを必要とする新しいちらつきを引き起こしますが、あなたは少なくとも時間の経過とともに巨大なブラックボックスに変わる代わりにあなたのXY座標を見ることができるでしょう:) – corsiKa

+0

私はそれを取り戻します。あなたが右のキーを使用する場合、あなたは動くhahaha。私はWADSではなく、矢印キーを使っていました。 :-)しかし、クリアはまだまだ効果的です。 – corsiKa

4

あなたは間違いなくダブルバッファリングを調べたいと思っています。今あなたがやっていることは、すべてを画面に直接描画し、ユーザーがこれを見ることです。ダブルバッファリングとは、オフスクリーンのバッファ(イメージ)上にすべてを描画し、それがすべて計算され、イメージが準備できたら、表示バッファにオフスクリーンバッファを描画します。その中間フレームではなく最終フレーム)。

これは、OpenGLまたはDirect3Dアプリケーションが最も一般的に行うことと同様の概念です。彼らは2つのバッファを持っています。すべてオフスクリーンのバッファに描画され、完了するとバッファが入れ替わり、画面から外れているバッファがクリアされ、その後新しいイメージが再び描画されます。

また、グローコーダーも指摘したように、実際にはfpsが高いです。モニターのリフレッシュレートと同期させて、必要以上にリソースを浪費しないようにしてください。

+0

助けてくれてありがとう:D – user1007883