粒子动画-躁动的小球代码全
2017-12-25 10:02
267 查看
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <style> </style> </head> <body> <canvas id="canvas"></canvas> </body> <script> //获取到canvas var canvas = document.querySelector('#canvas'); //设置上下文对象 var ctx = canvas.getContext('2d'); //设置画布的宽 高 var w = canvas.width = window.innerWidth; var h = canvas.height = window.innerHeight; //封装一个随机数函数 function randomFn(min,max){ return parseInt(Math.random()*(max-min) + min); } //创建关于小球的构造函数,x:x轴中心坐标点;y:y轴中心坐标点;size:小球半径;speedx:小球在x轴方向上的速度,speedy: 小球在y轴方向上的速度, //color: 小球颜色 function Ball(x,y,size,speedx,speedy,color){ this.x = x; this.y = y; this.size = size; this.speedX = speedx; this.speedY = speedy; this.color = color; } //绘制小球 Ball.prototype.draw = function () { ctx.beginPath(); ctx.fillStyle = this.color; ctx.arc(this.x,this.y,this.size,0,Math.PI*2); ctx.fill(); } //躁动的小球,核心思想不断改变小球的坐标,如果小球到达边界,则将速度设置为相反数,形成了反弹效果 Ball.prototype.run = function(){ //当小球处于快超过x轴边界时,取相反速度,就有了反弹效果 if(this.x + this.size >= w){ this.speedX = - this.speedX; } //当小球处于快超过y轴边界时,取相反速度,就有了反弹效果 if(this.y + this.size >= h){ this.speedY = - this.speedY; } if(this.x - this.size <= 0){ this.speedX = -this.speedX; } if(this.y - this.size <= 0){ this.speedY = -this.speedY; } //当小球的速度恰好随机为0时,小球是静止在页面上的,从体验角度上来说不太美观,所以当在x轴的速度与在y轴的速度同时为0时,重新定义速度 if(this.speedX == 0 && this.speedY == 0){ this.speeX = randomFn(-7,7); this.speedY = randomFn(-7,7); } this.x += this.speedX; this.y += this.speedY; } //当两个小球相撞或有重叠时,改变颜色 Ball.prototype.xiangzzhuang = function(){ for(var i = 0 ; i < balls.length; i++){ if(!(this === balls[i])){ //此处运用到了勾股定理 var dx = this.x - balls[i].x; var dy = this.y - balls[i].y; var distance = Math.sqrt(dx*dx+dy*dy); if(distance < this.size + balls[i].size){ balls[i].color = this.color = 'rgb('+ randomFn(0,255) +',' + randomFn(0,255) + ',' + randomFn(0,255) + ')'; } } } } var balls = []; function loop(){ //绘制画布的背景颜色 ctx.fillStyle = 'rgba(0,0,0,0.3)'; ctx.fillRect(0,0,w,h); //创建30个小球 while(balls.length < 30){ var ball = new Ball( randomFn(0,w), randomFn(0,h), randomFn(10,20), randomFn(-7,7), randomFn(-7,7), 'rgb('+ randomFn(0,255) +',' + randomFn(0,255) + ',' + randomFn(0,255) + ')' ) balls.push(ball); } for(var i = 0; i < balls.length; i++){ balls[i].draw(); balls[i].run(); balls[i].xiangzzhuang(); } //window提供的API动画,以电脑屏幕刷新频率为基准(16.6ms就刷新一次,人类肉眼根本觉察不到),所以不会造成动画卡顿的现象 window.requestAnimationFrame(loop); } loop(); </script> </html>
相关文章推荐
- 小球动画代码
- Android仿视频加载旋转小球动画效果的实例代码
- 跟随鼠标一起流动的粒子动画 JS 原生代码
- p5.js入门教程之小球动画示例代码
- Android实现移动小球和CircularReveal页面切换动画实例代码
- [js高手之路]html5 canvas动画教程 - 边界判断与小球粒子模拟喷泉,散弹效果
- 代码艺术-Android针对带有复杂动画自定义view的代码设计
- Adobe源码泄漏?3行代码搞定,Flash动画无缝导入Android/iOS/cocos2dx(二)
- android 代码中实现动画效果
- 网页中插入Flash动画的代码
- Unity3D中暂停时的动画及粒子效果实现
- code swarm生成可视化代码项目贡献动画
- js面向对象之躁动的小球()
- 完美实现GIF动画缩略图的php代码
- CSS动画集合 可直接生成动画代码 – AniCollection
- 安卓动画代码实现
- overridePendingTransition设定两个activity之间的转场动画没有效果,但不报错! (大神帮帮我吧,代码如下,谢谢)
- flash加载动画效果AS3.0代码实现
- 代码点评:小球下落
- Unity3D小球移动控制代码(向量相加)