淺談canvas中的拖尾效果
阿新 • • 發佈:2019-02-16
dem 畫的 基礎 而是 一起 default ans fault meteor
引言
很早就想了解以下 canvas 中的拖尾效果(如彗星,煙花等效果)是怎麽實現的,但是一直沒有深入了解,正巧在 codepen 上看到一個 demo,代碼簡單,效果炫酷,故有此文。
什麽黑科技
在我的想象中,實現這種效果是一定需要一個數組的,用來儲存彗星的尾巴的位置,透明度,生命時長等信息。然後遍歷這個數組,將這個尾巴畫在 canvas 上。然而,萬萬沒想到,真正的實現卻簡單的不像實力派,不需要 數組, 真正起作用來實現拖尾效果的關鍵是位於 clearCanvas 函數下面的三行代碼:
ctx.fillStyle="rgba(0,0,0,0.2)" ctx.rect(0,0,w,h); ctx.fill();
這裏的技巧在於,在重繪制下一幀前,不是調用clearRect清除掉上一幀的內容,而是在上一幀基礎上加上一個半透明蒙層,然後繼續畫下一幀。畫的幀數多了,也就有了拖尾效果,拖尾效果的長短,跟蒙層的透明度有關,透明度越小,拖尾越長。如果你看到這裏就明白了,那可以關掉這個頁面了,否則的話就跟我一起來實現一個流星吧。
實現一個流星
效果如下:
如上所述,這個demo也是在繪制完一幀後,繪制下一幀之前,添加一層半透明蒙層,最終形成拖尾的效果
function draw() { // 繪制流星 for(let star of stars){ star.draw() star.move() } // 這裏在不斷加半透明蒙層,使上一幀的流星變淡 ctx.fillStyle = 'rgba(0,0,0,0.1)' ctx.rect(0,0,800,600) ctx.fill() requestAnimationFrame(draw) }
全部代碼見codepen,本文完
淺談canvas中的拖尾效果