2016-07-25 26 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"); 
});