2016-07-25 37 views
3

the gameJavaFX - 爲什麼分數不會遞增?

我剛添加的動畫部分,現在每當我點擊它無助於將比分鴨子,但是當我註釋掉動畫代碼和鴨靜止不動,它增加就好了。

Full Code

動畫:

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

事件處理程序次數:

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

請在問題中提供'incrementScore()'的代碼。 –

+0

當你在'onClick'中放置一個斷點時,會發生什麼情況,並檢查鴨子的邊界和事件點?他們有道理嗎? – Jeeter

+0

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

回答

1

根據你已經在這個問題和評論說:

時我評論了動畫對代碼和鴨靜止不動,它增加就好

每當我點擊鴨初始位置,它增加了比分

我猜這是你的ImageViewduck)的邊框沒有被更新。


From the ImageView docs

這個變量可以用於改變節點的位置,而不會干擾其layoutBounds中,這使得它成爲一個動畫節點的位置是有用的。

這意味着,圖像本身移動,並且被duck仍然被認爲是在其初始位置,所以該方法是行不通的。你必須找到搞清楚不同的方式點擊


也許你可以做的是使用getTranslateX()屬性爲您什麼,好像它會得到電流從視覺鴨的偏移幾何鴨:

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

免責聲明:我使用JavaFX沒有經驗,我會主要是關閉的香草Java的經驗

+0

你是什麼意思包圍盒,我將如何解決?對不起,如果這是一個愚蠢的問題,但我是JavaFX中的動畫新手,我仍然在學習。 – zzzzzz

+1

@Zach我已經更新了答案 - 總之,動畫會移動圖像,但場景仍然認爲它處於原始位置 - 我正在閱讀文檔以查看是否有任何可以幫助的內容,我會讓你知道 – Jeeter

+0

@Zach我已經更新了一個可能的答案,讓我知道它是否工作(我真的不知道;) – Jeeter

1

您不需要計算標準化位置或鼠標X/Y座標。您需要使用getBoundsInParent()方法:

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

將鼠標處理程序設置在鴨子上,而不是場景中。

此外,使用pickOnBounds僅在您點擊鴨子的像素時才反應,而不是它的邊界框。

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