2016-07-25 6 views
3

the gameJavaFX - Warum erhöht sich die Punktzahl nicht?

Habe ich nur noch den Teil Animation und jetzt, wenn ich auf die Ente es nichts zu der Partitur der Fall ist, aber wenn ich die Animation Code kommentieren und die Ente bleibt nach wie vor, es erhöht nur in Ordnung.

Full Code

Animation:

KeyValue start = new KeyValue(duck.translateXProperty(), 10); 
KeyValue end = new KeyValue(duck.translateXProperty(), 400); 
KeyFrame startF = new KeyFrame(Duration.ZERO, start); 
KeyFrame endF = new KeyFrame(Duration.seconds(10), end); 
Timeline tl = new Timeline(startF, endF); 
tl.setCycleCount(Timeline.INDEFINITE); 
tl.setAutoReverse(true); 
tl.play(); 

Event-Handler für Klicks:

scene.setOnMouseClicked(event -> { 
     if (duck.contains(event.getX(), event.getY())){ 
      //increment score 
      incrementScore(); 
      scoreDisplay.setText(""+score+"00"); 
     } 
    }); 
+0

Bitte geben Sie den Code von 'incrementScore()' in der Frage. –

+0

Was passiert, wenn Sie einen Haltepunkt innerhalb des 'onClick' platzieren und die Grenzen der Ente und den Punkt des Ereignisses untersuchen? Machen sie Sinn? – Jeeter

+0

@Andy private void incrementScore() {\t Ergebnis ++; \t} – zzzzzz

Antwort

1

Nach dem, was Sie in der Frage und Kommentare gesagt haben:

wenn Ich kommentiere die Animati aus noch auf Code und die Ente bleibt, erhöht es ganz gut

Immer, wenn ich die Enten Ausgangsposition klicken, erhöht er die Partitur

Ich vermute, dass Ihr ImageView (die duck) Bounding Box wird nicht aktualisiert.


From the ImageView docs:

Diese Variablen können die Position eines Knotens ohne zu stören seine layoutBounds, zu verändern, verwendet werden, die zum Animieren eines Knotens Lage ist es nützlich machen.

Dies bedeutet, dass das Bild sich bewegt, und die duck noch in seiner Anfangsposition sein, in Betracht gezogen, so dass die Verfahren nicht funktionieren würde. Sie werden eine andere Art und Weise herauszufinden, klickt


Vielleicht finden müssen, was Sie tun können, die getTranslateX() Eigenschaft für Ihre ist zu verwenden, scheint es, wie es den Strom von der der visuellen Ente Offset erhalten werden Geometrie Ente:

scene.setOnMouseClicked(event -> { 
    double rawMouseX = event.getX(); 
    double rawMouseY = event.getY(); 

    double normalizedMouseX = rawMouseX - duck.getTranslateX(); 
    double normalizedMouseY = rawMouseY - duck.getTranslateY(); 

    if (duck.contains(normalizedMouseX, normalizedMouseY)){ 
     //increment score 
     incrementScore(); 
     scoreDisplay.setText(""+score+"00"); 
    } 
}); 

Haftungsausschluss: ich habe keine Erfahrung mit JavaFX, ich werde hauptsächlich aus Vanille Java Erfahrung

+0

Was meinst du mit Bounding Box und wie würde ich das beheben? Entschuldigung, wenn das eine dumme Frage ist, aber ich bin neu in JavaFX Animation und ich lerne immer noch wie ich gehe. – zzzzzz

+1

@Zach Ich habe die Antwort aktualisiert - Zusammenfassend bewegt die Animation das Bild, aber die Szene denkt immer noch an ihre ursprüngliche Position - ich lese gerade die Dokumente, um zu sehen, ob es irgendetwas gibt, was helfen kann, lasse ich Sie wissen, – Jeeter

+0

@Zach Ich habe mit einer möglichen Antwort aktualisiert, lassen Sie mich wissen, wenn es funktioniert (ich habe ehrlich gesagt keine Ahnung;)) – Jeeter

1

Sie müssen die normalisierte Position oder die Maus-X/Y-Koordinaten nicht berechnen. Sie müssen die getBoundsInParent() Methode verwenden:

 if (duck.getBoundsInParent().contains(event.getX(), event.getY())){ 
      //increment score 
      incrementScore(); 
      scoreDisplay.setText(""+score+"00"); 
     } 
1

Stellen Sie mit der Maus-Handler auf die Ente, nicht die Szene.

Verwenden Sie auch pickOnBounds, um nur zu reagieren, wenn Sie auf die Pixel der Ente klicken, nicht die Begrenzungsbox.

duck.setPickOnBounds(false); 
duck.setOnMouseClicked(event -> { 
    incrementScore(); 
    scoreDisplay.setText(score + "00"); 
});