ホームページ  >  記事  >  ウェブフロントエンド  >  サンプルチュートリアル HTML5 Canvas 超クールな花火が咲くアニメーション実装 code_html5 チュートリアル スキル

サンプルチュートリアル HTML5 Canvas 超クールな花火が咲くアニメーション実装 code_html5 チュートリアル スキル

WBOY
WBOYオリジナル
2016-05-16 15:47:163116ブラウズ

これはクールな HTML5 キャンバス アニメーションです。実際の生活に咲いている花火の特殊効果をシミュレートします。その効果は非常にリアルですが、結局のところ、ガール フレンドを連れて行っても、それはコンピューターのシミュレーションです。それは、まだ効果が少し悪いです。この HTML5 Canvas アニメーションの優れた点の 1 つは、花火をたくさん打ち上げても、Chrome 上では基本的に遅延が発生しないことです。

この HTML5 花火特殊効果を実装するプロセスとコードを簡単に分析してみましょう。これは主に HTML コード、CSS コード、JavaScript コードで構成されています。もちろん、最も重要なのは JavaScript コードです。

HTML コード:

XML/HTML コードコンテンツをクリップボードにコピー
  1. <div id=”gui”>div>
  2. <div id=”canvas-container”> <div id=”mountains2″>div>
  3. <div id=”mountains1″ >div><div id=”スカイライン”>div> div>

HTML の構造は非常に単純です。つまり、Canvas コンテナーが構築され、JS を使用してこのコンテナー内に Canvas オブジェクトを生成します。最終的な JS コードを見ればわかります。

CSSコード:

CSS コードコンテンツをクリップボードにコピーします
  1. #canvas-container { background: #000 url(bg.jpg); 高さ: 400px: 50%; マージン: -200px 0 0 -300px位置: 絶対トップ: 50%; : 600pxz-index: 2;   
  2. } キャンバス { カーソル: クロスヘア表示: ブロック位置: 相対z-index: 3;   
  3. } canvas:active { カーソル: クロスヘア;   
  4. } #skyline { 背景: url (skyline.png) 繰り返し-x 50% 0; : 0; 高さ: 135px: 0; 位置: 絶対: 100%; z-index: 1;       
  5. } #mountains1 { 背景: url (mountains1.png) 繰り返し-x 40% 0; : 0; 高さ: 200px: 0; 位置: 絶対: 100%; z-index: 1;       
  6. } #mountains2 { 背景: url (mountains2.png) 繰り返し-x 30% 0; : 0; 高さ: 250px: 0; 位置: 絶対: 100%; z-index: 1;       
  7. } #gui { : 0; 位置: 固定トップ: 0; z-index: 3;   
  8. }

CSS コードは特別なものではなく、主に背景色と境界線を定義します。

次は最も重要な Javascript コードです。

JavaScript コード:

JavaScript コードコンテンツをクリップボードにコピーします
  1. self.init = 関数(){
  2. self.dt = 0;   
  3. self.oldTime = Date.now();   
  4. self.canvas = document.createElement('canvas');                   
  5. self.canvasContainer = $('#canvas-container'); var canvasContainerDisabled = document.getElementById('canvas-container');   
  6. self.canvas.onselectstart = function() { return false;   
  7. };   
  8. self.canvas.width = self.cw = 600;   
  9. self.canvas.height = self.ch = 400;       
  10. self.particles = [];       
  11. self.partCount = 30;   
  12. self.fireworks = [];       
  13. self.mx = self.cw/2;   
  14. self.my = self.ch/2;   
  15. self.currentHue = 170;   
  16. self.partSpeed = 5;   
  17. self.partSpeedVariance = 10;   
  18. self.partWind = 50;   
  19. self.partFriction = 5;   
  20. self.partGravity = 1;   
  21. self.hueMin = 150;   
  22. self.hueMax = 200;   
  23. self.fworkSpeed = 2;   
  24. self.fworkAccel = 4;   
  25. self.hueVariance = 30;   
  26. self.flickerDensity = 20;   
  27. self.showShockwave = false;   
  28. self.showTarget = true;   
  29. self.clearAlpha = 25;   
  30. self.canvasContainer.append(self.canvas);   
  31. self.ctx = self.canvas.getContext('2d');   
  32. self.ctx.lineCap = 'round';   
  33. self.ctx.lineJoin = 'round';   
  34. self.lineWidth = 1;   
  35. self.bindEvents();               
  36. self.canvasLoop();   
  37. self.canvas.onselectstart = function() { return false;   
  38. };   
  39. };  

この JS コードは、主に Canvas コンテナー内に Canvas オブジェクトを構築し、Canvas オブジェクトの外観とアニメーションのプロパティを初期化します。

JavaScript コードコンテンツをクリップボードにコピーします
  1. var Particle = function(x, y, hue){ this.x = x; これ.y = y; this.coordLast = [
  2. {x: x, y: y}、
  3. {x: x, y: y}、
  4. {x: x, y: y}
  5. ]; this.angle = rand(0, 360); this.speed = rand(((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); この.alpha = rand(40,100)/100; this.decay = rand(10, 50)/1000; this.wind = (rand(0, self.partWind) - (self.partWind/2))/25; この.lineWidth = self.lineWidth;   
  6. };   
  7. Particle.prototype.update = 関数(インデックス){ var ラジアン = this.angle * Math.PI / 180; var vx = Math.cos(ラジアン) * this.speed; var vy = Math.sin(ラジアン) * this.speed this 。重力; 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 < ){
  8. self.particles.splice(index, 1);       
  9. }
  10. };   
  11. Particle.prototype.draw = function(){ var coordRand = (rand(1,3) -1);   
  12. self.ctx.beginPath();                                   
  13. self.ctx.moveTo(Math.round(this.coordLast[coordRand].x), Math.round(this.coordLast[coordRand].y));   
  14. self.ctx.lineTo(Math.round(this.x), Math.round(this .y));   
  15. self.ctx.closePath();                   
  16. self.ctx.ストロークスタイル = 'hsla(' this.hue ' , 100%, ' これ.明るさ '%, ' これ.alpha ')';   
  17. self.ctx.ストローク(); if(self.flickerDensity > 0){ var inverseDensity = 50 - self.flickerDensity; if(rand(0, inverseDensity) === inverseDensity){
  18. self.ctx.beginPath();   
  19. 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;   
  20. self.ctx.fillStyle = 'hsla(' this.hue ' , 100%, ' この.明るさ '%, ' randAlpha ' )';   
  21. self.ctx.fill();   
  22. }
  23. }
  24. };  

このセクションの JS コードの機能は、フラワー爆発後の小さな粒子の作成を実行することであり、描画方法からわかるように、任意の随伴点が構築され、この範囲の随伴点にカーボン粒子が散在する可能性があります。

JavaScript コード复制コンテンツ到剪贴板
  1. var Firework = function(startX, startY, targetX, targetY){ this.x = startX; これ.y = startY; これ.startX = startX; これ.startY = startY; this.hitX = falsethis.hitY = falsethis.coordLast = [
  2. {x: startX, y: startY},
  3. {x: startX, y: startY},
  4. {x: startX, y: startY}
  5. ]; この.targetX = targetX; この.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); この.alpha = rand(50,100)/100; この.lineWidth = self.lineWidth; この.targetRadius = 1;   
  6. };   
  7. Firework.prototype.update = 関数(インデックス){
  8. self.ctx.lineWidth = this.lineWidth;   
  9. vx = Math.cos(this.angle) * this.speed,
  10. 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;   
  11. else { this.targetRadius = 1 * self.dt;       
  12. }
  13. } if(this.startX >= this.targetX){ if(this.x vx <= this.targetX){ this.x = this.targetX; this.hitX = true;   
  14. } else { this.x = vx * self.dt;   
  15. }
  16. } else { if(this.x vx >= これ.targetX){ これ.x = これ .targetX; this.hitX = true;   
  17. } else { this.x = vx * self.dt;   
  18. }
  19. } if(this.startY >= this.targetY){ if(this.y vy <= this.targetY){ this.y = this.targetY; this.hitY = true;   
  20. } else { this.y = vy * self.dt;   
  21. }
  22. } else { if(this.y vy >= これ.targetY){ これ.y = これ .targetY; this.hitY = true;   
  23. } else { this.y = vy * self.dt;   
  24. }
  25. if(this.hitX && this.hitY){ var randExplosion = rand(0, 9);   
  26. self.createParticles(this.targetX, this.targetY, this.hue);   
  27. self.fireworks.splice(index, 1);                       
  28. }
  29. };   
  30. Firework.prototype.draw = 関数(){
  31. self.ctx.lineWidth = this.lineWidth; var coordRand = (rand(1,3)-1);                       
  32. self.ctx.beginPath();                               
  33. self.ctx.moveTo(Math.round(this.coordLast[coordRand].x), Math.round(this.coordLast[coordRand].y));   
  34. self.ctx.lineTo(Math.round(this.x), Math.round(this .y));   
  35. self.ctx.closePath();   
  36. self.ctx.ストロークスタイル = 'hsla(' this.hue ' , 100%, ' これ.明るさ '%, ' これ.alpha ')';   
  37. self.ctx.ストローク(); if(self.showTarget){
  38. self.ctx.save();   
  39. self.ctx.beginPath();   
  40. self.ctx.arc(Math.round(this.targetX), Math.round(this .targetY),this.targetRadius, 0, Math.PI*2, false)
  41. self.ctx.closePath();   
  42. self.ctx.lineWidth = 1;   
  43. self.ctx.ストローク();   
  44. self.ctx.restore();   
  45. if(self.showShockwave){
  46. self.ctx.save();   
  47. self.ctx.translate(Math.round(this.x), Math.round(this .y));   
  48. self.ctx.rotate(this.shockwaveAngle);   
  49. self.ctx.beginPath();   
  50. self.ctx.arc(0, 0, 1*(this.speed/5), 0, Math.PI, true);   
  51. self.ctx.drawingStyle = 'hsla(' this.hue ' , 100%, ' この.明るさ '%,' rand(25, 60)/100 ')';   
  52. self.ctx.lineWidth = this.lineWidth;   
  53. self.ctx.ストローク();   
  54. self.ctx.restore();   
  55. }
  56. };  

このセグメントの JS コードは、フラワー サンプルを作成するものであり、マウス ポイントが画布内のある時点で、フラワー送信の目的がそのポイントにあることが、draw メソッドからもわかります。

この規約 HTML5 Canvas の効果の核心コードはこのようなものであり、大家に届くことを望んでおり、継続的に注目している脚本家、私たちはより多くの優れた文章を共有するよう努めています。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。