源代码-javafx让小球从上次静止的位置开始运行?

问题描述

javafx让小球从上次静止的位置开始运行?

有一个BallPane类,

 package javafx_ex;
import javafx.animation.KeyFrame;
import javafx.animation.Timeline;
import javafx.beans.property.DoubleProperty;
import javafx.scene.layout.Pane;
import javafx.scene.paint.Color;
import javafx.scene.shape.Circle;
import javafx.util.Duration;

public class BallPane extends Pane{
    public final double radius=20;
    private double x=radius,y=radius;
    private double dx=1,dy=1;
    private Circle circle=new Circle(x,y,radius);
    private Timeline animation;
    public BallPane(){
        circle.setFill(Color.GREEN);
        getChildren().add(circle);
        animation=new Timeline(new KeyFrame(Duration.millis(50),e->moveBall()));
        animation.setCycleCount(Timeline.INDEFINITE);
        animation.play();
    }

    public void play(){
        animation.play();
    }

    public void pause(){
        animation.pause();
    }

    public void increaseSpeed(){
        animation.setRate(animation.getRate()+1);
    }

    public void decreaseSpeed(){
        animation.setRate(animation.getRate()>0 ? animation.getRate()-1 : 0);
    }

    public DoubleProperty rateProperty(){
        if(animation.getRate()==0.0){
            circle=new Circle(circle.getCenterX(),circle.getCenterY(),radius);
            circle.setFill(Color.GREEN);
        }
        return animation.rateProperty();
    }

    protected void moveBall(){
        if(x<radius || x>getWidth()-radius){
            dx*=-1;
        }
        if(y<radius || y>getHeight()-radius){
            dy*=-1;
        }
        x+=dx;
        y+=dy;
        circle.setCenterX(x);
        circle.setCenterY(y);
    }
}

主函数,

 package javafx_ex;
import javafx.application.Application;
import javafx.stage.Stage;
import javafx.scene.Scene;
import javafx.scene.input.KeyCode;
import javafx.scene.control.Slider;
import javafx.scene.layout.BorderPane;

public class BounceBallSlider extends Application{
    @Override
    public void start(Stage primaryStage){
        BallPane ballPane=new BallPane();

        Slider slSpeed=new Slider();
        slSpeed.setMax(20);
        slSpeed.setValue(10);
        ballPane.rateProperty().bind(slSpeed.valueProperty());

        BorderPane pane=new BorderPane();
        pane.setCenter(ballPane);
        pane.setBottom(slSpeed);

        ballPane.setOnMousePressed(e->ballPane.pause());
        ballPane.setOnMouseReleased(e->ballPane.play());
        slSpeed.setOnKeyPressed(e->{
            if(e.getCode()==KeyCode.UP){
                slSpeed.setValue(slSpeed.getValue()+1);
            }
            else if(e.getCode()==KeyCode.DOWN){
                slSpeed.setValue(slSpeed.getValue()-1);
            }
        });

        Scene scene=new Scene(pane,250,150);
        primaryStage.setTitle("BounceBallControl");
        primaryStage.setScene(scene);
        primaryStage.show();

        slSpeed.requestFocus();
    }
    public static void main(String[] args){
        Application.launch(args);
    }
}

出现的问题是:小球速度降为0后,再增加速度,小球不是从上次静止的位置开始运动,如果让它从上次静止的位置开始运动呢?
我查看了Animation.class的源代码,里面有这样一句话,

 An {@code Animation}'s play head can be randomly positioned, whether it is
 * running or not. If the {@code Animation} is running, the play head jumps to
 * the specified position immediately and continues playing from new position.
 * If the {@code Animation} is not running, the next {@link #play()} will start
 * the {@code Animation} from the specified position.

这句话是什么意思呢?

时间: 2025-01-03 10:29:31

源代码-javafx让小球从上次静止的位置开始运行?的相关文章

如何设置打开word2013时跳转到上次阅读的位置

  打开word时跳转到上次阅读的位置步骤如下: 步骤①:我们启动Word2013,打开需要阅读的文档,当阅读完毕之后,在指定位置键入一个空格,然后按下Delete键删除,这样相当于是没有作任何更改. 步骤②:保存文档,单击文件--另存为,选择好路径,将文档保存. 步骤③:设置保存类型,以及文档名称.单击保存按钮. 步骤④:下次打开之后,键入Shift+F5键,即可出现下图红色方框标记,单击即可自动跳转到上次保存时的位置.

duilib 修复combo控件打开下拉菜单后不会自动定位到上次选择的位置上的bug

转载请说明原出处,谢谢:http://blog.csdn.net/zhuhongshu/article/details/43484589                 今天群里一个网友向我反应combo控件的一个bug:单击combo控件,展开下拉菜单后,不会自动定位到上次选择的位置,而是定位到最开头的位置.        带有bug的效果图:                                                               修复后的效果图:    

让Adobe Reader 7.0 8.1 记住您上次阅读的位置_应用技巧

问:用Adobe Reader 7.0 或 Adobe Reader 8.1 阅读PDF书籍时,不能方便地记录上次阅读的书籍和位置供下次恢复,感觉不是很方便.请问专家,如何才能让Adobe Reader 7.0 或 Adobe Reader 8.1 记住上次阅读的位置? 答:8.1这么设置,编辑-->首选项-->文档-->重新打开文档时恢复上次视图设置 答:只要按下述方法设置即可.单击"Edit→Preferences"打开"Preferences"

Android listview定位到上次显示的位置的实现方法

Android listview定位到上次显示的位置的实现方法 整体思路:滑动lictview时,记录listview的位置,定位时定位到该位置. 1.添加全局变量 private int scrolledX = 0; private int scrolledY = 0; 2.Oncreate()添加滚动事件监听 ClassesLV.setOnScrollListener(new OnScrollListener() { /** * 滚动状态改变时调用 */ @Override public v

怎样设置Word下次打开时跳转到上次阅读的位置

  ①我们启动Word2013,打开需要阅读的文档,当阅读完毕之后,在指定位置键入一个空格,然后按下Delete键删除,这样相当于是没有作任何更改. ②保存文档,单击文件--另存为,选择好路径,将文档保存. ③设置保存类型,以及文档名称.单击保存按钮. ④下次打开之后,键入Shift+F5键,即可出现下图红色方框标记,单击即可自动跳转到上次保存时的位置.

JavaFX应用问题解答

JavaFX应用问题解答 作者:cleverpig 常见问题 JavaFX是什么? "JavaFX脚本是一种声明式.静态类型编程语言.它具有一等函数(first-class functions).声明式的语法.列表推导(list-comprehensions)及基于依赖关系的增量式求值(incremental dependency-based evaluation)等特征."JavaFX脚本为多种多样的操作提供了声明式.无中间程序逻辑的语法,这些操作包括创建2D动画.设置属性或者声明在

设置vim打开文件光标指在上次退出位置

  本人最近在使用vim编辑文件的过程中发现,打开文件光标总是停留在文件开头,特别麻烦,尤其是当文件比较大的时候. 于是想修改vim配置文件,让vim能记住上一次光标退出位置. 最终问题终于解决了,所以分享出来给大家,希望能帮助到你. 我的系统是ubuntu系统,在文件/etc/vim/vimrc中增加以下内容: au BufReadPost * if line("'"") > 0|if line("'"") <= line(&quo

c语言-求用dos.h下的peek函数读取bios时钟的详解(附源代码)

问题描述 求用dos.h下的peek函数读取bios时钟的详解(附源代码) /*源代码的地址是http://zhidao.baidu.com/link?url=zOaOjlDZY4sjOIrX2v9JxTKmCt-cVxH2dsFX047_2QhWfFy0beWJAvMZ4XkPgdAb7uPNWLtpumnZBzpsubjHb_下面的代码只是其中的一段,是我想问的问题 */ int GetTickCount() { /*读取BIOS时钟*/ int ret; ret = peek(0x00x4

《深入分析GCC 》——3.3 GCC源代码编译

3.3 GCC源代码编译 在获得了GCC的源代码后,为了生成目标机器上的编译器程序,需要对源代码进行编译,一般步骤包括: (1)使用conf?igure脚本完成编译配置,生成Makef?ile文件. (2)使用make工具编译源代码. (3)使用make工具安装生成的编译程序等. 使用的典型脚本为: ./configure make make install 3.3.1 配置 这个过程一般很简单,可以直接在${GCC_SOURCE}目录下使用命令./conf?igure.该脚本会对GCC源代码编