2016-04-13 11 views
3

Ich programmiere ein einfaches Spiel, in dem der Ball hüpfen soll, wenn er gegen die Wand schlägt. Ich habe JavaFX für die GUI, Canvas und GraphicsContext zum Zeichnen verwendet.Zeichnen eines bewegten Balls mit Canvas mit JavaFX

Mein Code zum Zeichnen des Balls:

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); 
} 

Beachten Sie, dass gc die Graphics I verwendet. Alles funktioniert so, wie es angenommen hat, aber nur eine Sache stört mich:

ball with blue trail

Der Ball hinterlässt eine Spur der Straße seiner genommen und es stört mich sehr. Ich habe den Code für einen Zug ausprobiert (zeichne ihn wieder in blau und schwarz), er hinterlässt keine Spur, aber wenn ich ihn auf einen Thread lege und ihn laufen lasse, passiert dieses Ding.

+0

ich nicht sehen, Irgendein Code hier, um den GraphicsContext bei jedem Tick der Animation zu löschen oder ihn mit Schwarz oder etwas zu füllen. Es ist also nicht besonders überraschend, dass es hinter sich eine Spur hinterlässt. – ManoDestra

+1

gut, wenn ich dich richtig verstehe, habe ich den Ball schwarz gemalt, bevor die Bewegung passiert (Koordinaten des Ballwechsels). Sie konnten es alle die ersten Zeilen der Methode sehen. Ich lerne so bitte erleuchte mich wenn es etwas gibt, das ich nicht kenne. –

+1

Nun, wenn Sie den Ball malen, ihn während eines Updates bewegen und dann neu streichen, wird er eine Spur vom vorherigen Ball hinterlassen. Normalerweise müssen Sie vor allen Zeichenoperationen die gesamte Zeichenfläche (oder GraphicsContext) löschen, es sei denn, Sie können dies so tun, dass die Zeichenoperation für alles umgekehrt wird. Es ist die Art von [sofortiger Modus] (https://en.wikipedia.org/wiki/Immediate_mode_%28computer_graphics%29) Zeichnung. – ManoDestra

Antwort

1

Ich weiß nicht so viel über JavaFX, ich ein anderes System für Grafiken verwenden, aber ich denke, wenn Sie diese am Anfang hinzufügen, kann es ein wenig helfen:

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