我编写了一个简单的游戏,使用JavaFX编写了GUI,使用了AnimationTimer编写了游戏本身,但是我发现在AnimationTimer对象中更新的任何字段都不能在该对象之外找到。我已经成功地连续记录了游戏的运行时间以及该游戏的得分,但找不到从AnimationTimer对象中获取这些值的方法,因此无法将其添加到我的GUI中。

我已经尝试过java.lang.Reflect,但似乎无法正常工作。

AnimationTimer animations = new AnimationTimer() //creates animations
{
    @Override
    public void handle(long now)
    {
        //update frames
        if(jump == 0) //moves the player model to the starting position
        {
            playerY = 160;
        }

        else if(jump == 1) //moves the player model up (jumping)
        {
            playerY = 100;
        }

        if(shout == 1) //makes player immune while "shouting"
        {
            player.setFill(Color.GREEN);
        }

        if(shout == 0) //makes player not immune anymore
            player.setFill(Color.BLUE);

        if(obstacleX == PLAYER_X) //updates the score
        {
            points += 10;
            score.setText("Score: " + String.valueOf(points));
        }

        if(player.getBoundsInParent().intersects(obstacle.getBoundsInParent())) //detects if the player model touches an obstacles
        {
            if(obstacle.getEndY() == 0)
            {
                if(player.getFill() == Color.BLUE)
                    player.setFill(Color.RED);
            }

            else if(obstacle.getEndY() == 130)
                player.setFill(Color.RED);
        }

        if(obstacleX > 0) //moves the obstacles' reference point from the right to the left
            obstacleX -= 5;

        if(obstacleX == 0)
        {
            obstacleX = 400;
            int[] array = new int[]{0, 0, 130};
            Random randomNum = new Random();
            int i = randomNum.nextInt(array.length);
            random = array[i];
            obstacle.setEndY(random);
        }

        //render frames
        player.setCenterY(playerY);
        obstacle.setStartX(obstacleX); //this and line 110 move the obstacle across the scene
        obstacle.setEndX(obstacleX);

        try{ //exception handler for outputs

            if(player.getFill() == Color.GREEN)
            {
                digitalOutput6.setDutyCycle(1); //turns on green LED
                digitalOutput0.setDutyCycle(0);
            }

            if(player.getFill() == Color.BLUE)
            {
                digitalOutput6.setDutyCycle(0); //turns off LEDs
                digitalOutput0.setDutyCycle(0);
            }

            if(player.getFill() == Color.RED) //stops the animation when the player model reacts to touching an obstacle
            {
                endTime = System.currentTimeMillis() - startTime;
                finalScore = score.getText();
                this.stop(); //ends game
                gameOver = 1;
                digitalOutput0.setDutyCycle(1); //turns on red LED
                digitalOutput6.setDutyCycle(0);
                gameStage.setScene(gameEnd); //establishing scene
                gameStage.setTitle("Game Over");
                gameStage.show();
            }
        } //end of try block

        catch(PhidgetException e)
        {
            System.out.println("Phidget Output Error");
        }
    } //end of animation handle itself
};    //end of animation method


我尝试使用

long finalTime = animations.getLong(endTime);




String endScore = animations.getField(finalScore);


但是没有运气。任何帮助表示赞赏。

最佳答案

AnimationTimer本身不公开任何属性,创建一个将AnimationTimer对象包装在其中的自定义类,并保存要访问的所有属性。

初始化自定义类时,初始化AnimationTimer对象并覆盖函数(如您所做的那样),还更新要公开的任何属性。

我对javafx不熟悉,可能还有其他更好的方法,这是我能想到的一种快速解决方案。

快速搜索后,这些示例可能会有所帮助:
https://netopyr.com/2012/06/14/using-the-javafx-animationtimer/
https://tbeernot.wordpress.com/2011/11/12/javafx-2-0-bubblemark/

10-06 02:35