前言
看了Python模拟星空很漂亮,Java也应该必须有一个!
环境:只需要JDK1.8就好!不需要外部包!!!
JavaFX基础
1. GraphicsContext
GraphicsContext是JavaFX中用于绘图的类,它是Canvas类的成员之一,可以通过Canvas的getGraphicsContext2D()方法获取。GraphicsContext提供了一组方法,用于绘制各种基本形状、图像、文本等。
GraphicsContext中常用的绘图方法如下:
- strokeRect():绘制一个空心矩形。
- fillRect():绘制一个实心矩形。
- strokeOval():绘制一个空心椭圆。
- fillOval():绘制一个实心椭圆。
- strokePolygon():绘制一个空心多边形。
- fillPolygon():绘制一个实心多边形。
- drawImage():绘制一张图像。
- strokeText():绘制一段空心文本。
- fillText():绘制一段实心文本。
- setLineWidth():设置线条宽度。
- setStroke():设置线条颜色。
- setFill():设置填充颜色。
- setFont():设置字体。
绘图的过程一般是先设置好绘图属性,比如线条宽度、颜色、填充等,然后调用GraphicsContext中的绘图方法进行绘制。
2. AnimationTimer
AnimationTimer是JavaFX中一个用于处理动画的类,它继承自抽象类AnimationTimer,需要实现handle(long now)方法。
使用AnimationTimer类处理动画的步骤如下:
- 创建AnimationTimer对象,重写handle(long now)方法。
- 在handle(long now)方法中更新动画状态,比如更新物体位置、角度等。
- 在handle(long now)方法结尾处调用自身,以实现动画的连续播放。
代码实现
用上面的 GraphicsContext 对象(画笔)绘制一个黑色背景画布,因为要做成动画所以要放到AnimationTimer 的handle方法里面,其余说明已经标好注释了:
完整代码
import javafx.animation.AnimationTimer; import javafx.application.Application; import javafx.scene.Group; import javafx.scene.Scene; import javafx.scene.canvas.Canvas; import javafx.scene.canvas.GraphicsContext; import javafx.scene.paint.Color; import javafx.stage.Stage; import java.util.Random; public class StarField extends Application { //类变量 private static final int WIDTH = 800; private static final int HEIGHT = 600; private static final int STAR_NUMS = 100; private Star[] stars = new Star[STAR_NUMS]; private Random random = new Random(); public static void main(String[] args) { launch(args); } @Override public void start(Stage primaryStage) throws Exception { Canvas canvas = new Canvas(WIDTH,HEIGHT); GraphicsContext gc = canvas.getGraphicsContext2D(); for (int i = 0; i < STAR_NUMS; i++) { stars[i] = new Star(random.nextInt(WIDTH),random.nextInt(HEIGHT),random.nextDouble()*2+1); } AnimationTimer animationTimer = new AnimationTimer() { @Override public void handle(long now) { gc.setFill(Color.BLACK); //设置画笔颜色 gc.fillRect(0,0,WIDTH,HEIGHT); //填充满整个矩形画布 for (Star star : stars){ star.update(); gc.setFill(Color.WHITE); gc.fillOval(star.getX(),star.getY(),star.getSize(),star.getSize()); } } }; Group group = new Group(canvas); Scene scene = new Scene(group); primaryStage.setScene(scene); primaryStage.show(); animationTimer.start(); } private class Star{ //对象变量 private double x; private double y; private double size; private double speed; public Star(double x,double y,double speed){ this.x = x; this.y = y; this.size = random.nextDouble()*5+1; this.speed = speed; } public void update(){ x -= speed; //控制星星向左移动 if (x<0){ x = WIDTH; //循环播放,每次出发点的y坐标发生变化 y = random.nextInt(HEIGHT); } } public double getX() { return x; } public void setX(double x) { this.x = x; } public double getY() { return y; } public void setY(double y) { this.y = y; } public double getSize() { return size; } public void setSize(double size) { this.size = size; } public double getSpeed() { return speed; } public void setSpeed(double speed) { this.speed = speed; } } }