2016-04-13 13 views
3

壁に当たったときにボールが跳ね返るような単純なゲームをプログラミングしています。 GUI用のJavaFX、描画用のCanvas、GraphicsContextを使用しました。JavaFXを使ってキャンバスで動くボールを描く

ボールを描画するための私のコード:

public void moving(){ 
    gc.setFill(Color.BLACK); 
    gc.fillOval(ball.getCenterX()-15, ball.getCenterY()-15, 30,30); 
    if (ball.getCenterX()<285 && ball.getCenterX()>15) { 
     double xtemp = ball.getCenterX()+vektorx; 
     ball.setCenterX(xtemp); 
    } else { 
     vektorx = -vektorx; 
     double xtemp = ball.getCenterX()+vektorx; 
     ball.setCenterX(xtemp); 
    } 
    if (ball.getCenterY()<485 && ball.getCenterY()>15) { 
     double ytemp = ball.getCenterY()+vektory; 
     ball.setCenterY(ytemp); 
    } else { 
     vektory = -vektory; 
     double ytemp = ball.getCenterY()+vektory; 
     ball.setCenterY(ytemp); 
    } 
    gc.setFill(Color.AQUA); 
    gc.fillOval(ball.getCenterX()-15, ball.getCenterY()-15, 30,30); 
} 

gcは、私が使用しGraphicsContextであること。すべてはそれがになっていますように動作しますが、一つだけが私を悩ます:

ball with blue trail

ボールを取って、それは非常に私を気にされて、その道の痕跡を残します。私はコードを1回動かしてみました(青と黒をもう一度描きます)、トレースはありませんが、スレッドに入れて実行させると、このことが起こります。

+0

私が表示されませんアニメーションの各チックでGraphicsContextをクリアするか、黒または何かで塗りつぶすためのコード。それで、それはそれの後ろにトレイルを残していることを見つけることは特に驚くべきことではありません。 – ManoDestra

+1

よく分かっていれば、移動が起こる前にボールを黒く塗りました(ボールの座標が変わった)。メソッドのすべての最初の行を見ることができます。 私は学んでいるので、私が知っていない何かを私に教えてください。 –

+1

あなたがボールをペイントしている場合、更新中にボールを移動して再ペイントすると、以前のボールからトレースが残されます。通常、描画操作の前にキャンバス全体(またはGraphicsContext)をクリアする必要があります。ただし、すべての描画操作を逆にすることができない限り、キャンバス全体(またはGraphicsContext)をクリアする必要があります。これは[即時モード](https://en.wikipedia.org/wiki/Immediate_mode_%28computer_graphics%29)の描画の性質です。 – ManoDestra

答えて

1

私はJavaFXの程度多くが、私はグラフィックスのための別のシステムを使用しますが、私はあなたが最初にこれを追加する場合、それは少し役立つかもしれないと思うことを知らない:

gc.clearRect(0D, 0D, Toolkit.getDefaultToolkit().getScreenSize().width, Toolkit.getDefaultToolkit().getScreenSize().height);