canvas制作雨滴下落至消失的特效方法是怎样
Admin 2022-06-14 群英技术资讯 1041 次浏览
在这篇文章中,我们来学习一下“canvas制作雨滴下落至消失的特效方法是怎样”的相关知识,下文有详细的讲解,易于大家学习和理解,有需要的朋友可以借鉴参考,下面就请大家跟着小编的思路一起来学习一下吧。本文实例为大家分享了canvas实现雨滴特效的具体代码,供大家参考,具体内容如下
一、雨滴特效需求
雨滴从窗口顶部随机下落到达底部将呈现波纹逐渐散开变淡直到消失,雨滴特效随窗口变化自适应
二、雨滴实现思路
1. 用面向对象的思维 首先创建canvas画布 ,绘制一个雨滴的初始化形状
2. 在给雨滴添加运动的方法
3. 通过定时器让雨滴运动起来
三、具体分析
1.雨滴初始化需要的属性有哪些?
坐标x,y 宽高w,h 。
2.雨滴下落是逐渐加速下落不是匀速需要给一个加速度的属性,也就是y轴坐标不断加上加速度的值
3.雨滴下落到底部某一个区域后开始呈现波纹逐渐散开,也就是到达底部某个范围内开始画圆,圆逐渐变大并且变淡加上透明度
4.雨滴下落拖尾效果需要绘制一层阴影覆盖之前运动的雨滴
四、代码
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>canvas</title>
<style>
* {
margin: 0;
padding: 0;
}
canvas {
vertical-align: middle;
background: #000;
}
</style>
</head>
<body>
<canvas id="myCanvas"></canvas>
<script>
// 创建画布
let myCanvas = document.getElementById('myCanvas')
let ctx = myCanvas.getContext('2d')
// 自适应窗口
let width = myCanvas.width = window.innerWidth
let height = myCanvas.height = window.innerHeight
window.addEventListener('resize', () => {
width = myCanvas.width = window.innerWidth
height = myCanvas.height = window.innerHeight
})
// 绘制雨滴
let raindropArr = []
function Raindrop(x, y, w, h, l, r, dr, maxR, a, va) {
this.x = rand(0, window.innerWidth) // 雨滴的x轴
this.y = y || 0 // 雨滴的y轴
this.dy = rand(2, 4) // 雨滴的加速度
this.w = w || 2 // 雨滴的宽度
this.h = h || 10 // 雨滴的高度
this.l = rand(0.8 * height, 0.9 * height) // 雨滴的下落高度
this.r = r || 1 // 波纹半径
this.dr = dr || 1 // 波纹增加半径
this.maxR = maxR || 50 // 波纹最大半径
this.a = a || 1 // 波纹透明度
this.va = 0.96 // 波纹透明度系数
}
Raindrop.prototype = {
draw: function (index) { // 绘制雨滴
if (this.y > this.l) {
ctx.beginPath()
ctx.arc(this.x, this.y, this.r, 0, Math.PI * 2)
ctx.strokeStyle = `rgba(0,191,255,${this.a})`
ctx.stroke()
} else {
ctx.fillStyle = 'skyBlue'
ctx.fillRect(this.x, this.y, this.w, this.h)
}
this.update(index)
},
update: function (index) { // 更新雨滴坐标 运动起来
if (this.y > this.l) {
if (this.a > 0.03) {
this.r += this.dr
if (this.r > this.maxR) {
this.a *= this.va
}
} else {
this.a = 0
raindropArr.splice(index, 1)
}
} else {
this.y += this.dy
}
}
}
function rand(min, max) {
return Math.random() * (max - min) + min
}
setInterval(() => {
let raindrop = new Raindrop()
raindropArr.push(raindrop)
}, 100)
setInterval(() => {
ctx.fillStyle = 'rgba(0, 0, 0, 0.1)'
ctx.fillRect(0, 0, myCanvas.width, myCanvas.height)
for (let i = 0; i < raindropArr.length; i++) {
raindropArr[i].draw(i)
}
}, 30)
</script>
</body>
</html>
五、总结
canvas基本上任何运动,特效,都是通过js定时器改变坐标的方式实现。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:mmqy2019@163.com进行举报,并提供相关证据,查实之后,将立刻删除涉嫌侵权内容。
猜你喜欢
这篇文章我们来了解jQuery去除input值空格的方法,这里使用到两个方法,val()方法和trim()方法,下文有具体的实现代码,对大家学习这两种方法的使用及去除input值空格都有帮助,有需要的朋友可以参考,接下来就跟随小编来一起学习一下吧!
React服务端渲染原理是什么?很多朋友可能听说过React服务端渲染,但是对其原理并不清楚,因此下面小编就给大家介绍一下React服务端渲染原理以及实例,感兴趣的朋友可以参考。
这篇文章主要介绍了vue.config.js打包优化配置,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
作为原型和原型链的基础,先了解清楚构造函数以及它的执行过程才能更好地帮助我们学习原型和原型链的知识。本篇文章带大家详细了解一下JavaScript中的构造函数,介绍一下怎么利用构造函数创建一个js对象,希望对大家有所帮助!
这篇文章主要为大家详细介绍了uni-app使用countdown插件实现倒计时,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
成为群英会员,开启智能安全云计算之旅
立即注册关注或联系群英网络
7x24小时售前:400-678-4567
7x24小时售后:0668-2555666
24小时QQ客服
群英微信公众号
CNNIC域名投诉举报处理平台
服务电话:010-58813000
服务邮箱:service@cnnic.cn
投诉与建议:0668-2555555
Copyright © QY Network Company Ltd. All Rights Reserved. 2003-2020 群英 版权所有
增值电信经营许可证 : B1.B2-20140078 ICP核准(ICP备案)粤ICP备09006778号 域名注册商资质 粤 D3.1-20240008