中文字幕免费精品_亚洲视频自拍_亚洲综合国产激情另类一区_色综合咪咪久久

實例教程 HTML5 Canvas 超炫酷煙花綻放動畫實現代碼
來源:易賢網 閱讀:2280 次 日期:2016-07-11 09:56:47
溫馨提示:易賢網小編為您整理了“實例教程 HTML5 Canvas 超炫酷煙花綻放動畫實現代碼”,方便廣大網友查閱!

這是一個很酷的HTML5 Canvas動畫,它將模擬的是我們現實生活中煙花綻放的動畫特效,效果非常逼真,但是畢竟是電腦模擬,帶女朋友看就算了,效果還是差了點,呵呵。這個HTML5 Canvas動畫有一點比較出色,就是其性能,Chrome上基本沒有卡的感覺,就算你放出很多煙花也一樣。

名單

下面我們來簡單分析一下實現這款HTML5煙花特效的過程及代碼,主要由HTML代碼、CSS代碼以及Javascript代碼組成,當然javascript代碼是最重要的。

HTML代碼:

XML/HTML Code

<div id=”gui”></div>  

<div id=”canvas-container”> <div id=”mountains2″></div>    

<div id=”mountains1″></div><div id=”skyline”></div> </div>  

HTML的結構非常簡單,即構造了一個canvas容器,我們會利用JS在這個容器中生成一個Canvas對象。看最后的JS代碼你就會知道了。

CSS代碼:

CSS Code

#canvas-container { background: #000 url(bg.jpg); height: 400px; left: 50%; margin: -200px 0 0 -300px; position: absolute; top: 50%; width: 600px; z-index: 2;   

} canvas { cursor: crosshair; display: block; position: relative; z-index: 3;   

} canvas:active { cursor: crosshair;   

} #skyline { background: url(skyline.png) repeat-x 50% 0; bottombottom: 0; height: 135px; left: 0; position: absolute; width: 100%; z-index: 1;       

} #mountains1 { background: url(mountains1.png) repeat-x 40% 0; bottombottom: 0; height: 200px; left: 0; position: absolute; width: 100%; z-index: 1;       

} #mountains2 { background: url(mountains2.png) repeat-x 30% 0; bottombottom: 0; height: 250px; left: 0; position: absolute; width: 100%; z-index: 1;       

} #gui { rightright: 0; position: fixed; top: 0; z-index: 3;   

}  

CSS代碼沒什么特別,主要也就定義一下背景色和邊框之類的。

接下來是最重要的Javascript代碼。

Javascript代碼:

JavaScript Code

self.init = function(){       

    self.dt = 0;   

        self.oldTime = Date.now();   

        self.canvas = document.createElement('canvas');                   

        self.canvasContainer = $('#canvas-container'); var canvasContainerDisabled = document.getElementById('canvas-container');   

        self.canvas.onselectstart = function() { return false;   

        };   

        self.canvas.width = self.cw = 600;   

        self.canvas.height = self.ch = 400;       

        self.particles = [];       

        self.partCount = 30;   

        self.fireworks = [];       

        self.mx = self.cw/2;   

        self.my = self.ch/2;   

        self.currentHue = 170;   

        self.partSpeed = 5;   

        self.partSpeedVariance = 10;   

        self.partWind = 50;   

        self.partFriction = 5;   

        self.partGravity = 1;   

        self.hueMin = 150;   

        self.hueMax = 200;   

        self.fworkSpeed = 2;   

        self.fworkAccel = 4;   

        self.hueVariance = 30;   

        self.flickerDensity = 20;   

        self.showShockwave = false;   

        self.showTarget = true;   

        self.clearAlpha = 25;   

        self.canvasContainer.append(self.canvas);   

        self.ctx = self.canvas.getContext('2d');   

        self.ctx.lineCap = 'round';   

        self.ctx.lineJoin = 'round';   

        self.lineWidth = 1;   

        self.bindEvents();               

        self.canvasLoop();   

        self.canvas.onselectstart = function() { return false;   

        };   

    };  

這段JS代碼主要是往canvas容器中構造一個Canvas對象,并且對這個canvas對象的外觀以及動畫屬性作了初始化。

JavaScript Code

var Particle = function(x, y, hue){ this.x = x; this.y = y; this.coordLast = [   

            {x: x, y: y},   

            {x: x, y: y},   

            {x: x, y: y}   

        ]; this.angle = rand(0, 360); this.speed = rand(((self.partSpeed - self.partSpeedVariance) <= 0) ? 1 : self.partSpeed - self.partSpeedVariance, (self.partSpeed + self.partSpeedVariance)); this.friction = 1 - self.partFriction/100; this.gravity = self.partGravity/2; this.hue = rand(hue-self.hueVariance, hue+self.hueVariance); this.brightness = rand(50, 80); this.alpha = rand(40,100)/100; this.decay = rand(10, 50)/1000; this.wind = (rand(0, self.partWind) - (self.partWind/2))/25; this.lineWidth = self.lineWidth;   

    };   

    Particle.prototype.update = function(index){ var radians = this.angle * Math.PI / 180; var vx = Math.cos(radians) * this.speed; var vy = Math.sin(radians) * this.speed + this.gravity; this.speed *= this.friction; this.coordLast[2].x = this.coordLast[1].x; this.coordLast[2].y = this.coordLast[1].y; this.coordLast[1].x = this.coordLast[0].x; this.coordLast[1].y = this.coordLast[0].y; this.coordLast[0].x = this.x; this.coordLast[0].y = this.y; this.x += vx * self.dt; this.y += vy * self.dt; this.angle += this.wind; this.alpha -= this.decay; if(!hitTest(0,0,self.cw,self.ch,this.x-this.radius, this.y-this.radius, this.radius*2, this.radius*2) || this.alpha < .05){                       

            self.particles.splice(index, 1);       

        }               

    };   

    Particle.prototype.draw = function(){ var coordRand = (rand(1,3)-1);   

        self.ctx.beginPath();                                   

        self.ctx.moveTo(Math.round(this.coordLast[coordRand].x), Math.round(this.coordLast[coordRand].y));   

        self.ctx.lineTo(Math.round(this.x), Math.round(this.y));   

        self.ctx.closePath();                   

        self.ctx.strokeStyle = 'hsla('+this.hue+', 100%, '+this.brightness+'%, '+this.alpha+')';   

        self.ctx.stroke(); if(self.flickerDensity > 0){ var inverseDensity = 50 - self.flickerDensity; if(rand(0, inverseDensity) === inverseDensity){   

                self.ctx.beginPath();   

                self.ctx.arc(Math.round(this.x), Math.round(this.y), rand(this.lineWidth,this.lineWidth+3)/2, 0, Math.PI*2, false)  self.ctx.closePath(); var randAlpha = rand(50,100)/100;   

                self.ctx.fillStyle = 'hsla('+this.hue+', 100%, '+this.brightness+'%, '+randAlpha+')';   

                self.ctx.fill();   

            }       

        }   

    };  

這段JS代碼的功能是實現煙花爆炸后的小顆粒的繪制,從draw方法中可以看出,創建幾個隨機點,煙花顆粒即可在這個范圍的隨機點中散落。

JavaScript Code

var Firework = function(startX, startY, targetX, targetY){ this.x = startX; this.y = startY; this.startX = startX; this.startY = startY; this.hitX = false; this.hitY = false; this.coordLast = [   

            {x: startX, y: startY},   

            {x: startX, y: startY},   

            {x: startX, y: startY}   

        ]; this.targetX = targetX; this.targetY = targetY; this.speed = self.fworkSpeed; this.angle = Math.atan2(targetY - startY, targetX - startX); this.shockwaveAngle = Math.atan2(targetY - startY, targetX - startX)+(90*(Math.PI/180)); this.acceleration = self.fworkAccel/100; this.hue = self.currentHue; this.brightness = rand(50, 80); this.alpha = rand(50,100)/100; this.lineWidth = self.lineWidth; this.targetRadius = 1;   

    };   

    Firework.prototype.update = function(index){   

        self.ctx.lineWidth = this.lineWidth;   

        vx = Math.cos(this.angle) * this.speed,   

        vy = Math.sin(this.angle) * this.speed; this.speed *= 1 + this.acceleration; this.coordLast[2].x = this.coordLast[1].x; this.coordLast[2].y = this.coordLast[1].y; this.coordLast[1].x = this.coordLast[0].x; this.coordLast[1].y = this.coordLast[0].y; this.coordLast[0].x = this.x; this.coordLast[0].y = this.y; if(self.showTarget){ if(this.targetRadius < 8){ this.targetRadius += .25 * self.dt;   

            } else { this.targetRadius = 1 * self.dt;       

            }   

        } if(this.startX >= this.targetX){ if(this.x + vx <= this.targetX){ this.x = this.targetX; this.hitX = true;   

            } else { this.x += vx * self.dt;   

            }   

        } else { if(this.x + vx >= this.targetX){ this.x = this.targetX; this.hitX = true;   

            } else { this.x += vx * self.dt;   

            }   

        } if(this.startY >= this.targetY){ if(this.y + vy <= this.targetY){ this.y = this.targetY; this.hitY = true;   

            } else { this.y += vy * self.dt;   

            }   

        } else { if(this.y + vy >= this.targetY){ this.y = this.targetY; this.hitY = true;   

            } else { this.y += vy * self.dt;   

            }   

        } if(this.hitX && this.hitY){ var randExplosion = rand(0, 9);   

            self.createParticles(this.targetX, this.targetY, this.hue);   

            self.fireworks.splice(index, 1);                       

        }   

    };   

    Firework.prototype.draw = function(){   

        self.ctx.lineWidth = this.lineWidth; var coordRand = (rand(1,3)-1);                       

        self.ctx.beginPath();                               

        self.ctx.moveTo(Math.round(this.coordLast[coordRand].x), Math.round(this.coordLast[coordRand].y));   

        self.ctx.lineTo(Math.round(this.x), Math.round(this.y));   

        self.ctx.closePath();   

        self.ctx.strokeStyle = 'hsla('+this.hue+', 100%, '+this.brightness+'%, '+this.alpha+')';   

        self.ctx.stroke(); if(self.showTarget){   

            self.ctx.save();   

            self.ctx.beginPath();   

            self.ctx.arc(Math.round(this.targetX), Math.round(this.targetY), this.targetRadius, 0, Math.PI*2, false)   

            self.ctx.closePath();   

            self.ctx.lineWidth = 1;   

            self.ctx.stroke();   

            self.ctx.restore();   

        } if(self.showShockwave){   

            self.ctx.save();   

            self.ctx.translate(Math.round(this.x), Math.round(this.y));   

            self.ctx.rotate(this.shockwaveAngle);   

            self.ctx.beginPath();   

            self.ctx.arc(0, 0, 1*(this.speed/5), 0, Math.PI, true);   

            self.ctx.strokeStyle = 'hsla('+this.hue+', 100%, '+this.brightness+'%, '+rand(25, 60)/100+')';   

            self.ctx.lineWidth = this.lineWidth;   

            self.ctx.stroke();   

            self.ctx.restore();   

        }                                    

    };  

這段JS代碼是創建煙花實例的,我們也可以從draw方法中看出,當我們鼠標點擊畫布中的某點時,煙花發射的目的地就在那個點上。

這款HTML5 Canvas煙花效果的核心代碼就是這樣,謝謝閱讀,希望能幫到大家

更多信息請查看網頁制作
由于各方面情況的不斷調整與變化,易賢網提供的所有考試信息和咨詢回復僅供參考,敬請考生以權威部門公布的正式信息和咨詢為準!

2026上岸·考公考編培訓報班

  • 報班類型
  • 姓名
  • 手機號
  • 驗證碼
關于我們 | 聯系我們 | 人才招聘 | 網站聲明 | 網站幫助 | 非正式的簡要咨詢 | 簡要咨詢須知 | 新媒體/短視頻平臺 | 手機站點 | 投訴建議
工業和信息化部備案號:滇ICP備2023014141號-1 云南省教育廳備案號:云教ICP備0901021 滇公網安備53010202001879號 人力資源服務許可證:(云)人服證字(2023)第0102001523號
云南網警備案專用圖標
聯系電話:0871-65099533/13759567129 獲取招聘考試信息及咨詢關注公眾號:hfpxwx
咨詢QQ:1093837350(9:00—18:00)版權所有:易賢網
云南網警報警專用圖標
中文字幕免费精品_亚洲视频自拍_亚洲综合国产激情另类一区_色综合咪咪久久
国产精品女主播一区二区三区| 欧美日韩国产精品一卡| 在线成人av| 在线观看91精品国产麻豆| 在线 亚洲欧美在线综合一区| 国产精品青草综合久久久久99| 欧美激情亚洲自拍| 国产精品乱码久久久久久| 国内精品福利| 在线视频精品一区| 久久久噜噜噜久噜久久| 欧美精品一区二区在线观看| 欧美精品粉嫩高潮一区二区| 国产精品国产a| 亚洲精品美女在线观看| 中日韩美女免费视频网址在线观看 | 欧美在线一二三| 欧美激情精品久久久久久大尺度 | 欧美日韩国产123| 国内精品久久久久久久影视麻豆| 99精品免费视频| 国产精品99久久久久久白浆小说| 欧美 日韩 国产 一区| 狠狠干综合网| 欧美一区高清| 国产精品毛片大码女人| 99国产精品久久| 欧美精品久久99| 在线午夜精品| 国产精品私拍pans大尺度在线| 亚洲人成7777| 欧美大片免费观看| 亚洲精品国产日韩| 欧美va天堂在线| 妖精视频成人观看www| 欧美a级片网| 亚洲精品视频啊美女在线直播| 久久精品国产69国产精品亚洲| 国产精品a级| 亚洲欧美综合| 亚洲高清视频一区二区| 欧美精品麻豆| 欧美一区二区三区婷婷月色 | 欧美视频在线观看一区| 亚洲国产成人91精品| 美国三级日本三级久久99| 国外成人免费视频| 欧美精品 国产精品| 欧美一级视频精品观看| 一本色道88久久加勒比精品| 国产精品一区亚洲| 欧美乱大交xxxxx| 欧美在线free| 日韩亚洲在线观看| 国产精品扒开腿做爽爽爽软件| 欧美一区二区三区久久精品茉莉花| 在线看一区二区| 加勒比av一区二区| 国产精品日韩一区二区| 欧美日韩高清免费| 久热成人在线视频| 欧美一区二区三区精品| 亚洲午夜精品久久久久久浪潮| 国语自产精品视频在线看| 欧美日韩一级片在线观看| 欧美~级网站不卡| 久久亚洲二区| 久久天天躁夜夜躁狠狠躁2022| 午夜精品成人在线| 亚洲欧美国产另类| 久久av一区二区三区| 午夜在线精品偷拍| 久久九九久精品国产免费直播| 亚洲欧美日韩综合aⅴ视频| 亚洲欧美日韩一区在线| 午夜精品久久久久| 欧美一区二区三区日韩视频| 欧美一区二区三区四区高清| 亚洲免费观看视频| 亚洲一区综合| 久久久精品性| 欧美午夜性色大片在线观看| 国产精品区一区| 久久电影一区| 欧美亚洲综合另类| 欧美日韩国产系列| 99视频一区二区| 欧美国产综合| 欧美日韩一区三区| 一本高清dvd不卡在线观看| 欧美激情国产精品| 亚洲美女视频网| 欧美精品一区二区三区蜜臀| 亚洲国产精品电影| 欧美激情综合色| 亚洲香蕉网站| 国产综合色一区二区三区| 性做久久久久久久久| 黄色成人在线网址| 久久一区二区三区av| 亚洲风情亚aⅴ在线发布| 久久亚洲高清| 欧美视频日韩视频| aa级大片欧美三级| 国产精品一区二区三区四区五区| 日韩午夜在线播放| 欧美激情一二三区| 亚洲激情国产精品| 久久精品一级爱片| 亚洲第一级黄色片| 欧美激情国产日韩精品一区18| 在线观看国产一区二区| 看欧美日韩国产| 亚洲第一天堂无码专区| 欧美另类videos死尸| 亚洲深夜影院| 国产偷久久久精品专区| 老色鬼精品视频在线观看播放| 狠狠色综合色区| 欧美激情国产高清| 亚洲欧美日韩一区二区三区在线观看 | 久久综合网色—综合色88| 欧美天堂亚洲电影院在线播放| 欧美亚洲一区| 亚洲最新色图| 国模 一区 二区 三区| 欧美精品激情| 久久国产精品久久久久久久久久| 亚洲国产成人av| 国产精品一区久久| 欧美精品在线一区二区| 欧美一区二区三区久久精品 | 亚洲影院一区| 黄色亚洲精品| 国产欧美一区二区精品性| 欧美亚一区二区| 欧美成人一区二区在线| 久久都是精品| 午夜精品久久久久99热蜜桃导演| 亚洲国产精品第一区二区| 国产亚洲精品福利| 国产视频精品免费播放| 欧美视频一区二区在线观看| 欧美黄色aaaa| 欧美激情综合色综合啪啪| 久久综合婷婷| 欧美在线观看你懂的| 欧美一区国产一区| 激情视频一区二区| 一区精品在线| 亚洲精品日韩激情在线电影| 一区二区三区国产精品| 亚洲午夜精品| 欧美 日韩 国产 一区| 国产精品一区二区你懂的| 在线不卡亚洲| 亚洲欧美成人一区二区在线电影| 欧美高清不卡| 亚洲国产毛片完整版| 久久精品人人做人人综合 | 一区二区三区四区五区精品| 日韩香蕉视频| 亚洲欧美国产视频| 久久这里有精品视频| 欧美绝品在线观看成人午夜影视| 欧美精品激情| 亚洲激情网站| 久久一综合视频| 国产精品亚洲精品| 亚洲精品视频在线| 久久综合伊人77777蜜臀| 国产精品高清免费在线观看| 黄色日韩在线| 欧美在线播放一区| 欧美午夜免费电影| 日韩视频欧美视频| 久久久噜噜噜久久| 国产美女搞久久| 99视频在线观看一区三区| 久久全球大尺度高清视频| 欧美日韩视频免费播放| 亚洲国产精品精华液2区45| 亚洲欧美一区二区三区极速播放| 欧美三区在线视频| 黄色日韩精品| 国产麻豆精品视频| 亚洲黄色大片| 欧美日韩亚洲视频一区| 性欧美大战久久久久久久久| 在线精品视频一区二区三四| av成人手机在线| 国产噜噜噜噜噜久久久久久久久| 亚洲国产精品一区二区久| 亚洲视频一区二区在线观看| 国产精品任我爽爆在线播放| 久久蜜臀精品av| 亚洲视频狠狠| 亚洲日本激情| 激情久久一区| 欧美日韩三级电影在线|