首頁 > web前端 > H5教程 > 主體

用HTML5製作煙火效果的教學_html5教學技巧

WBOY
發布: 2016-05-16 15:46:46
原創
1958 人瀏覽過

要過年了,過年想到的就是放煙火啦。 。 。 。於是就用canvas寫了個放煙火的效果,滑鼠點擊也會產生煙火,不過不要產生太多煙火哦,一個煙火散出的粒子是30到200個之間,當頁面上的粒子數量達到一定的時候,頁面就會很卡咯,我也沒特意去優化神馬的。以後有空再說吧。

  直接上DEMO吧:放煙火 

  原理很簡單。 。 。就寫一個煙火類以及碎屑類,實例化後讓它飛起來,然後到達某個點後,把這個煙火對象的dead屬性置為true,然後再實例化出一定數量的碎屑對象,並且給與碎屑物件隨機一個要到達的目標點,然後讓所有碎屑物件飛過去就行了。

  【煙火】

XML/HTML Code複製內容到剪貼簿
  1. var Boom = 函數(x,r,c,boomA. /煙火對象  
  2.             this.booms = [];   
  3.             this.x = x;   
  4.  = x;                
  5. this.y = (canvas.height r);    = (canvas.height r);               
  6. this.r
  7.  = r;    = r;   
  8.             this.c = c;   
  9.  = c;                
  10. this.shape = 形狀               this.boomArea = boomArea;            
  11. this.theta = 0 =             this.dead = 
  12.             this.ba = parse = parse = 
  13. 5se
  14.         }   
  15.         Boom.prototype
  16.  = {   
  17.             _paint:function(){     
  18.                 ctx.save();   
  19.                 ctx.beginPath();   
  20.                 ctx.arc(this.x,this.y,this.r,0,2*Math.PI);   
  21.                 ctx.fillStyle 🎜>                 ctx.fill();   
  22.                 ctx.restore();   
  23.             },   
  24.             _move:function(){   
  25.                 var dx  🎜>dy  = .boomArea.y - this.y;               會                 
  26. 這個.y  
  27.                 if(Math.abs(dx)
  28. >=this.ba){   
  29.                     if(this.shape){   
  30.                         this._shapBoom();                        }                        其他 this._boom();   
  31.                     
  32. this.dead 🎜>
  33.                 }   
  34.                 其他 {   
  35.                     this._paint();                    }                },   
  36.             _drawLight:function(){   
  37.                 ctx.save();   
  38.                ctx.fillStyle
  39.  = 🎜>;   
  40.                 ctx.beginPath();   
  41.                 ctx.arc(this.x , this.y , this.r 3*Math.random() 1 this.y , this.r 3*Math.random() 1 this.y , this.r 3*Math.random() 1 ,                 ctx.fill();   
  42.                 ctx.restore();   
  43.             },   
  44.             _boom:function(){    //普通爆炸物   
  45.                 var fragNum                 var 樣式
  46.   >> =5? 1:2;                    以各種顏色中;                   if(樣式===1){
  47. ===1){
  48.                     
  49. 顏色顏色
  50. 顏色
  51. 顏色                        a:parseInt(getRandom(128,255)),   a:parseInt(getRandom(128,255)),   a:parseInt(getRandom(128,255)),  
  52.                         b:parseInt(getRandom(128,255)),   b:parseInt(getRandom(128,255)),   b:parseInt(getRandom(128,255)),   >
  53.                         c:parseInt(getRandom(128,255))   
  54.                     }   
  55.                 }   
  56.   
  57.                 var 
  58. fanwei
  59.   = );   
  60.                  for(var i=i=
  61. 🎜 >fragNum
  62. ;i ){                        if( >                          顏色                          會                              b:parse5(getRandom(128,0     b:parseInt(getRandom(128,,555) ),
  63.                             c:parseInt(getRandom(128,155)    c:parseInt(getRandom(128,255)
  64.                         }                        }  
  65.              var a = getRandom =
  66. getRandom
  67. = getRandom;                 var x
  68. =
  69. getRandom = getRandom;                 var 
  70. y = getRandom  var 半徑
  71. =
  72. getRandom(0   var frag =
  73. , Frag(this.y.x,.0. 🎜>
  74.                 this.booms.push(frag);   
  75.                             
  76.           },  
  77.                                                              
  78.              var 石頭 = 石頭
  79. ;   
  80.           putValue(ocas, octx, this.shape, 5, 函數(點){  
  81.              var dx = 畫布
  82. .width/2-that.x;   
  83.              var dy = 畫布
  84. =
  85. 畫布 = 畫布 = 畫布                               🎜>=0
  86. ;i點。長度;i ){    蘑菇 = {a:點[i].a,b:點[i].b,c:點[i].c}  
  87.                         var x                         var  ;   
  88.                         var 
  89. 半徑                         var frag                         that.booms.push(frag);   
  90.                     }                    })                }   
  91.         }    【碎片】
  92. XML/HTML 程式碼將內容複製到剪貼簿
    1. var 片段 = 函數
    2.             this.tx = tx;    = tx;   
    3.  = tx;    = tx;    我>
    4.             
    5. this.ty = ty;    = ty;   
    6.             
    7. this.x =             this.y = 
    8.             this.dead =             this.centerX
    9.  = centerX; 
    10.             this.centerY = centerY;
    11.             
    12. this.radius = 半徑;    = 半徑;   
    13.             this.color = 顏色;    = 顏色;   
    14.         }   
    15.   
    16.         Frag.prototype
    17.  = {                paint:function(){   
    18.                 ctx.save();   
    19.                 ctx.beginPath();   
    20.                 ctx.arc(this.x , this.y , this.radius , 0 , , this.y , this.radius , 0 , , this.y , this.radius , 0 , 2*M.PI>2*M.                 
    21. ctx.fillStylethis
    22.                 ctx.fill()                    ctx.restore();                },   
    23.             moveTo:函數(索引){   
    24.                 this.ty
    25. this.ty
    26.                 var dx  🎜>dy = 這個.ty - 這個.y;                    
    27. this.x
    28.  => 0.1 ? this.tx:(this.x dx*0.1);                    this.y = 🎜 > 0.1 ? this.ty : (this.y dy*0.1);   
    29.                 if(dx===0 & Math. 🎜>                     this.dead 🎜>                 }   
    30.                 this.paint();                }            }  
    31. 要讓碎片碎片產生虛影也很簡單,就是每次刷新時,不是擦掉重繪,而是異構為0.1(如果想虛影更長,可以把這個值弄的更嚴重)小)的背景顏色。然後虛影就可以做出來了。 玄:             XML/HTML 程式碼
    32. 將內容複製到剪貼簿
    33. ctx.save();   
    34.             ctx.fillStyle
     = 
🎜>


            ctx.fillRect(0,0,canvas.width,canvas.height);   

            ctx.restore();  

  讓煙火形成自己想要的形狀,例如字體,圖片之類的,也很簡單,就是可以透過離屏canvas以及canvas的getImageData這個方法就可以做出來。離屏canvas,顧名思義就是離開螢幕的,也就是不可見的canvas,直接在js裡面用document.createElement("canvas")就可以生成一個canvas dom物件了,只要不把這個dom物件賦給body,這個canvas物件就相當於一個離屏對象了,我們就可以取得到這個離屏canvas的context對象,然後再用戶看不到的地方做任何我們想做的事情了。

  讓煙火形成自己想要的形狀就是先把文字或圖片畫在離屏canvas上,然後用getImageData獲取畫布上的像素數組,然後遍歷數組,獲取有顏色的像素,也就是我們想要的內容,儲存起來後,再放到主canvas物件中顯示出來。

  getImageData的像素處理我之前的部落格上有講過,如果不會用的,請戳:隨便談談用canvas來實現文字圖片粒子化

  原始碼位址:https://github.com/whxaxes/canvas-test/tree/gh-pages/src/Funny-demo/shotFire

相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板