用java实现跳动的小球示例代码

 更新时间:2020年05月12日 14:19:02   作者:飞宇千虹  
这篇文章主要介绍了用java实现跳动的小球,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

实现效果为一个小球接触左右侧时,会反向的运动。

import javafx.application.Application;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.paint.Color;
import javafx.scene.shape.Ellipse;
import javafx.stage.Stage;

import java.util.Timer;
import java.util.TimerTask;


public class BallMove extends Application {
  //x记录小球的横坐标,默认值为初始位置
  static int x = 200;
  //e为小球
  static Ellipse e = new Ellipse();
  //temp记录小球的移动情况:当temp为left时,左移;temp为right时,右移
  static String temp = "left";
  //创建计时器
  static Timer t = new Timer();
  //创建记录器,当多次点击过“确定”按钮后,只有第一次点击有效
  static boolean record = true;
  public static void main(String[] args) {
    launch(args);
  }

  public void start(Stage s) {
    //创建Group面板
    Group root = new Group();
    //创建场景
    Scene scene = new Scene(root, 400, 250, Color.WHITE);
    //创建按钮
    Button start = new Button("开始");
    Button stop = new Button("停止");
    //创造一个小球
    e.setCenterX(x);
    e.setCenterY(90);
    e.setRadiusX(50);
    e.setRadiusY(50);
    e.setFill(Color.RED);
    //放置开始按钮
    start.setLayoutX(100);
    start.setLayoutY(180);
    //放置停止按钮
    stop.setLayoutX(250);
    stop.setLayoutY(180);
    //为开始按钮添加事件
    start.setOnAction(new EventHandler<ActionEvent>() {
      public void handle(ActionEvent event) {
        System.out.println("开始按钮被触发");
        if(record==true) {
          t = new Timer();
          t.schedule(new TimerTask() {
            public void run() {
              e.setFill( Color.rgb((int)(Math.random()*255),(int)(Math.random()*255),(int)(Math.random()*255)));
              //小球的半径为50,场景的宽度为400,那么小球横坐标达到50或者350时,转向移动
              if (x < 50) { temp = "right"; }
              if (x > 350) { temp = "left"; }
              if (temp.equals("left")) { e.setCenterX(x -= 5);
              } else { e.setCenterX(x += 5); }
            }
          }, 0, 25);
        }
        //“开始"按钮被点击且事件被触发,record=false;
        record=false;
      }
    });
    //为停止按钮添加事件
    stop.setOnAction(new EventHandler<ActionEvent>() {
      public void handle(ActionEvent event) {
        System.out.println("停止按钮被触发");
        record = true;
        t.cancel();
      }
    });

    root.getChildren().add(e);
    root.getChildren().add(start);
    root.getChildren().add(stop);
    s.setTitle("移动小球");
    s.setScene(scene);
    s.show();
  }
}

我还做了一个升级版,扩展到上下左右一起移动,代码如下

import javafx.application.Application;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.paint.Color;
import javafx.scene.shape.Ellipse;
import javafx.scene.shape.Line;
import javafx.stage.Stage;

import java.util.Timer;
import java.util.TimerTask;


public class BallMove2 extends Application {
  //x记录小球的横坐标,默认值为初始位置
  static int x = 200;
  //y记录小球的纵坐标,默认值为初始位置
  static int y = 90;
  //distance_x记录小球每次横向移动的距离,取1到4之间的随机数
  static double distance_x = Math.random()*4+1;
  //distance_y记录小球每次纵向移动的距离,由于每次移动的距离为5,由distance_x可求出distance_y
  static double distance_y = Math.sqrt(25-distance_x*distance_x);
  //e为小球
  static Ellipse e = new Ellipse();
  //temp1记录小球的横向移动情况:当temp为left时,左移;temp为right时,右移
  static String temp1 = "left";
  //temp2记录小球的纵向移动情况:当temp为up时,上移;temp为down时,下移
  static String temp2 = "down";
  //创建计时器
  static Timer t = new Timer();
  //创建记录器,当多次点击过“确定”按钮后,只有第一次点击有效
  static boolean record_start = true;
  static boolean record_stop = false;

  public static void main(String[] args) {
    launch(args);
  }

  public void start(Stage s) {
    /*System.out.println(distance_x+"***"+distance_y);*/

    //创建Grooup面板
    Group root = new Group();
    //创建场景
    Scene scene = new Scene(root, 400, 250, Color.WHITE);
    //创建按钮
    Button start = new Button("开始");
    Button stop = new Button("停止");
    //创建一条分割线,分割小球和按钮
    Line l = new Line();
    //放置线条
    l.setStartX(0);
    l.setStartY(160);
    l.setEndY(160);
    l.setEndX(400);
    //放置小球
    e.setCenterX(x);
    e.setCenterY(y);
    e.setRadiusX(20);
    e.setRadiusY(20);
    e.setFill(Color.RED);
    //放置开始按钮
    start.setLayoutX(100);
    start.setLayoutY(190);
    //放置停止按钮
    stop.setLayoutX(250);
    stop.setLayoutY(190);

    //为开始按钮添加事件
    start.setOnAction(event -> {
        /*创建一个小球随机角度移动的思路:
        假设小球每次移动的距离为5,当横坐标或者纵坐标其中一个确定时,另外可以根据三角函数求出
        现在可以用随机函数,令横坐标为1到4之间随机的数字,那么横坐标也可以由此求出
       如何验证每次角度不同?
        当点击“停止”按钮之后,再次点击“停止”按钮即可重置小球位置和移动的角度
      * */
      if(record_start) {
        t = new Timer();
        t.schedule(new TimerTask() {
          public void run() {
            //随机取颜色,just have a fun
            //e.setFill( Color.rgb((int)(Math.random()*255),(int)(Math.random()*255),(int)(Math.random()*255)));
            //小球的半径为20,场景的宽度为400,那么小球横坐标达到20或者380时,转向移动
            if (x < 20) { temp1 = "right"; }
            if (x > 380) { temp1 = "left"; }
            //小球的半径为20,场景的高度为160,那么小球纵坐标达到20或者140时,转向移动
            if (y < 20) { temp2 = "up";}
            if (y > 140) { temp2 = "down"; }
            if (temp1.equals("left")) { e.setCenterX(x -= distance_x);
            } else { e.setCenterX(x += distance_x); }
            if (temp2.equals("down")) { e.setCenterY(y -= distance_y);
            } else { e.setCenterY(y += distance_y); }
          }
        }, 0, 20);
      }
      //“开始"按钮被点击且事件被触发,record=false;
      record_start = false;
      record_stop = false;
    });

    //为停止按钮添加事件
    stop.setOnAction(event -> {
      /*System.out.println("停止按钮被触发");*/
      //当第二次点击"停止"时,小球重置
      if(record_stop){
        //重置横向和纵向移动的距离
        distance_x = Math.random()*4+1;
        distance_y = Math.sqrt(25-distance_x*distance_x);
        //重置小球的位置
        e.setCenterX(x = 200);
        e.setCenterY(y = 90);
        record_stop = false;
      }
      record_stop = true;
      record_start = true;
      t.cancel();
    });

    root.getChildren().addAll(start,stop,l,e);
    s.setTitle("弹跳小球");
    s.setScene(scene);
    s.show();
  }
}

以上代码设置了个彩蛋,不知道你能不能找到!

总结

到此这篇关于用java实现跳动的小球示例代码的文章就介绍到这了,更多相关java 跳动的小球内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • MyBatis实现插入大量数据方法详解

    MyBatis实现插入大量数据方法详解

    最近在公司项目开发中遇到批量数据插入或者更新,下面这篇文章主要给大家介绍了关于MyBatis实现批量插入的相关资料,需要的朋友可以参考下
    2022-11-11
  • Java Calendar类使用案例详解

    Java Calendar类使用案例详解

    这篇文章主要介绍了Java Calendar类使用案例详解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-08-08
  • MyEclipse2017创建Spring项目的方法

    MyEclipse2017创建Spring项目的方法

    这篇文章主要为大家详细介绍了MyEclipse2017创建Spring项目的方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-03-03
  • SpringBoot实现图片识别文字的四种方式小结

    SpringBoot实现图片识别文字的四种方式小结

    本文主要介绍了SpringBoot实现图片识别文字的四种方式,包括Tess4J,百度智能云,阿里云,腾讯云这四种,具有一定的参考价值,感兴趣的可以了解一下
    2024-02-02
  • Java使用NIO包实现Socket通信的实例代码

    Java使用NIO包实现Socket通信的实例代码

    本篇文章主要介绍了Java使用NIO包实现Socket通信的实例代码,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-02-02
  • 如何获取jar包resources文件路径

    如何获取jar包resources文件路径

    java项目发布到jar之后找不到文件路径,遇到这样问题如何处理呢,下面小编给大家分享获取jar包resources文件路径的解决方法,感兴趣的朋友一起看看吧
    2023-12-12
  • 详解Java程序读取properties配置文件的方法

    详解Java程序读取properties配置文件的方法

    这篇文章主要介绍了Java读取properties配置文件的方法讲解,properties可以被看作是Java世界的ini,Java中有Properties可以操作它,需要的朋友可以参考下
    2016-04-04
  • Java中实现汉字生成拼音首拼和五笔码

    Java中实现汉字生成拼音首拼和五笔码

    这篇文章主要介绍了Java中实现汉字生成拼音首拼和五笔码方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-03-03
  • SpringBoot中使用Redis对接口进行限流的实现

    SpringBoot中使用Redis对接口进行限流的实现

    本文将结合实例代码,介绍SpringBoot中使用Redis对接口进行限流的实现,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-07-07
  • 使用spring aop 统一捕获异常和写日志的示例demo

    使用spring aop 统一捕获异常和写日志的示例demo

    本文通过一个小demo给大家介绍spring AOP 实现的异常捕获和日志的方法技巧,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
    2021-08-08

最新评论