<span id="mktg5"></span>

<i id="mktg5"><meter id="mktg5"></meter></i>

        <label id="mktg5"><meter id="mktg5"></meter></label>
        最新文章專題視頻專題問答1問答10問答100問答1000問答2000關鍵字專題1關鍵字專題50關鍵字專題500關鍵字專題1500TAG最新視頻文章推薦1 推薦3 推薦5 推薦7 推薦9 推薦11 推薦13 推薦15 推薦17 推薦19 推薦21 推薦23 推薦25 推薦27 推薦29 推薦31 推薦33 推薦35 推薦37視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關鍵字專題關鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
        問答文章1 問答文章501 問答文章1001 問答文章1501 問答文章2001 問答文章2501 問答文章3001 問答文章3501 問答文章4001 問答文章4501 問答文章5001 問答文章5501 問答文章6001 問答文章6501 問答文章7001 問答文章7501 問答文章8001 問答文章8501 問答文章9001 問答文章9501
        當前位置: 首頁 - 科技 - 知識百科 - 正文

        HTML5Canvas實現火焰效果像火球發射一樣的示例代碼

        來源:懂視網 責編:小采 時間:2020-11-27 15:11:00
        文檔

        HTML5Canvas實現火焰效果像火球發射一樣的示例代碼

        HTML5Canvas實現火焰效果像火球發射一樣的示例代碼:Canvas是HTML5中非常重要而且有用的東西,我們可以在Canvas上繪制任意的元素,就像你制作Flash一樣。今天我們就在Canvas上來制作一款火焰發射的效果。就像古代的火球炮一樣,而且可以在瀏覽器邊緣反彈,感覺會比較屌。來看看效果圖:我們可以在這里查看火焰球
        推薦度:
        導讀HTML5Canvas實現火焰效果像火球發射一樣的示例代碼:Canvas是HTML5中非常重要而且有用的東西,我們可以在Canvas上繪制任意的元素,就像你制作Flash一樣。今天我們就在Canvas上來制作一款火焰發射的效果。就像古代的火球炮一樣,而且可以在瀏覽器邊緣反彈,感覺會比較屌。來看看效果圖:我們可以在這里查看火焰球
        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);
        });

        聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

        文檔

        HTML5Canvas實現火焰效果像火球發射一樣的示例代碼

        HTML5Canvas實現火焰效果像火球發射一樣的示例代碼:Canvas是HTML5中非常重要而且有用的東西,我們可以在Canvas上繪制任意的元素,就像你制作Flash一樣。今天我們就在Canvas上來制作一款火焰發射的效果。就像古代的火球炮一樣,而且可以在瀏覽器邊緣反彈,感覺會比較屌。來看看效果圖:我們可以在這里查看火焰球
        推薦度:
        標簽: 火焰 代碼 效果
        • 熱門焦點

        最新推薦

        猜你喜歡

        熱門推薦

        專題
        Top
        主站蜘蛛池模板: 亚洲va无码专区国产乱码| 日本午夜免费福利视频| 亚洲精品国产美女久久久| 美女黄色免费网站| 国产免费人成视频在线观看| 亚洲av日韩精品久久久久久a| 在线看片无码永久免费aⅴ| 亚洲精品欧美综合四区| 四虎免费影院4hu永久免费| rh男男车车的车车免费网站| 亚洲精品夜夜夜妓女网| 中文字幕在线免费观看| 亚洲人成影院77777| 成人在线视频免费| 美女裸体无遮挡免费视频网站| 亚洲AV成人潮喷综合网| CAOPORN国产精品免费视频| 亚洲国产精品免费视频| 免费A级毛片无码无遮挡内射| 亚洲乱码av中文一区二区| 亚洲?V无码成人精品区日韩| 你是我的城池营垒免费看 | 亚洲人成人无码网www电影首页 | 亚洲熟妇无码久久精品| 成人爽A毛片免费看| 美女羞羞喷液视频免费| 国产成人亚洲精品狼色在线| 2021在线永久免费视频| 亚洲a无码综合a国产av中文| 亚洲日韩中文无码久久| 91热成人精品国产免费| 视频一区在线免费观看| 国产AV无码专区亚洲AV男同| 成年女人毛片免费视频| 精品97国产免费人成视频| 亚洲欧洲精品久久| 亚洲国产成人乱码精品女人久久久不卡 | 久久精品亚洲福利| 欧洲乱码伦视频免费| 免费大片av手机看片高清| 久久精品国产亚洲精品2020|