Canvas是HTML5中非常重要而且有用的东西,我们可以在Canvas上绘制任意的元素,就像你制作Flash一样。今天我们就在Canvas上来制作一款火焰发射的效果。就像古代的火球炮一样,而且可以在浏览器边缘反弹,感觉会比较屌。来看看效果图:

我们可以在这里查看火焰球的DEMO演示

当然,我们要来分析一下源代码,主要是一些JS代码。

首先很简单地在页面上放一个canvas标签,并且给它点简单的样式:

<canvas></canvas>

canvas{position: absolute;height: 100%;width: 100%;left: 0;top: 0;cursor: crosshair;
}

接下来就来分析一下JS代码。我们来逐步分解JS。

由于这个是二维动画,所以我们利用canvas的getContext方法来返回一个对象,这个对象包含我们对二维动画操作的API,代码如下:

canvas = document.querySelector('canvas');
ctx = canvas.getContext('2d');

下面我们来定义粒子:

particles = {};
newParticle = (function(){var nextIndex = 0;return function(x,y,r,o,c,xv,yv,rv,ov){particles[++nextIndex] = {index: nextIndex,x: x,y: y,r: r,o: o,c: c,xv: xv,yv: yv,rv: rv,ov: ov};};
})();

然后我们来定义火球:

fireballs = {};
newFireball = (function(){var nextIndex = 0;return function(x,y,xv,yv,life){fireballs[++nextIndex] = {index: nextIndex,x: x,y: y,xv: xv,yv: yv,life: life};};
})();

这里life表示火球的生命周期,下面我们可以看到,life值会随着火球发射力度的改变而改变。

接下来是定义鼠标拖动弹弓,准备发射火球:

mouse = {x:0,y:0,d:0};
onmousemove = function(e){mouse.x = e.clientX-o.x;mouse.y = e.clientY-o.y;var dx = mouse.x - pos1.x,dy = mouse.y - pos1.y;mouse.d = Math.sqrt(dx*dx+dy*dy);
};charging = false;
pos1 = {x:0,y:0};
showInstructions = true;
onmousedown = function(e){pos1.x = mouse.x;pos1.y = mouse.y;charging = true;showInstructions = false;
};onmouseup = function(){if(charging){newFireball(mouse.x,mouse.y,(pos1.x-mouse.x)*0.03,(pos1.y-mouse.y)*0.03,600);charging = false;}
};

可以看到,当鼠标按键弹起时,新建一个火球,并初始化life值。

下面是火球运动时的动画执行代码,包括碰到浏览器边缘时的反射效果:

time = 0;
requestAnimationFrame(loop = function(){ctx.setTransform(1,0,0,1,0,0);ctx.globalCompositeOperation = 'source-over';ctx.globalAlpha = 1;ctx.fillStyle = bgColor;ctx.fillRect(0,0,width,height);ctx.translate(o.x,o.y);if(charging){var c = Math.floor(30+mouse.d/2);ctx.strokeStyle = 'rgba('+c+','+c+','+c+',1)';ctx.lineWidth = 4;ctx.beginPath();ctx.moveTo(pos1.x,pos1.y);ctx.lineTo(mouse.x,mouse.y);ctx.lineCap = 'round';ctx.stroke();}if(showInstructions){pos1.x = -70;pos1.y = -35;if(time<10){var x = -70,y = -35,r = 30-time*2,a = time/10;}else if(time<80){var x = (time-10)*2-70,y = (time-10)-35,r = 10,a = 1;}else if(time<90){var x = 70,y = 35,r = 10+(time-80)*2,a = 1-(time-80)/10;}else if(time<140){var x = 70,y = 35,r = 30,a = 0;}var dx = pos1.x-x,dy = pos1.y-y,d = Math.sqrt(dx*dx+dy*dy);if(time<80&&time>10){ctx.globalCompositeOperation = 'source-over';ctx.globalAlpha = 1;var c = Math.floor(30+d/2);ctx.strokeStyle = 'rgba('+c+','+c+','+c+',1)';ctx.lineWidth = 4;ctx.beginPath();ctx.moveTo(pos1.x,pos1.y);ctx.lineTo(x,y);ctx.lineCap = 'round';ctx.stroke();}if(time<140){ctx.globalCompositeOperation = 'source-over';ctx.globalAlpha = a;ctx.beginPath();ctx.arc(x,y,r,0,Math.PI*2);ctx.lineWidth = 2;ctx.strokeStyle = '#aaa';ctx.stroke();}if(time==80){newFireball(x,y,dx*0.03,dy*0.03,240);}time = (time+1)%180;}ctx.globalCompositeOperation = 'lighter';for(var i in particles){var p = particles[i];ctx.beginPath();ctx.arc(p.x,p.y,p.r,0,Math.PI*2);ctx.globalAlpha = p.o;ctx.fillStyle = p.c;ctx.fill();}for(var i in particles){var p = particles[i];p.x += p.xv;p.y += p.yv;p.r += p.rv;p.o += p.ov;if(p.r<0)delete particles[p.index];if(p.o<0)delete particles[p.index];}for(var i in fireballs){f = fireballs[i];var numParticles = Math.sqrt(f.xv*f.xv+f.yv*f.yv)/5;if(numParticles<1)numParticles=1;var numParticlesInt = Math.ceil(numParticles),numParticlesDif = numParticles/numParticlesInt;for(var j=0;j<numParticlesInt;j++){newParticle(f.x-f.xv*j/numParticlesInt,f.y-f.yv*j/numParticlesInt,7,numParticlesDif,particleColor,Math.random()*0.6-0.3,Math.random()*0.6-0.3,-0.3,-0.05*numParticlesDif);}f.x += f.xv;f.y += f.yv;f.yv += gravity;var boundary;if(f.y<(boundary = edge.top+7)){f.y = boundary;f.yv *= -1;}else if(f.y>(boundary = edge.bottom-7)){f.y = boundary;f.yv *= -1;}if(f.x>(boundary = edge.right-7)){f.x = boundary;f.xv *= -1;}else if(f.x<(boundary = edge.left+7)){f.x = boundary;f.xv *= -1;}if(--f.life<0)delete fireballs[f.index];}requestAnimationFrame(loop);
});

这款HTML5 Canvas火球动画就到这里了,js代码比较多,最终的源码可以到这里下载,下载地址>>

转载于:https://www.cnblogs.com/html5tricks/p/3684828.html

HTML5 Canvas火焰效果 像火球发射一样相关推荐

  1. html打飞机游戏代码,利用HTML5 Canvas实现打飞机游戏

    这篇文章主要介绍了利用HTML5 Canvas制作一个简单的打飞机游戏,作者也给出了相关的Javascript代码,需要的朋友可以参考下 之前在当耐特的DEMO里看到个打飞机的游戏,然后就把他的图片和 ...

  2. HTML5 canvas 实现回合制战棋游戏(1):加载和绘制图形

    HTML5 canvas 实现回合制战棋游戏(1):加载和绘制图形 游戏介绍 完整代码 代码目录 游戏运行 HTML5 canvas 绘制图形 canvas 介绍 绘制函数 加载图片 生物行走动画绘制 ...

  3. html li 右跟下有倒影,HTML5 canvas实现的下雨夜湖面星空倒影动画特效

    HTML5 CANVAS 下雨夜的湖面星空倒影 * { margin: 0; padding: 0; border: 0; background: #000 } canvas { position: ...

  4. html5 canvas雨点打到窗玻璃动画

    html5 canvas雨点打到窗玻璃动画 HTML5下雨效果 效果预览:http://hovertree.com/texiao/html5/4.htm 以下是代码: 1 <!doctype h ...

  5. HTML5 canvas画图

    HTML5 canvas画图 HTML5 <canvas> 标签用于绘制图像(通过脚本,通常是 JavaScript). 不过,<canvas> 元素本身并没有绘制能力(它仅仅 ...

  6. Html5 Canvas 扫雷 (IE9测试通过)

    扫雷是一个非常经典的游戏,记得在第一次接触的windows 3.22 上就有扫雷了,到现在的Win7,依然保留着这个经典的游戏,结合Html5 Canvas,模仿Win7的UI,将老板扫雷进行了升级. ...

  7. HTML5 Canvas 基础API和实例

    开发HTML代码是一件简单的事情,一个文字编辑器,然后一个支持HTML5的浏览器即可(本人的浏览器是Firefox8.0.1).了解HTML的朋友应该知道,HTML5中最让人兴奋的API是canvas ...

  8. html5 canvas 加载图片

    html5 canvas 加载图片 视频 https://www.bilibili.com/video/BV19E411G7Vj?p=30 https://www.bilibili.com/video ...

  9. html滑动直播,HTML5 canvas实现的静态循环滚动播放弹幕

    本文主要介绍了HTML5 canvas实现的静态循环滚动播放弹幕,分享给大家,具体如下: 使用方法和API 语法如下: canvasBarrage(canvas, data); 其中: canvas ...

最新文章

  1. 开源分布式数据库RadonDB的核心技术与实现
  2. 制作keil5的pack
  3. 【云吞铺子之专家来了】CDN缓存解读和配置策略
  4. [OS复习]进程互斥与同步1
  5. ROS-Rtabmap:linux shell运行多个shell(运行多个程序)
  6. cygwin安装好了如何添加cmake make_在windows上使用cmake
  7. java在线支付---13.java在线支付所有源码:
  8. css 实现背景图片拉伸
  9. php cookie注销,注销后未设置php cookie
  10. 软件资源消耗测试,综合测试:性能与资源消耗堪称完美
  11. 咪咕音乐HTML代码,咪咕音乐播放器如何更换皮肤和底纹技术分享
  12. python和r语言哪个简单_python与r语言哪个简单
  13. 网易明日之后那个服务器人最多,明日之后:网易“公认”全服前4强营地出炉,竟全部来自一个区...
  14. 【MicroPython ESP32】ssd1306驱动0.96“I2C屏幕cube3D图形显示
  15. php 判断是否是机器人,PHP_php实现判断访问来路是否为搜索引擎机器人的方法,本文实例讲述了php实现判断访 - phpStudy...
  16. CCPC-Wannafly Comet OJ 夏季欢乐赛(2019)E.飞行棋(期望dp+矩阵快速幂)
  17. 高中教学有计算机课吗,谈高中信息技术课教学
  18. 【3】git基本用法(下)
  19. APP软件中的DID作用
  20. 1394接口_台式机1394视频采集卡推荐

热门文章

  1. python运算符解释_Python的运算符 (下)
  2. Android基于XMPP Smack Openfire下学习开发IM(二)对分组、好友和头像等一些操作
  3. 自动跳转代码与自动弹出网页代码
  4. linux确定刻录机目录,Linux下如何检测DVD刻录机的设备名及写入速度
  5. 中国铅酸蓄电池市场需求调研与投资策略分析报告2022年版
  6. 织梦 PHP和帝国哪个好,织梦CMS(dedecms)和帝国CMS哪个好
  7. 计算机科技英语写作,科技英语阅读与写作
  8. 7-3 Factorio#6矿石
  9. ubuntu中qt调用mysql中的一些问题
  10. vue---网页全屏