html动画之制作烟花效果,JavaScript实现烟花绽放动画效果

本文介绍了如何使用JavaScript创建一个烟花绽放的动画效果。通过Firework和Particle对象类,模拟烟花上升和炸开过程,利用角度、速度和颜色等属性进行动态绘制。Firework对象负责烟花的上升和爆炸,而Particle对象表示爆炸后的碎片。动画通过不断更新和绘制这两个对象的位置,呈现逼真的烟花动画。此外,还展示了如何扩展动画,让烟花碎片拼成特定文字,如'Happy New Year'。
摘要由CSDN通过智能技术生成

先编写一个烟花绽放的动画效果。

放烟花时,一个烟花可分为两个阶段:(1)烟花上升到空中;(2)烟花炸开成碎片,炸开的碎片慢慢消散。

为此抽象出两个对象类:Firework和Particle。其中,Firework用于表示一个烟花对象,Particle用于表示一个烟花炸开后的各碎片。

Firework对象类定义6个属性:表示烟花上升轨迹中各点的坐标(x,y)、烟花弧状轨迹的偏转角度angle、上升阶段水平和垂直方向的位移改变量xSpeed和ySpeed、烟花的色彩色相hue。

坐标属性值y的初始值取画布的高度,表示烟花从地面上升到空中,其余各属性的初始值采用随机数确定。具体定义如下:

function Firework()

{

this.x = canvas.width/4*(1+3*Math.random());

this.y = canvas.height - 15;

this.angle = Math.random() * Math.PI / 4 - Math.PI / 6;

this.xSpeed = Math.sin(this.angle) *(6+Math.random()*7);

this.ySpeed = -Math.cos(this.angle) *(6+Math.random()*7);

this.hue = Math.floor(Math.random() * 360);

}

Firework对象类定义3个方法:绘制烟花上升轨迹的方法draw()、烟花上升时坐标改变方法update()和烟花炸开方法explode()。绘制烟花轨迹时,在各点(x,y)处绘制一个宽度为5、高度为15的填充小矩形表示一个轨迹点。烟花上升时,垂直方向速度ySpeed初始值为负的,每次上升时,ySpeed加上一个正值,表示上升在减速,当ySpeed的值大于0时,烟花上升到顶了(不能再上升),就炸开为70个碎片。具体方法的实现见后面的HTML文件内容。

Particle对象类定义8个属性:表示碎片散开轨迹中各点的坐标(x,y)、碎片弧状轨迹的偏转角度angle、散开时水平和垂直方向的位移改变量xSpeed和ySpeed、碎片的色彩色相hue、表示碎片小圆的半径size、碎片的亮度lightness。

function Particle(x,y,hue)

{

this.x = x;

this.y = y;

this.hue = hue;

this.lightness = 50;

this.size = 15 + Math.random() * 10;

this.angle = Math.random() * 2 * Math.PI;

this.xSpeed = Math.cos(this.angle) *(1+Math.random() * 6);

this.ySpeed = Math.sin(this.angle) *(1+Math.random() * 6);

}

Particle对象类定义2个方法:绘制碎片散开轨迹的方法draw()、碎片散开时坐标改变方法update()。碎片散开时逐渐变小(属性size值减量),当size值小于1时,从碎片数组中删除该碎片,表示碎片已消亡。

定义两个数组var fireworks=[];和var particles=[];分别存储烟花对象和炸开的碎片对象。

模拟动画的函数loop中,每隔一段时间(用count计数来实现)向fireworks数组中添加一个烟花对象,烟花对象上升到顶炸开后,从fireworks数组中删除该对象元素,然后向particles数组中添加70个碎片对象。

遍历两个数组的各对象,分别调用它们的draw()和update()方法。

编写的完整HTML文件内容如下。

烟花绽放

var canvas=document.getElementById('myCanvas');

ctx= canvas.getContext('2d');

var fireworks=[];

var particles=[];

var counter = 0;

function Firework()

{

this.x = canvas.width/4*(1+3*Math.random());

this.y = canvas.height - 15;

this.angle = Math.random() * Math.PI / 4 - Math.PI / 6;

this.xSpeed = Math.sin(this.ang

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值