我刚刚添加了动画部分,现在每当我点击鸭子时它对分数没有任何作用,但是当我注释掉动画代码并且鸭子保持静止时,它会增加很好。
动画:
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 :(得分:1)
根据您在问题和评论中所说的内容:
当我注释掉动画代码并且鸭子保持静止时,它会增加很好
的
每当我点击鸭子初始位置时,它会增加分数
我猜你的ImageView
(duck
)的边界框没有得到更新。
此变量可用于改变节点的位置而不会干扰其layoutBounds ,这使得它可用于动画节点的位置。
这意味着图像本身会移动,duck
仍然被认为是在其初始位置,因此contains()
方法不起作用。你必须找到一种不同的方法来计算点击次数
也许您可以做的是使用contains()
的{{3}}属性,看起来它会从几何鸭获取视觉鸭的当前偏移量:
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体验
答案 1 :(得分:1)
您无需计算标准化位置或鼠标X / Y坐标。您需要使用getBoundsInParent()
方法:
if (duck.getBoundsInParent().contains(event.getX(), event.getY())){
//increment score
incrementScore();
scoreDisplay.setText(""+score+"00");
}
答案 2 :(得分:1)
在鸭子上设置鼠标处理程序,而不是场景。
此外,使用pickOnBounds仅在您点击鸭子的像素时才会做出反应,而不是它的边界框。
duck.setPickOnBounds(false);
duck.setOnMouseClicked(event -> {
incrementScore();
scoreDisplay.setText(score + "00");
});