百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 编程字典 > 正文

过年必备Java动态烟花教程如何用Canvas和Timer实现炫酷烟花动画

toyiye 2024-09-08 10:05 7 浏览 0 评论

烟花是一种常见的庆祝活动和节日的方式,它们在夜空中绽放出各种颜色和形状,给人们带来美丽和欢乐。你是否想过用Java编程来模拟烟花的效果呢?如果你对此感兴趣,那么这篇教程就是为你准备的。在这篇教程中,你将学习如何用Java的Canvas和Timer类来创建一个简单的烟花动画,让你的程序也能展现出烟花的魅力。

教程目标

在这篇教程中,你将完成以下目标:

  • 创建一个Canvas类的对象,用于绘制烟花的图形
  • 创建一个Firework类的对象,用于表示一个烟花的属性和行为
  • 创建一个Timer类的对象,用于控制烟花的运动和爆炸
  • 创建一个ArrayList类的对象,用于存储多个烟花的对象
  • 在Canvas上随机生成和显示多个烟花的对象,并让它们按照一定的规律运动和爆炸
  • 在IntelliJ环境中运行和测试你的程序,并观察烟花的效果

教程准备

在开始这篇教程之前,你需要准备以下内容:

  • 一台安装了Java开发环境的电脑,推荐使用Java 8或以上的版本
  • 一个安装了IntelliJ IDEA的电脑,推荐使用最新的版本
  • 一些基本的Java编程知识,例如变量,数据类型,类,对象,方法,数组,集合,循环,条件,异常等
  • 一些基本的Java图形编程知识,例如Canvas,Graphics,Color,Font等

教程步骤

接下来,我们将按照以下步骤来完成这篇教程:

步骤一:创建一个Canvas类的对象

Canvas是Java中用于绘制图形的一个类,它提供了一个画布,可以在上面绘制各种图形,例如线,矩形,圆,文字等。为了在我们的程序中使用Canvas,我们需要创建一个Canvas类的对象,并设置它的一些属性,例如大小,背景色,字体等。我们还需要创建一个JFrame类的对象,用于创建一个窗口,将Canvas添加到窗口中,并设置窗口的一些属性,例如标题,大小,位置,关闭方式等。以下是创建Canvas类的对象和JFrame类的对象的代码:

import javax.swing.*;

import java.awt.*;

public class FireworkCanvas extends Canvas {

// 定义画布的宽度和高度

public static final int WIDTH = 800;

public static final int HEIGHT = 600;

// 定义画布的背景色和字体

public static final Color BACKGROUND = Color.BLACK;

public static final Font FONT = new Font("Arial", Font.BOLD, 20);

// 定义一个JFrame类的对象,用于创建窗口

private JFrame frame;

// 定义一个构造方法,用于初始化画布和窗口

public FireworkCanvas() {

// 调用父类的构造方法,设置画布的大小

super();

setSize(WIDTH, HEIGHT);

// 设置画布的背景色和字体

setBackground(BACKGROUND);

setFont(FONT);

// 创建一个JFrame类的对象,用于创建窗口

frame = new JFrame();

// 将画布添加到窗口中

frame.add(this);

// 设置窗口的标题,大小,位置,关闭方式等

frame.setTitle("Java动态烟花教程");

frame.pack();

frame.setLocationRelativeTo(null);

frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

// 显示窗口

frame.setVisible(true);

}

}

在上面的代码中,我们首先导入了javax.swing和java.awt两个包,这两个包包含了我们需要用到的一些类,例如JFrame,Canvas,Graphics,Color,Font等。然后,我们定义了一个FireworkCanvas类,它继承了Canvas类,表示它是一个画布。在这个类中,我们定义了一些常量,用于表示画布的宽度,高度,背景色,字体等。我们还定义了一个JFrame类的对象,用于表示一个窗口。接着,我们定义了一个构造方法,用于初始化画布和窗口。在这个方法中,我们调用了父类的构造方法,设置了画布的大小,背景色,字体等。然后,我们创建了一个JFrame类的对象,将画布添加到窗口中,并设置了窗口的标题,大小,位置,关闭方式等。最后,我们调用了setVisible方法,让窗口显示出来。

步骤二:创建一个Firework类的对象

Firework是我们自定义的一个类,用于表示一个烟花的属性和行为。一个烟花的对象有以下的属性:

  • x坐标,表示烟花的水平位置
  • y坐标,表示烟花的垂直位置
  • x速度,表示烟花的水平速度
  • y速度,表示烟花的垂直速度
  • 颜色,表示烟花的颜色
  • 半径,表示烟花的大小
  • 状态,表示烟花的状态,有三种状态:上升,爆炸,消失
  • 粒子,表示烟花爆炸后的粒子,是一个Firework类的对象的数组

一个烟花的对象有以下的行为:

  • 构造方法,用于初始化烟花的属性
  • update方法,用于更新烟花的位置,速度,状态,粒子等
  • render方法,用于绘制烟花的图形
  • isAlive方法,用于判断烟花是否还存活

以下是创建Firework类的对象的代码:

import java.awt.*;

import java.util.Random;

public class Firework {

// 定义一个Random类的对象,用于生成随机数

private static final Random random = new Random();

// 定义一些常量,用于表示烟花的状态

private static final int RISING = 0; // 上升

private static final int EXPLODING = 1; // 爆炸

private static final int FADING = 2; // 消失

// 定义一些常量,用于表示烟花的物理参数

private static final double GRAVITY = 0.1; // 重力

private static final double FRICTION = 0.99; // 摩擦力

private static final double LIFESPAN = 0.8; // 粒子的寿命

// 定义烟花的属性

private double x; // x坐标

private double y; // y坐标

private double vx; // x速度

private double vy; // y速度

private Color color; // 颜色

private int radius; // 半径

private int state; // 状态

private Firework[] particles; // 粒子

// 定义一个构造方法,用于初始化烟花的属性

public Firework(double x, double y, double vx, double vy, Color color, int radius, int state) {

// 将参数赋值给属性

this.x = x;

this.y = y;

this.vx = vx;

this.vy = vy;

this.color = color;

this.radius = radius;

this.state = state;

// 如果状态是爆炸,那么创建粒子数组

if (state == EXPLODING) {

// 随机生成粒子的数量,范围是10到50

int num = random.nextInt(41) + 10;

// 创建一个Firework类的对象的数组,用于存储粒子

particles = new Firework[num];

// 遍历粒子数组,为每个粒子赋值

for (int i = 0; i < num; i++) {

// 随机生成粒子的x速度,范围是-5到5

double pvx = random.nextDouble() * 10 - 5;

// 随机生成粒子的y速度,范围是-5到5

double pvy = random.nextDouble() * 10 - 5;

// 随机生成粒子的颜色,可以和烟花的颜色相同,也可以不同

Color pcolor = random.nextBoolean() ? color : new Color(random.nextInt(256), random.nextInt(256), random.nextInt(256));

// 随机生成粒子的半径,范围是1到3

int pradius = random.nextInt(3) + 1;

// 创建一个Firework类的对象,表示一个粒子,状态是消失

Firework particle = new Firework(x, y, pvx, pvy, pcolor, pradius, FADING);

// 将粒子对象存入粒子数组

particles[i] = particle;

}

}

}

在上面的代码中,我们定义了一个Firework类,用于表示一个烟花的属性和行为。在这个类中,我们定义了一些常量,用于表示烟花的状态,物理参数等。我们还定义了一些属性,用于表示烟花的位置,速度,颜色,大小,状态,粒子等。接着,我们定义了一个构造方法,用于初始化烟花的属性。在这个方法中,我们将参数赋值给属性,并根据状态是否是爆炸,来决定是否创建粒子数组。如果状态是爆炸,那么我们随机生成一些粒子的属性,并创建一个Firework类的对象的数组,用于存储粒子。这样,我们就完成了烟花对象的创建。

步骤三:更新烟花的对象

为了让烟花的对象能够动起来,我们需要更新它们的位置,速度,状态,粒子等。我们可以定义一个update方法,用于实现这个功能。在这个方法中,我们需要根据烟花的状态,来执行不同的操作。以下是update方法的代码:

// 定义一个update方法,用于更新烟花的位置,速度,状态,粒子等

public void update() {

// 根据烟花的状态,执行不同的操作

switch (state) {

case RISING: // 如果状态是上升

// 更新烟花的位置,根据速度和时间的关系

x += vx;

y += vy;

// 更新烟花的速度,根据重力和摩擦力的影响

vx *= FRICTION;

vy = (vy + GRAVITY) * FRICTION;

// 判断烟花是否达到最高点,根据y速度的符号

if (vy >= 0) {

// 如果达到最高点,那么改变烟花的状态为爆炸,并创建一个新的烟花对象,表示爆炸后的烟花

state = EXPLODING;

Firework explosion = new Firework(x, y, 0, 0, color, radius, EXPLODING);

// 将新的烟花对象赋值给当前的烟花对象,覆盖原来的属性

this.x = explosion.x;

this.y = explosion.y;

this.vx = explosion.vx;

this.vy = explosion.vy;

this.color = explosion.color;

this.radius = explosion.radius;

this.state = explosion.state;

this.particles = explosion.particles;

}

break;

case EXPLODING: // 如果状态是爆炸

// 遍历粒子数组,更新每个粒子的位置,速度,状态等

for (Firework particle : particles) {

particle.update();

}

break;

case FADING: // 如果状态是消失

// 更新烟花的半径,根据寿命的衰减

radius *= LIFESPAN;

break;

}

}

在上面的代码中,我们定义了一个update方法,用于更新烟花的位置,速度,状态,粒子等。在这个方法中,我们根据烟花的状态,执行不同的操作。如果状态是上升,那么我们根据速度和时间的关系,更新烟花的位置。然后,我们根据重力和摩擦力的影响,更新烟花的速度。接着,我们判断烟花是否达到最高点,根据y速度的符号。如果达到最高点,那么我们改变烟花的状态为爆炸,并创建一个新的烟花对象,表示爆炸后的烟花。然后,我们将新的烟花对象赋值给当前的烟花对象,覆盖原来的属性。这样,我们就完成了烟花的上升和爆炸的过程。

如果状态是爆炸,那么我们遍历粒子数组,更新每个粒子的位置,速度,状态等。我们可以调用粒子对象的update方法,来实现这个功能。这样,我们就完成了烟花的爆炸和粒子的运动的过程。

如果状态是消失,那么我们更新烟花的半径,根据寿命的衰减。我们可以乘以一个小于1的常数,来模拟烟花的半径的缩小。这样,我们就完成了烟花的消失的过程。

步骤四:绘制烟花的对象

为了让烟花的对象能够显示出来,我们需要绘制它们的图形。我们可以定义一个render方法,用于实现这个功能。在这个方法中,我们需要根据烟花的状态,来执行不同的操作。以下是render方法的代码:

// 定义一个render方法,用于绘制烟花的图形

public void render(Graphics g) {

// 根据烟花的状态,执行不同的操作

switch (state) {

case RISING: // 如果状态是上升

// 设置画笔的颜色为烟花的颜色

g.setColor(color);

// 绘制一个实心圆,表示烟花的图形,根据烟花的位置和半径

g.fillOval((int) x - radius, (int) y - radius, radius * 2, radius * 2);

break;

case EXPLODING: // 如果状态是爆炸

// 遍历粒子数组,绘制每个粒子的图形

for (Firework particle : particles) {

particle.render(g);

}

break;

case FADING: // 如果状态是消失

// 设置画笔的颜色为烟花的颜色,但是透明度随着半径的减小而减小

g.setColor(new Color(color.getRed(), color.getGreen(), color.getBlue(), (int) (radius * 255 / 3)));

// 绘制一个实心圆,表示烟花的图形,根据烟花的位置和半径

g.fillOval((int) x - radius, (int) y - radius, radius * 2, radius * 2);

break;

}

}

在上面的代码中,我们定义了一个render方法,用于绘制烟花的图形。在这个方法中,我们根据烟花的状态,执行不同的操作。如果状态是上升,那么我们设置画笔的颜色为烟花的颜色,并绘制一个实心圆,表示烟花的图形,根据烟花的位置和半径。这样,我们就完成了烟花的上升的绘制。

如果状态是爆炸,那么我们遍历粒子数组,绘制每个粒子的图形。我们可以调用粒子对象的render方法,来实现这个功能。这样,我们就完成了烟花的爆炸和粒子的绘制。

如果状态是消失,那么我们设置画笔的颜色为烟花的颜色,但是透明度随着半径的减小而减小,并绘制一个实心圆,表示烟花的图形,根据烟花的位置和半径。这样,我们就完成了烟花的消失的绘制

步骤五:在IntelliJ环境中运行和测试你的程序,并观察烟花的效果

现在,我们已经完成了Firework类和FireworkCanvas类的编写,我们可以在IntelliJ环境中运行和测试我们的程序,并观察烟花的效果。以下是在IntelliJ环境中运行和测试你的程序的步骤:

  • 打开IntelliJ IDEA,创建一个新的Java项目,命名为FireworkTutorial
  • 在src文件夹下,创建两个新的Java类,分别命名为Firework和FireworkCanvas,并将我们之前编写的代码复制到相应的类中
  • 在FireworkCanvas类中,添加一个main方法,用于启动程序
  • 在main方法中,创建一个FireworkCanvas类的对象,用于创建画布和窗口
  • 在FireworkCanvas类中,重写paint方法,用于绘制画布上的内容
  • 在paint方法中,创建一个Graphics类的对象,用于绘制图形
  • 在paint方法中,创建一个ArrayList类的对象,用于存储多个烟花的对象
  • 在paint方法中,创建一个Timer类的对象,用于控制烟花的运动和爆炸
  • 在paint方法中,创建一个TimerTask类的对象,用于实现定时任务
  • 在TimerTask类的对象中,重写run方法,用于执行定时任务
  • 在run方法中,随机生成一个烟花的对象,并添加到烟花的数组中
  • 在run方法中,遍历烟花的数组,更新和绘制每个烟花的对象
  • 在run方法中,清除画布上的内容,重新绘制画布上的内容
  • 在paint方法中,调用Timer类的对象的schedule方法,用于启动定时任务
  • 在IntelliJ环境中,运行FireworkCanvas类,观察窗口上的烟花的效果

以下是在IntelliJ环境中运行和测试你的程序的代码:

import javax.swing.*;

import java.awt.*;

import java.util.ArrayList;

import java.util.Random;

import java.util.Timer;

import java.util.TimerTask;

public class FireworkCanvas extends Canvas {

// 定义画布的宽度和高度

public static final int WIDTH = 800;

public static final int HEIGHT = 600;

// 定义画布的背景色和字体

public static final Color BACKGROUND = Color.BLACK;

public static final Font FONT = new Font("Arial", Font.BOLD, 20);

// 定义一个JFrame类的对象,用于创建窗口

private JFrame frame;

// 定义一个构造方法,用于初始化画布和窗口

public FireworkCanvas() {

// 调用父类的构造方法,设置画布的大小

super();

setSize(WIDTH, HEIGHT);

// 设置画布的背景色和字体

setBackground(BACKGROUND);

setFont(FONT);

// 创建一个JFrame类的对象,用于创建窗口

frame = new JFrame();

// 将画布添加到窗口中

frame.add(this);

// 设置窗口的标题,大小,位置,关闭方式等

frame.setTitle("Java动态烟花教程");

frame.pack();

frame.setLocationRelativeTo(null);

frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

// 显示窗口

frame.setVisible(true);

}

// 定义一个main方法,用于启动程序

public static void main(String[] args) {

// 创建一个FireworkCanvas类的对象,用于创建画布和窗口

FireworkCanvas canvas = new FireworkCanvas();

}

// 重写paint方法,用于绘制画布上的内容

@Override

public void paint(Graphics g) {

// 创建一个Graphics类的对象,用于绘制图形

Graphics2D g2d = (Graphics2D) g;

// 创建一个ArrayList类的对象,用于存储多个烟花的对象

ArrayList<Firework> fireworks = new ArrayList<>();

// 创建一个Timer类的对象,用于控制烟花的运动和爆炸

Timer timer = new Timer();

// 创建一个TimerTask类的对象,用于实现定时任务

TimerTask task = new TimerTask() {

// 定义一个Random类的对象,用于生成随机数

private Random random = new Random();

// 重写run方法,用于执行定时任务

@Override

public void run() {

// 随机生成一个烟花的对象,并添加到烟花的数组中

double x = random.nextDouble() * WIDTH; // 随机生成烟花的x坐标,范围是0到画布的宽度

double y = HEIGHT; // 设置烟花的y坐标为画布的高度

double vx = random.nextDouble() * 10 - 5; // 随机生成烟花的x速度,范围是-5到5

double vy = -(random.nextDouble() * 10 + 10); // 随机生成烟花的y速度,范围是-20到-10

Color color = new Color(random.nextInt(256), random.nextInt(256), random.nextInt(256)); // 随机生成烟花的颜色

int radius = random.nextInt(5) + 5; // 随机生成烟花的半径,范围是5到10

int state = Firework.RISING; // 设置烟花的状态为上升

Firework firework = new Firework(x, y, vx, vy, color, radius, state); // 创建一个Firework类的对象,表示一个烟花

fireworks.add(firework); // 将烟花对象添加到烟花数组中

// 遍历烟花的数组,更新和绘制每个烟花的对象

for (int i = 0; i < fireworks.size(); i++) {

// 获取烟花的对象

Firework f = fireworks.get(i);

// 更新烟花的对象

f.update();

// 绘制烟花的对象

f.render(g2d);

// 判断烟花是否还存活

if (!f.isAlive()) {

// 如果不存活,那么从烟花的数组中移除

fireworks.remove(i);

i--;

}

}

// 清除画布上的内容,重新绘制画布上的内容

repaint();

}

};

// 调用Timer类的对象的schedule方法,用于启动定时任务

timer.schedule(task, 0, 50); // 每隔50毫秒执行一次定时任务

}

}

在上面的代码中,我们在FireworkCanvas类中添加了一个main方法,用于启动程序。在这个方法中,我们创建了一个FireworkCanvas类的对象,用于创建画布和窗口。然后,我们重写了paint方法,用于绘制画布上的内容。在这个方法中,我们创建了一个Graphics类的对象,用于绘制图形。然后,我们创建了一个ArrayList类的对象,用于存储多个烟花的对象。接着,我们创建了一个Timer类的对象,用于控制烟花的运动和爆炸。然后,我们创建了一个TimerTask类的对象,用于实现定时任务。在这个对象中,我们重写了run方法,用于执行定时任务。在这个方法中,我们随机生成一个烟花的对象,并添加到烟花的数组中。然后,我们遍历烟花的数组,更新和绘制每个烟花的对象。最后,我们清除画布上的内容,重新绘制画布上的内容。最后,我们调用了Timer类的对象的schedule方法,用于启动定时

相关推荐

# Python 3 # Python 3字典Dictionary(1)

Python3字典字典是另一种可变容器模型,且可存储任意类型对象。字典的每个键值(key=>value)对用冒号(:)分割,每个对之间用逗号(,)分割,整个字典包括在花括号({})中,格式如...

Python第八课:数据类型中的字典及其函数与方法

Python3字典字典是另一种可变容器模型,且可存储任意类型对象。字典的每个键值...

Python中字典详解(python 中字典)

字典是Python中使用键进行索引的重要数据结构。它们是无序的项序列(键值对),这意味着顺序不被保留。键是不可变的。与列表一样,字典的值可以保存异构数据,即整数、浮点、字符串、NaN、布尔值、列表、数...

Python3.9又更新了:dict内置新功能,正式版十月见面

机器之心报道参与:一鸣、JaminPython3.8的热乎劲还没过去,Python就又双叒叕要更新了。近日,3.9版本的第四个alpha版已经开源。从文档中,我们可以看到官方透露的对dic...

Python3 基本数据类型详解(python三种基本数据类型)

文章来源:加米谷大数据Python中的变量不需要声明。每个变量在使用前都必须赋值,变量赋值以后该变量才会被创建。在Python中,变量就是变量,它没有类型,我们所说的"类型"是变...

一文掌握Python的字典(python字典用法大全)

字典是Python中最强大、最灵活的内置数据结构之一。它们允许存储键值对,从而实现高效的数据检索、操作和组织。本文深入探讨了字典,涵盖了它们的创建、操作和高级用法,以帮助中级Python开发...

超级完整|Python字典详解(python字典的方法或操作)

一、字典概述01字典的格式Python字典是一种可变容器模型,且可存储任意类型对象,如字符串、数字、元组等其他容器模型。字典的每个键值key=>value对用冒号:分割,每个对之间用逗号,...

Python3.9版本新特性:字典合并操作的详细解读

处于测试阶段的Python3.9版本中有一个新特性:我们在使用Python字典时,将能够编写出更可读、更紧凑的代码啦!Python版本你现在使用哪种版本的Python?3.7分?3.5分?还是2.7...

python 自学,字典3(一些例子)(python字典有哪些基本操作)

例子11;如何批量复制字典里的内容2;如何批量修改字典的内容3;如何批量修改字典里某些指定的内容...

Python3.9中的字典合并和更新,几乎影响了所有Python程序员

全文共2837字,预计学习时长9分钟Python3.9正在积极开发,并计划于今年10月发布。2月26日,开发团队发布了alpha4版本。该版本引入了新的合并(|)和更新(|=)运算符,这个新特性几乎...

Python3大字典:《Python3自学速查手册.pdf》限时下载中

最近有人会想了,2022了,想学Python晚不晚,学习python有前途吗?IT行业行业薪资高,发展前景好,是很多求职群里严重的香饽饽,而要进入这个高薪行业,也不是那么轻而易举的,拿信工专业的大学生...

python学习——字典(python字典基本操作)

字典Python的字典数据类型是基于hash散列算法实现的,采用键值对(key:value)的形式,根据key的值计算value的地址,具有非常快的查取和插入速度。但它是无序的,包含的元素个数不限,值...

324页清华教授撰写【Python 3 菜鸟查询手册】火了,小白入门字典

如何入门学习python...

Python3.9中的字典合并和更新,了解一下

全文共2837字,预计学习时长9分钟Python3.9正在积极开发,并计划于今年10月发布。2月26日,开发团队发布了alpha4版本。该版本引入了新的合并(|)和更新(|=)运算符,这个新特性几乎...

python3基础之字典(python中字典的基本操作)

字典和列表一样,也是python内置的一种数据结构。字典的结构如下图:列表用中括号[]把元素包起来,而字典是用大括号{}把元素包起来,只不过字典的每一个元素都包含键和值两部分。键和值是一一对应的...

取消回复欢迎 发表评论:

请填写验证码