用java实现跳动的小球示例代码
作者:飞宇千虹 发布时间:2021-09-13 11:41:34
标签: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();
}
}
以上代码设置了个彩蛋,不知道你能不能找到!
来源:https://blog.csdn.net/weixin_45924250/article/details/105913909
0
投稿
猜你喜欢
- Android Build类的详解及简单实例一、类结构:java.lang.Object? android.os.Build二、类概述:从系
- 主要从以下几方面来介绍一下@Scope注解@Scope注解是什么@Scope注解怎么使用@Scope注解的使用场景1,@Scope注解是什么
- 先来看看效果图如何使用示例代码PromptViewHelper pvHelper = new PromptViewHelper(mActiv
- 如果标题栏过多,超过屏幕的宽度,该怎么弄,下面我们就来解决一下,效果如下:其实和之前写的也差不多,我就是在哪个demo里面添加和修改了一下,
- 需求:有些时候,我们需要连接多个数据库,但是,在方法调用前并不知道到底是调用哪个。即同时保持多个数据库的连接,在方法中根据传入的参数来确定。
- 在使用jQuery时候,我们经常会看到或者使用到方法链,例如:$("#p1").css("color"
- 1. 概述本文主要包括以下几个方面:编码基本知识,Java,系统软件,url,工具软件等。在下面的描述中,将以"中文"两
- 概况本文主要给大家介绍了通过JDK源码学习InputStream的相关内容,JDK 给我们提供了很多实用的输入流 xxxInputStrea
- 本文实例讲述了Java Socket实现单线程通信的方法。分享给大家供大家参考,具体如下:现在做Java直接使用Socket的情况是越来越少
- 首先,查到java里文件重命名的方法为:renameTo();我将180张图片放在d:\\backup下,用下面的程序进行重命名:publi
- MyBatis if test 判断字符串相等不生效采用 MyBatis 框架操作 MySQL 数据库时,判断传入的字符串 priceFla
- 相信你也遇到过这种场景,判断二级目录属于哪个一级目录,一个员工属于哪个上级员工领导…当Mybatis遇上目录树,有哪些解决方法?一般来说,有
- 线程池execute与submit区别在使用线程池的时候,看到execute()与submit()方法。都可以使用线程池执行一个任务,但是两
- 摘要:这个问题算是老生常谈了,我也是一段时间没弄过了,所以感觉有些忘了,就记录一下。一、后端通过shiro在session中存储数据://
- 得到选中项的value值并拼接成一个字符串返回public string GetChecked(CheckBoxList checkList
- 概述本文基于示例的方式解释控制反转,再看控制反转之前,我们先看下常规控制流程,以数据库访问为例示例并没有实际访问数据,而是基于service
- spring boot metrics是什么?针对应用监控指标暴露,spring boot有一套完整的解决方案,并且内置了好很多的指标收集器
- 定义 1、如果注解中有属性,那么必须给属性赋值。package com.lxc.Test;// 定义一个注解public @int
- 在有些需求中会遇到,当鼠标滑过某个UI物体上方时,为了提醒用户该物体是可以交互时,我们需要添加一个动效和提示音。这样可以提高产品的体验感。解
- 稳定度(稳定性)一个排序算法是稳定的,就是当有两个相等记录的关键字R和S,且在原本的列表中R出现在S之前,在排序过的列表中R也将会是在S之前