开源夏令营之项目汇报3

7月13日,周日

项目:html5光影粒子引擎

上次报告说到做自己的js库,这次说下不用js库,只用canvas的简单粒子的实现。

<!doctype html>
<html lang="en">
 <head>
  <meta charset="UTF-8">
  <meta name="Generator" content="EditPlus®">
  <meta name="Author" content="">
  <meta name="Keywords" content="">
  <meta name="Description" content="">
  <title>canvas粒子动画</title>
 <style>
  *{margin:0;padding:0;}
 </style>

 <script type="text/javascript">
  window.onload = function(){
   var canvas = document.getElementById("canvas");
   var ctx = canvas.getContext("2d");
   var W = window.innerWidth,H = window.innerHeight;
   canvas.width = W;
   canvas.height = H;
   var mouse = {};
   var pas = [];
   for(var i=0;i<100;i++){  //100个球
     pas.push(new par());
   }

   canvas.addEventListener('mousemove',t_mouse,false);  //监听鼠标的实时移动
   function t_mouse(e){
    mouse.x = e.pageX;
    mouse.y = e.pageY;
   }

   function par(){//定义光球对象
    this.speed = {x:-2.5+Math.random()*5,y:-15+Math.random()*10}; //定义速度
    if(mouse.x && mouse.y){
     this.loc = {x:mouse.x,y:mouse.y};  //定义位置
    }else{
     this.loc = {x:W/2,y:H/2};
    }
    this.rad = 10+Math.random()*20;    //定义半径
    this.life = 20+Math.random()*10;   //定义生命周期
    this.r_life = this.life;
    this.r = Math.round(Math.random()*255);//定义颜色
    this.g = Math.round(Math.random()*255);
    this.b = Math.round(Math.random()*255);
   }

   function draw(){
    ctx.globalCompositeOperation = "source-over";
    ctx.fillStyle="black";  //设置填充色
    ctx.fillRect(0,0,W,H);
    ctx.globalCompositeOperation = "lighter";  //叠加的部分变得更亮
    for(var i=0;i < pas.length;i++){
     var p = pas[i];  //每产生一个球就赋值给p
     ctx.beginPath(); //开始绘制
     p.opacity = Math.round(p.r_life/p.life*100);  //设置透明度,若不用r_life除,会太大

     var grad = ctx.createRadialGradient(p.loc.x,p.loc.y,0,p.loc.x,p.loc.y,p.rad);//设置放射性(圆形)渐变,p.rad结束直径
     
     grad.addColorStop(0,"rgba("+p.r+","+p.g+","+p.b+","+p.opacity+")");
     grad.addColorStop(0.5,"rgba("+p.r+","+p.g+","+p.b+","+p.opacity+")");
     grad.addColorStop(1,"rgba("+p.r+","+p.g+","+p.b+",0)"); //完全不透明
     ctx.fillStyle = grad;//填充
     ctx.arc(p.loc.x,p.loc.y,p.rad,Math.PI*2,false);//绘制弧形,火焰腾空而起肯定不可能是方形的,不乘以2就是半圆
     ctx.fill();//填充

     //消失就是透明度和半径不断在减少,透明度就是生命周期

     p.r_life--;
     p.rad--;

     p.loc.x += p.speed.x; //坐标不断随机变化,也就是一边移动一边消失
     p.loc.y += p.speed.y;

     if(p.r_life < 0 || p.rad < 0){//消失后重新生成
      pas[i] = new par();
     }
    }
   }
   setInterval(draw,33);
  } 
 </script>
 </head>
 
 <body>
 <canvas id="canvas" width=100% height=100%></canvas>
 </body>
</html>



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值