话不多说,请看代码:
var ca = document.getElementById("ca"); var ctx = ca.getContext('2d'); //生成n~m之间的随机数的函数 function random(n,m){ return Math.floor(Math.random() * (m - n) + n); } //角度转弧度的函数 function toRd(angle){ return angle * Math.PI / 180; } //设置变量存储画布的最大宽高度 var maxH = ca.height; var maxW = ca.width; //每一个雪花都具有的特性 //x,y坐标、雪花半径、角度、 //先生成100个雪花 var snows = []; for(var i=0;i<200;i++){ snows.push({ "left": random(0, maxW), "top": random(0, maxH), "deg": random(-20, 20), //这个是起到更新数据的作用 "radius": random(2, 10) }); } //将这些属性应用到每一雪花上 // for(var i=0;i<snows.length;i++) { // var r = snows[i].radius; // var x = snows[i].left; // var y = snows[i].top; // var ra = ctx.createRadialGradient(x, y, r / 4, x, y, r); // ra.addColorStop(0, "rgba(255,0,0,1)"); // ra.addColorStop(1, "rgba(255,0,0,0.1)"); // ctx.fillStyle = ra; // ctx.beginPath(); // ctx.arc(x, y, r, 0, 2 * Math.PI); // ctx.fill(); // } //如果向上面这样写的话不会有动画效果 //要实现动画效果就要让每一个雪花的特性都变动起来 //设置定时器,定时改变特性 var timer = setInterval(function () { snow(); //要实现动画效果首先要清除画布内容 ctx.clearRect(0, 0, maxW, maxH); //每一个雪花每隔16ms需要变动的特性是 //x、y坐标,这是需要一个新的数值来做计算,改变它们的值 //为了避免重新定义这里直接利用snows.radius来计算 for (var i = 0; i < snows.length; i++) { //一开始每一个雪花的x,y坐标和半径r //注意不能这样写,后面的雪花的数据会把前面的顶掉,这个bug找了好长时间 // var r = snows[i].radius; // var x = snows[i].left; // var y = snows[i].top; // var d = snows[i].deg; //y变化量 var yChange = 0.5 * snows[i].radius; //x变化量 这里可以将x的变化量和y的变化量通过snows.deg关联起来, //从而使每一个雪花都沿着自己的轨迹走,也可以单独设定,所有的雪花轨迹一样 var xChange = Math.tan(toRd(snows[i].deg)) * yChange; //这里的三角公式经过测试 tan 是最合适的 snows[i].top += yChange; snows[i].left += xChange; //经过上面这些步骤每一个雪花的x,y坐标都发生了改变,随着时间的推移, //雪花都会飘出画布,雪花最后就没有了,这里需要作出判断,把超出画布的雪花从snows //里面删掉,然后再添加新的雪花,这一步在最后进行,这里只做判断 if (snows[i].left < 0 || snows[i].left > maxW || snows[i].top > maxH) { //这里的x<0 是因为 xChange可能为负值 if(i>0){ snows.splice(i--, 1); continue;//如果超出范围了 // 那这个雪花就没必要再进行后面的渲染了,所以这个判断可以降低性能消耗 } } //开始渲染 var ra = ctx.createRadialGradient(snows[i].left, snows[i].top, snows[i].radius / 4, snows[i].left, snows[i].top, snows[i].radius); ra.addColorStop(0, "rgba(255,255,255,1)"); ra.addColorStop(1, "rgba(255,255,255,0.1)"); ctx.fillStyle = ra; ctx.beginPath(); ctx.arc(snows[i].left, snows[i].top, snows[i].radius, 0, 2 * Math.PI); ctx.fill(); } }, 16); //增加雪花的数量 //就是往snows数组中添加成员 function snow(){ if(snows.length<220) { var l = 220 - snows.length; for(var i=0;i<l;i++){ snows.push({ "left": random(0, maxW), "top": 0, "deg": random(-20, 20), //这个是起到更新数据的作用 "radius": random(2, 10) }) } } }
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持!
免责声明:本站文章均来自网站采集或用户投稿,网站不提供任何软件下载或自行开发的软件!
如有用户或公司发现本站内容信息存在侵权行为,请邮件告知! 858582#qq.com
暂无“canvas雪花效果核心代码分享”评论...
《魔兽世界》大逃杀!60人新游玩模式《强袭风暴》3月21日上线
暴雪近日发布了《魔兽世界》10.2.6 更新内容,新游玩模式《强袭风暴》即将于3月21 日在亚服上线,届时玩家将前往阿拉希高地展开一场 60 人大逃杀对战。
艾泽拉斯的冒险者已经征服了艾泽拉斯的大地及遥远的彼岸。他们在对抗世界上最致命的敌人时展现出过人的手腕,并且成功阻止终结宇宙等级的威胁。当他们在为即将于《魔兽世界》资料片《地心之战》中来袭的萨拉塔斯势力做战斗准备时,他们还需要在熟悉的阿拉希高地面对一个全新的敌人──那就是彼此。在《巨龙崛起》10.2.6 更新的《强袭风暴》中,玩家将会进入一个全新的海盗主题大逃杀式限时活动,其中包含极高的风险和史诗级的奖励。
《强袭风暴》不是普通的战场,作为一个独立于主游戏之外的活动,玩家可以用大逃杀的风格来体验《魔兽世界》,不分职业、不分装备(除了你在赛局中捡到的),光是技巧和战略的强弱之分就能决定出谁才是能坚持到最后的赢家。本次活动将会开放单人和双人模式,玩家在加入海盗主题的预赛大厅区域前,可以从强袭风暴角色画面新增好友。游玩游戏将可以累计名望轨迹,《巨龙崛起》和《魔兽世界:巫妖王之怒 经典版》的玩家都可以获得奖励。
更新动态
2024年11月17日
2024年11月17日
- 中国武警男声合唱团《辉煌之声1天路》[DTS-WAV分轨]
- 紫薇《旧曲新韵》[320K/MP3][175.29MB]
- 紫薇《旧曲新韵》[FLAC/分轨][550.18MB]
- 周深《反深代词》[先听版][320K/MP3][72.71MB]
- 李佳薇.2024-会发光的【黑籁音乐】【FLAC分轨】
- 后弦.2012-很有爱【天浩盛世】【WAV+CUE】
- 林俊吉.2012-将你惜命命【美华】【WAV+CUE】
- 晓雅《分享》DTS-WAV
- 黑鸭子2008-飞歌[首版][WAV+CUE]
- 黄乙玲1989-水泼落地难收回[日本天龙版][WAV+CUE]
- 周深《反深代词》[先听版][FLAC/分轨][310.97MB]
- 姜育恒1984《什么时候·串起又散落》台湾复刻版[WAV+CUE][1G]
- 那英《如今》引进版[WAV+CUE][1G]
- 蔡幸娟.1991-真的让我爱你吗【飞碟】【WAV+CUE】
- 群星.2024-好团圆电视剧原声带【TME】【FLAC分轨】