2012-03-17 6 views
-1

私はあなたがそれでPongをプレイできるプログラムに取り組んできました。そして、私はマルチスレッド化に比較的新しいです。このコードブロックを実行すると、左上隅に小さなボックスが表示され、ボールがボックス内でバウンスし、大きな四角形が中央に表示されます。ボールは来るが、四角形はない。 "dbg.fillRect(100、150、dbWIDTH、dbHEIGHT);"Javaマルチスレッド - コード行をスキップしますか?

private void gameRender() { 

    if(dbImage == null) { 
     dbImage = createImage(dbWIDTH, dbHEIGHT); 
     if(dbImage == null) { 
      JOptionPane.showMessageDialog(null, "dbImage is null", "Error",     JOptionPane.ERROR_MESSAGE); 
      return; 
     } 
     else 
      dbg = dbImage.getGraphics(); 
    } 

    dbg.setColor(Color.white); 
    dbg.fillRect(100, 150, dbWIDTH, dbHEIGHT); 
    dbg.setColor(Color.blue); 
    dbg.drawRect(110, 110, 10, 5); 
    g = getGraphics(); 
    ball = new PongBall(g); 
    ball.run(); 
    if(gameOver) 
     JOptionPane.showMessageDialog(null, "GAME OVER", "GAME OVER", JOptionPane.ERROR_MESSAGE); 
} 

ここPongBallスレッド

class PongBall extends Thread { 

private boolean keepGoing; 
private Graphics g; 
private int x = 7, xChange = 7; 
private int y = 0, yChange = 2; 
private int diameter = 10; 
private int rectLeftX = 0, rectRightX = 100; 
private int rectTopY = 0, rectBottomY = 100; 

public PongBall(Graphics graphics) { 
    g = graphics; 
    keepGoing = true; 
} 

public void pleaseStop() { keepGoing = false; } 

public void run() { 


    g.drawRect(rectLeftX, rectTopY, rectRightX - rectLeftX, rectBottomY - rectTopY); 

    while(keepGoing) { 

     g.setColor(Color.white); 
     g.fillOval(x, y, diameter, diameter); 

     if(x + xChange <= rectLeftX) 
      xChange = -xChange; 
     if(x + xChange >= rectRightX) 
      xChange = -xChange; 

     if(y + yChange <= rectTopY) 
      yChange = -yChange; 
     if(y + yChange >= rectBottomY) 
      yChange = -yChange; 

     x = x + xChange; 
     y = y + yChange; 

     g.setColor(Color.red); 
     g.fillOval(x, y, diameter, diameter); 

     try { 
      Thread.sleep(50); 
     } 
     catch(InterruptedException e) { 
      System.err.println("sleep exception"); 
     } 
    } 
} 

} あなたはおそらく、見ることができるようですball.run()は単に実行されます。私がやっていないことがありますか?これをどのように修正できますか?

また、私は新しいstackoverflow.comです。もしあまりにも少なすぎるコードを与えたり、何かが間違っていたら、私はお詫びします。

+0

これは 'start()'を呼び出すのではなく、 'PongBall'で' run() 'を呼び出すだけなので、実際には複数のスレッドを含むようには見えません。 UIの更新は単一のスレッドで行う必要があるので、おそらく良いことに注意してください。私はあなたの問題はイメージを作成しているに過ぎず、実際に画面にレンダリングしていないということです。 – dlev

+0

私はそれを画面にレンダリングします。私はそれをテストしている間に "ball.run()"コード行を削除し、四角形が現れましたが、そのコード行では表示されません。しかし、1つのスレッドがUIを更新する必要があるというヒントをありがとう – kullalok

+0

あなたのボールは矩形の上に描かれていて、それを消去していると思います。デバッガを使用して何が起こっているかを確認してください。なぜなら、現在はスレッドが1つしかないからです。 –

答えて

0

すべての図面をSwingスレッドで行うことをお勧めします。これは、PongBallスレッドでSwingUtilities.invokeLaterを使用して、GUIを更新するすべてのコードを含めることで実現できます。

これにより、ディスプレイの更新に1つのスレッドのみが使用されるため、GUIのマルチスレッドの問題を回避できます。

0

あなたは2つの間違いをしたと思います。 最初に、 "run()"ではなく "start()"メソッドを呼び出してスレッドを開始する必要があります。 第2に、スイングコンポーネントのグラフィックオブジェクトをアーカイブする方法は?メソッドgetGraphics()を使用しないでください。動作しません。メソッドpaintComponent(Graphics g)をオーバーライドする必要があります。

+0

私の答えの2番目の点をお詫びします、それは描画するためにループするスレッドを作るのでうまく動作します。 –

+0

いいえ、うまくいきません。 –

関連する問題