JavaFX - 为什么分数没有递增?

时间:2016-07-25 22:43:43

标签: java javafx

the game

我刚刚添加了动画部分,现在每当我点击鸭子时它对分数没有任何作用,但是当我注释掉动画代码并且鸭子保持静止时,它会增加很好。

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

3 个答案:

答案 0 :(得分:1)

根据您在问题和评论中所说的内容:

  

当我注释掉动画代码并且鸭子保持静止时,它会增加很好

  

每当我点击鸭子初始位置时,它会增加分数

我猜你的ImageViewduck)的边界框没有得到更新。

From the ImageView docs

  

此变量可用于改变节点的位置而不会干扰其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");
});