html5实现的一个简单的下雨效果
2013-05-06 17:13
501 查看
<style type="text/css"> html, body{width: 100%; height: 100%; padding: 0; margin: 0; overflow: hidden;} canvas{background: black;} </style> <canvas></canvas> <script type="text/javascript" src="js/base.js"></script> <script> var Rain = Rain || (function(){ var _canvas = document.getElementsByTagName('canvas')[0]; var _context = _canvas.getContext('2d'); var _raindrop_count = 1; var _raindrop_group = []; var _wave_group = []; var _env = { floor_height: 100, canvas_width: 0, canvas_height: 0 }; var _raindrop = function(mx, my/*, lx, ly*/, lw, vx, vy, ax, ay){ this.mx = mx; // 起点X this.my = my; // 起点Y //this.lx = lx; // 结束点X //this.ly = ly; // 结束点Y this.lw = lw; // 线宽 this.vx = vx; // 水平速度 this.vy = vy; // 垂直速度 this.ax = ax; // 水平加速度 this.ay = ay; // 垂直加速度 }; var _wave = function(x, y, rx, ry, vx, vy, a, va){ this.x = x; this.y = y; this.rx = rx; this.ry = ry; this.vx = vx; this.vy = vy; this.a = a; this.va = va; }; // 方法来自http://www.cnblogs.com/shn11160/archive/2012/08/27/2658057.html function BezierEllipse1(context, x, y, a, b, s) { //关键是bezierCurveTo中两个控制点的设置 //0.5和0.6是两个关键系数(在本函数中为试验而得) var ox = 0.5 * a, oy = 0.6 * b; context.save(); context.translate(x, y); context.beginPath(); context.strokeStyle = s; //从椭圆纵轴下端开始逆时针方向绘制 context.moveTo(0, b); context.bezierCurveTo(ox, b, a, oy, a, 0); context.bezierCurveTo(a, -oy, ox, -b, 0, -b); context.bezierCurveTo(-ox, -b, -a, -oy, -a, 0); context.bezierCurveTo(-a, oy, -ox, b, 0, b); context.closePath(); context.stroke(); context.restore(); }; var _onResize = function(){ _canvas.width = document.width; _canvas.height = document.height; _env.canvas_width = document.width; _env.canvas_height = document.height; } var _createRaindrop = function(){ var mx = Math.random() * _env.canvas_width; var my = Math.random() * (- _env.floor_height); var vx = Math.random() * -1 - 1; var vy = Math.random() * 2 + 14; var ax = Math.random() * 0; var ay = Math.random() * 0.2; return new _raindrop(mx, my, 1, vx, vy, ax, ay); } var _createWave = function(x, y, vx, vy){ return new _wave(x, y, 2, 1, 2, 1, 1, .05); } var _waving = function(){ _wave_group.each(function(index, wave){ wave.rx += wave.vx; wave.ry += wave.vy; wave.a -= wave.va; if(wave.a <= 0){ _wave_group.remove(index); return false; } BezierEllipse1(_context, wave.x, wave.y, wave.rx, wave.ry, 'rgba(255, 255, 255, {0})'.format(wave.a)); }); } var _Rainning = function(){ for (var i = 0; i < _raindrop_count; i++){ var _raindrop = _createRaindrop(); _raindrop_group.push(_raindrop); } _raindrop_group.each(function(index, raindrop){ raindrop.lx = raindrop.mx; raindrop.ly = raindrop.my; raindrop.vx += raindrop.ax; raindrop.vy += raindrop.ay; raindrop.mx += raindrop.vx; raindrop.my += raindrop.vy; if(raindrop.my > (_env.canvas_height - _env.floor_height)){ var wave = _createWave(raindrop.mx, raindrop.my); _raindrop_group.remove(index); _wave_group.push(wave); return false; } _context.beginPath(); _context.lineWidth = raindrop.lw; _context.moveTo(raindrop.mx, raindrop.my); _context.lineTo(raindrop.lx, raindrop.ly); _context.stroke(); }); } return { init: function(){ window.onresize = _onResize; _onResize(); _context.strokeStyle = '#999'; setInterval(function(){ _context.clearRect(0, 0, _env.canvas_width, _env.canvas_height); _Rainning(); _waving(); }, 33); } } })(); Rain.init(); </script>
base.js的代码请从该文章获取http://blog.csdn.net/coderq/article/details/7229050
相关文章推荐
- 使用ListView实现一个简单的学生信息展示效果
- 如何实现一个原质化菜单项或按钮HTML5动画效果
- 如何实现一个原质化菜单项或按钮HTML5动画效果
- 使用HTML5和jQuery插件Quicksand实现一个超酷的星际争霸2兵种分类展示效果
- js实现一个简单的数字时钟效果
- 分享一个HTML5画布实现的超酷文字弹跳球效果
- 代码录播:jQueryMobile 实现一个简单的弹出框效果
- 写一个简单的实现的具有冲击效果的界面效果
- 原生javascript实现的一个简单动画效果
- Javascript实现一个简单的输入关键字添加标签效果实例
- jquery实现的一个简单进度条效果实例
- 分享一个HTML5画布实现的超酷文字弹跳球效果
- IOS中一个简单的粒子效果实现
- 用HTML5的canvas实现一个炫酷时钟效果
- 分享一个HTML5的drag and drop API实现的图片拖拽分组效果
- Tab切换动画滑动效果的一个简单实现
- 一个简单的滚动数字的效果实现
- css3和jQuery实现一个简单的标签页效果
- html5 canvas 实现一个简单的叮当猫头部
- 实现一个菜单的简单的动画效果