【问题标题】:how to have images be shown for a certain amount of time if a buttons pressed如果按下按钮,如何在一定时间内显示图像
【发布时间】:2018-06-20 03:27:32
【问题描述】:

所以,我正在制作一个跳跃动画,它工作正常,但我正在尝试获取它,所以如果一个按钮是按下但在精灵到达地面后返回原始图像。我已经研究了很多,但我还没有找到合适的答案。但是,如果按下某个按钮,我正在考虑更改图像视图,但我不确定这是否可行。

我的代码

   public void start(Stage primaryStage) throws Exception {
    final Group root = new Group();
    Scene scene = new Scene(root, 640, 480, Color.ALICEBLUE);

    Image imgninja = new Image(getClass().getResourceAsStream("ninja_sprite.png"));
    Image tempground = new Image(getClass().getResourceAsStream("ground.png"));
    Image tempground2 = new Image(getClass().getResourceAsStream("ground.png"));
    final Image test = new Image(getClass().getResourceAsStream("myninja_1.png"));
    final Rectangle r = new Rectangle();
    r.setX(rectx);
    r.setY(recty);
    r.setWidth(50);
    r.setHeight(100);
    r.setArcWidth(20);
    r.setArcHeight(20);

    Button button = new Button();
    iview = new ImageView(imgninja);
    iview.setLayoutX(ninjax);
    iview.setLayoutY(ninjay);
    iview2 = new ImageView(tempground);
    iview2.setLayoutX(backgroundx);
    iview2.setLayoutY(backgroundy);
    iview3 = new ImageView(tempground2);
    iview3.setLayoutX(555);
    iview3.setLayoutY(backgroundy);
    iview4 = new ImageView(test);
    iview4.setLayoutX(aix);
    iview4.setLayoutY(aiy);


    root.getChildren().addAll(iview2, iview3, button, iview, r,iview4);
    primaryStage.setTitle("A basic window");
    primaryStage.setScene(scene);
    primaryStage.show();

    button.setOnKeyPressed(new EventHandler<KeyEvent>() {

        @Override
        public void handle(KeyEvent event) {

            if (event.getCode() == KeyCode.LEFT) {

                ninjax = ninjax - 10;
                iview.setLayoutX(ninjax);
            }

            if (event.getCode() == KeyCode.UP) {

                if (ninjay > 365) {
                    jumpforce = -16;

                }
                iview.setLayoutY(ninjay);

            }
            if (event.getCode() == KeyCode.RIGHT) {


                ninjax = ninjax + 10;

                iview.setLayoutY(ninjax);

            }

        }

    });

    new AnimationTimer() {


        @Override

        public void handle(long now) {

            if (iview.getBoundsInParent().intersects(iview2.getBoundsInParent())) {

                groundforce = -gravity;

            } else {
                groundforce = 0;

            }

            if (jumpforce < 0) {

                ninjay = ninjay - (-gravity) + jumpforce + groundforce;
                ninjax = ninjax + 3;

                jumpforce = jumpforce + 1;

            } else if (ninjay < 365) {
                ninjay = ninjay - (gravity) + jumpforce + groundforce;

                ninjax = ninjax + 3;

            }

            iview.setLayoutY(ninjay);
            iview.setLayoutX(ninjax);

        }

    }.start();

}

【问题讨论】:

    标签: java animation javafx


    【解决方案1】:

    一般来说,您可以使用PauseTransition

    Duration delay = ... ;
    PauseTransition timer = new PauseTransition(delay);
    timer.setOnFinished(evt -> undoWhatIDidToUI());
    doSomethingToUI();
    timer.play();
    

    所以,如果我理解你,

    Duration delay = ... ; // time for a jump
    PauseTransition jumpTimer = new PauseTransition(delay);
    jumpTimer.setOnFinished(evt -> iview.setImage(imgninja));
    iview.setImage(jumpingImage);
    jumpTimer.play();
    

    虽然只检测您当前是否在动画计时器中跳跃可能会更容易,并根据您是否在跳跃使用适当的图像调用setImage(...)。 (使用与当前使用的图像相同的图像调用 setImage(...) 基本上是无操作的,因此这样做应该不会出现性能问题。)我认为这看起来像:

    @Override
    public void handle(long now) {
    
        // existing code...
    
        if (jumpforce < 0) {
            iview.setImage(jumpingImage);
        } else {
            iview.setImage(imgninja);
        }
    
        // ...
    }
    

    【讨论】:

      猜你喜欢
      • 2020-10-01
      • 2017-01-25
      • 1970-01-01
      • 1970-01-01
      • 2013-10-28
      • 2019-12-01
      • 2021-08-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多