首頁 >web前端 >H5教程 >實例教學 HTML5 Canvas 超酷煙火綻放動畫實作程式碼_html5教學技巧

實例教學 HTML5 Canvas 超酷煙火綻放動畫實作程式碼_html5教學技巧

WBOY
WBOY原創
2016-05-16 15:47:163192瀏覽

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

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

  HTML程式碼:

XML/HTML Code複製內容到剪貼簿
  1. div id=”gui”div>  
  2. div id >> div id=”id=”id=”id=”
  3. id
  4. =” >>div>     div id”mountains1″id=”mountains1″id div>div id=”skyline”>
div

>

 

div
>  
  HTML的結構非常簡單,也就是建構了一個canvas容器,我們會利用JS在這個容器中產生一個Canvas物件。看最後的JS程式碼你就會知道了。   CSS代碼: CSS Code複製內容到剪貼簿
  1. #canvas-容器{ 背景#000#000url(bg.jpg); 高度400px; >左:50%; 邊距: -200px 300px位置絕對; 絕對; 寬度600px;  > } 畫布 { 遊標
  2. 十字線; >: 阻止職位相對;  z 索引:3;    } 畫布:活動 { 遊標十字線;   
  3. 十字線
  4. ;    #skyline { 
  5. 背景背景: 重複-x 50% 0; 底部底部底部底部底部底部底部底部底部底部底部高度135px; :0; :0; 。 >絕對; 
  6. 寬度:100%; :100%; :100%; >指數 #mountains1 { 背景 (mountains1.png) 重複-x 40% 0; 底部底部底部底部底部底部:0;>高度200px; :0; 
  7. :0; 。 >絕對; 寬度:100%; :100%; :100%; >指數 #mountains2 { 背景: 重複-x 30% 0; 底部底部底部底部底部底部:0;>高度
  8. 250px; :0; :0; 。 >絕對; 寬度:100%; :100%; :100%; >
  9. 指數
#gui
 { 右右: 0; 位置:固定; 上方:0;  索引🎜> :3;    }  

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

  接下來是最重要的Javascript程式碼。

  Javascript程式碼:

JavaScript Code複製內容到剪貼簿
  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''canvas-container'
  6. );            self.canvas.onselectstart = 函數() { 函數() { > >;   
  7.         };   
  8.   
  9.         self.canvas.width = self.cw = 600;   
  10.         self.canvas.height = self.ch = 400;       
  11.   
  12.         self.articles = [];       
  13.         self.partCount = 30;   
  14.         self.fireworks = [];       
  15.         self.mx = self.cw/2;   
  16.         self.my = self.ch/2;   
  17.         self.currentHue = 170;   
  18.         self.partSpeed = 5;   
  19.         self.partSpeedVariance = 10;   
  20.         self.partWind = 50;   
  21.         self.partFriction = 5;   
  22.         self.partGravity = 1;   
  23.         self.hueMin = 150;   
  24.         self.hueMax = 200;   
  25.         self.fworkSpeed = 2;   
  26.         self.fworkAccel = 4;   
  27.         self.hueVariance = 30;   
  28.         self.flickerDensity = 20;   
  29.         self.showShockwave = false;   
  30.         self.showTarget = true;   
  31.         self.clearAlpha = 25;   
  32.   
  33.         self.canvasContainer.append(self.canvas);   
  34.         self.ctx = self.canvas.getContext('2d');   
  35.         self.ctx.lineCap = '圓形';   
  36.         self.ctx.lineJoin = '圓形';   
  37.         self.lineWidth = 1;   
  38.         self.bindEvents();               
  39.         self.canvasLoop();   
  40.   
  41.         self.canvas.onselectstart = 函數() { 函數() { > >;            };  
  42.   
  43.     };  
  44.   這段JS程式碼主要是往canvas容器中建構一個Canvas對象,並且對這個canvas對象的外觀以及動畫屬性作了初始化。

    JavaScript Code複製內容到剪貼簿
    1. var 粒子 = 函數(x, y, 色調){ (x, y, 色調){ (x, y, 🎜>.x = x; 這個.y = y; 這個.coordLast = >             {x: x, y: y},   
    2.             {x: x, y: y},   
    3.             {x: x, y: y}   
    4.         ]; 
    5. .angle = rand(0, 360); .angle = rand(0, 360); 這個這個<. friction=" 1 - self.partFriction/100; 這個.gravity = self.partGravity/2; 這個這個這個.brightness = rand(50, 80); 這個這個.decay = rand(10, 50)/1000; 這個.lineWidth = self.lineWidth;      };   
    6.   
    7.     Particle.prototype.update = 函數(索引){ var(索引){ var.angle * Math.PI / 180; var vx = Math.cos(弧度) * 這個這個.speed; var vy = Math.sin(弧度) * 這個.speed > 。重力; 這個.速度*= 這個.摩擦力; 這個. coordLast[2].x = .coordLast[1].x; .coordLast[2].y = 這個.coordLast[1].y; 這個.coordLast[1].x = 這個.coordLast[0].x; 這個.coordLast[1].y = .coordLast[0 ].y; 這個.coordLast[0].x = .x; 這個.x; >.coordLast[0].y = 這個.y; 這個.x = vx 這個.y = vy * self.dt; 這個.angle  = 這個.wind; 這個.alpha -= .decay; .decay; .decay; if.decay; if.decay; if.decay; if.decay; if.decay; if.decay; if. (!hitTest(0,0,self.cw,self.ch,這個.x-這個.radius,
    8. 這個
    9. .y-
    10. 這個
    11. .radius,
    12. 這個
    13. .radius*2, 這個.radius*2, 這個.radius*2, 這個.radius*2, 這個.radius*2, 這個.radius*2) ||  這個.alpha              self.articles.splice(index, 1);                }                    };   
    14.   
    15.     Particle.prototype.draw = 函數(){ var -1);   
    16.         self.ctx.beginPath();                 
    17.         self.ctx.moveTo(Math.round(
    18. .coordLast[coordRand].x),這個.coordLast[coordRand].x),o.coordLast[coordRand].y));            self.ctx.lineTo(Math.round(
    19. 。 .y));            self.ctx.closePath();                         self.ctx.tripStyle = 'hsla('
    20. 這樣, 100%, '
    21. 這個.亮度'%, '.alpha ')';            self.ctx.中風(); if(self.flicker) 50 - self.flickerDensity; if(rand(0, inverseDensity) === inverseDensity){   
    22.                 self.ctx.beginPath();                    self.ctx.arc(Math.round(這; .y), rand(這個.lineWidth,
    23. 這個
    24. .lineWidth 3)/2, 0, Math.PI*2,
    25. false
    26. )  self.ctx.closePath(); var                  self.ctx.fillStyle = 'hsla('' , 100%, '這個.亮度'%, ' randpha🎜>'%, ' randpha; )';   
    27.                 self.ctx.fill();                }                }        };   某個JS程式碼的功能是實現煙火爆炸後的小顆粒的均勻性,從draw方法中可以看出,創建幾個隨機點,煙火顆粒就可以在這個範圍的隨機點中散落。 JavaScript 程式碼 將內容複製到剪切板
      1. var Firework = 函數(startX, startY, targetX, getget >.x = startX; 這個.y = startY; 這個. >這個.startY = startY; 這個.hitX = false .hitY = 這個.coordLast =              {x: startX, y: startY},                {x: startX, y: startY},   
      2.             {x: startX, y: startY}   
      3.         ]; 
      4. .targetX = targetX; 
      5. .targetX = targetX; 
      6. .targetX = targetX; 
      7. .targetX = targetX; .targetX = targetX; 這個.speed = self.fworkSpeed; 這個.angle = Math.atan2(targetY - startY, targetX - startX); .shockwaveAngle = Math.atan2(targetY - startY, targetX - startX) (90*(Math.PI/180));  .fworkAccel/100; 這個.hue = self.currentHue; 這個.alpha = rand(50,100)/100; .lineWidth =.targetRadius = 1;        };           Firework.prototype.update = 函數
      8. (索引){   
      9.         self.ctx.lineWidth = 
      10. .lineWidth;   
      11. .lineWidth;   
      12.   
      13.         vx = Math.cos(
      14. .angle) * 
      15. .angle) * 
      16. .angle) *          vy = Math.sin(這個.angle) * 
      17. .angle) * 
      18. 這個.angle) * 這個🎜>這個🎜>這個.速度*= 1   這個.加速; 這個.coordLast[2].coordLast 這個.coordLast[1].x; 這個.coordLast[2].y = .coordLast[2].y = 這個.coordLast[1].y; .coordLast[1].x = 這個.coordLast[1].y = .coordLast[0].y; 這個.coordLast[0].x = .x; 這個 0].y = 這個.y; if(self.showTarget){ (self.showTarget){ ifif (這個.targetRadius (這個.targetRadius 這個
      19. .targetRadius { 這.targetRadius = .25 * self.dt;                } 其他 { 這個.targetRadius = 1 *  
      20.             }   
      21.         } 
      22. 如果(((這個(這個.這個.. >.targetX){ if(.x   vx .x   vx 這個.x = 
      23. .targetX; 
      24. 這個.targetX; 這個。 hitX = true;   
      25.             } 
      26. 其他
      27.  {              }            } 否則 { 如果這個> vx >= 這個.targetX){ 這個.x = 這個.x = 這個.x = 這個。 targetX; 
      28. .hitX = ;   ;   
      29. ;   
      30.             } 
      31. 其他 {              }            } if(((這個(這個.. >.targetY){ if(.y   vy 
      32. 。 .targetY){ 這個
      33. .y = .targetY; 這個.targetY; 這個.targetY; 
      34. 這個
      35. 這個.targetY; 
      36. 這個
      37. 。 hitY = true;                } 其他 {              }            } 否則 { 如果這個🎜>這個🎜> vy >= 這個.targetY){ 這個
      38. .y = 
      39. 這個.y = 這個.y = 這個. targetY; 這個
      40. .hitY = 這個
      41. ;   ;   ;   ;               } 其他 {              }            }如果(.hitX && 這個這個var
      42. randExplosion = rand(0, 9);                self.createParticles(a.色調);                self.fireworks.splice(index, 1);            
      43.         }   
      44.     };   
      45.   
      46.     Firework.prototype.draw = 
      47. 函數
      48. (){   
      49.         self.ctx.lineWidth = 
      50. .lineWidth; 
      51. 這個.lineWidth; 這個.lineWidth; .lineWidth; > -1);                       
      52.         self.ctx.beginPath();                 
      53.         self.ctx.moveTo(Math.round(.coordLast[coordRand].x),這個.coordLast[coordRand].x),o.coordLast[coordRand].y));   
      54.         self.ctx.lineTo(Math.round(
      55. 。 .y));            self.ctx.closePath();   
      56.         self.ctx.tripStyle = 
      57. 'hsla('
      58. 這樣, 100%, '這個.亮度'%, '.alpha ')';            self.ctx.中風(); if(self.showTarget){ o>Target             self.ctx.save();   
      59.             self.ctx.beginPath();                self.ctx.arc(Math.round(
      60. .targetX), Math🎜>這個
      61. .targetX), Math. .targetY), 
      62. 這個
      63. .targetRadius, 0, Math.PI*2, 
      64. false 🎜>false)               self.ctx.closePath();                self.ctx.lineWidth = 1;                self.ctx.中風();   
      65.             self.ctx.restore();   
      66.         } if(self.showShockwave){   
      67.             self.ctx.save();   
      68.             self.ctx.translate(Math.round(這個.             self.ctx.rotate(
      69. .shockwaveAngle);   >這.shockwaveAngle);   
      70.             self.ctx.beginPath();   
      71.             self.ctx.arc(0, 0, 1*(
      72. .speed/5),50正確);                self.ctx.strokeStyle = 'hsla('
      73. 'hsla(' 這個.亮度'%, ' 蘭特(25, 60) 100 ')';                self.ctx.lineWidth = 這個.lineWidth  
      74.             self.ctx.中風();   
      75.             self.ctx.restore();   
      76.         }                       
      77.     };  
      78. 某個JS程式碼是建立煙火實例的,我們也可以從draw方法中看出,當我們滑鼠點擊中部的某個點時,煙火發射的目的地就在那個點上。
      79. 這個HTML5 Canvas煙火效果的核心程式碼就是這樣,謝謝閱讀,希望能幫助大家,請繼續關注腳本之家,我們會努力分享更多優秀的文章。
陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn