码迷,mamicode.com
首页 > 其他好文 > 详细

canvas随笔之“OPEN”粒子汇聚

时间:2015-04-06 12:38:27      阅读:134      评论:0      收藏:0      [点我收藏+]

标签:

实现思路:

1 保证屏幕上存在一定数量的粒子,超出一定数量,删除。

2 每个粒子产生时会有自己的目标点,这些目标点便是组成字母的像素点,粒子在运动过程中会奔向该目标点。

3 目标点是如何产生的?首先,在一张“隐形”的canvas下绘制出需要的字母,然后根据文字颜色获取组成这些文字的坐标点。最后将这些点作为粒子运动的目标点。

 

<!DOCTYPE html>
<html>
  <head>
    <title>grain.html</title>
    
    <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
    <meta http-equiv="description" content="this is my page">
    <meta http-equiv="content-type" content="text/html; charset=UTF-8">
  </head>
  
  <body>
      
    <canvas id="grain_canvas">您的浏览器不支持canvas</canvas>
    <script>
        window.onload = function(){
            var global = {
                    cvs:null,
                    ctx:null,
                    imgData:null, //获取字母
                    num:0,
                    timer:null,
                    goalPos:[],
                    particals:[] 
            };
            init();
            function init(){
                global.cvs = document.getElementById("grain_canvas");
                if(global.cvs == null)
                    return false;
                global.cvs.width = 700;
                global.cvs.height = 130;
                global.cvs.style.background = "#000";
                global.ctx = global.cvs.getContext(‘2d‘);
                
                    global.num = 0;
                    drawLetters();
                    loop();
                
            }
            
            //画出字母
            function drawLetters(){
                var cvs = document.createElement(‘canvas‘);
                var ctx = cvs.getContext(‘2d‘);
                cvs.style.background = "yellow";
                cvs.width = 800;
                cvs.height = 40;
                ctx.font = "20px verdana";
                ctx.fillStyle = "red";
                ctx.fillText("OPEN WEBLAB",0,25);
                //document.body.appendChild(cvs);
                global.imgData = ctx.getImageData(0,0,cvs.width,cvs.height);
                var _img = global.imgData.data;
                for(var i = 0, n = _img.length; i < n; i += 8){
                    if(_img[i + 0] != 0 || _img[i + 1] != 0 || _img[i + 2] != 0){
                        var _pos = {
                            x:(i % cvs.width),
                            y:((i / cvs.width) )|0 
                        } ;
                        global.goalPos.push(_pos);
                    }
                }
            }
            
            function loop(){
                global.ctx.clearRect(0,0,global.cvs.width,global.cvs.height);
                var partical = new Particle(Math.random() * global.cvs.width, Math.random() * global.cvs.height);
                global.particals.push(partical);
                for(var i = 0, len = global.particals.length; i < len; i++){
                    if(global.particals[i].xPos != global.goalPos[ global.particals[i].index ].x
                    || global.particals[i].yPos != global.goalPos[ global.particals[i].index ].y)
                        global.particals[i].setPos();
                    global.particals[i].draw();    
                }
                if (global.particals.length > 1500){
                    delete global.particals[0];
                    global.particals.shift();
                }
                
                global.num++;
                global.timer = setTimeout(function(){loop();},10);
                
                if(global.num >= 1400){
                    clearTimeout(global.timer);
                    global.ctx.clearRect(0,0,global.cvs.width,global.cvs.height);
                    for(var i = 0, len = global.goalPos.length; i < len; i++){
                        var partical = new Particle(global.goalPos[i].x, global.goalPos[i].y);
                        partical.draw();
                    }
                }
            }
            //粒子类
             function Particle (xPos, yPos) {  
                 this.xPos = xPos;
                 this.yPos = yPos;
                 this.index = Math.round( Math.random() * global.goalPos.length * 1000) % global.goalPos.length;
                 //画出粒子
                 this.draw = function(){
                     global.ctx.fillStyle = "white";
                     global.ctx.beginPath();
                     global.ctx.arc(this.xPos, this.yPos , 2, 0, Math.PI*2, true);
                     global.ctx.fill();
                 };
                 //设置粒子坐标
                 this.setPos = function(){
                     var x = global.goalPos[this.index].x, y = global.goalPos[this.index].y;
                     if (x > this.xPos)this.xPos += 2;
                     else this.xPos -= 2;
                     this.yPos = ((y - yPos) * this.xPos + ((x * yPos) - (y * xPos))) / (x - xPos);
                 };
              }
        };
    </script>
  </body>
</html>

 

canvas随笔之“OPEN”粒子汇聚

标签:

原文地址:http://www.cnblogs.com/codelovers/p/4395662.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!