1. 程式人生 > >Canvas從入門到動態粒子效果-我用了兩小時

Canvas從入門到動態粒子效果-我用了兩小時

canvas實現動態粒子效果



前言

最近期末考試,很長時間沒有寫程式,於是想找個東西練練手。之前在寫程式的時候就使用了這種動態粒子效果,但是那時是直接拷貝的別人的程式碼,於是就動手嘗試寫出這種效果。

成品預覽圖片

引入

Canvas是一個可以使用指令碼來繪製圖形的 HTML 元素...(略過N字)。canvas就是一個畫板,可以呼叫它的一些方法讓我們"作畫"。可是我對這個一無所知,於是就百度了一下教程,瞭解到瞭如下函式:
  • strokeStyle描邊顏色
  • fillStyle填充顏色
  • fillRect填充了的矩形
  • moveTo移動畫筆
  • lineTo從當前畫筆位置畫線到指定位置


 一、初始化並畫出隨機粒子

(1)將canvas標籤加入到body並設定id屬性,在js中獲取並取得畫筆。

var ctx=document.getElementById("can").getContext("2d");
(2)迴圈畫出20個隨機點。我們使用畫筆的fillRect函式畫一個個矩形充當粒子。fillRect需要橫縱座標與矩形寬高,我們需要隨機出橫縱座標。這點通過Math.random()可以輕鬆實現。

(3)將每個點的資訊儲存起來,以便於後面點的移動,主要包括點的橫縱座標、點的顏色。

隨機點



二、讓隨機出的粒子動起來

(1)可以通過setInterval讓程式重複執行程式碼段,所以我們需要設計一段程式碼來進行粒子的位置移動。
(2)我們可以隨機出粒子的座標點,為什麼不可以隨機出一個目標點,讓粒子移動過去呢?所以我為每一個粒子隨機出了一個目標位置,讓粒子向目標移動。每次執行程式碼段時便判斷是否移動到目標位置,如果沒有就繼續移動,如果到了就新隨機出一個目標點。
(3)粒子應該怎麼想目標移動呢?這裡我使用了小學就會的一元一次線性函式,讓粒子線性的向目標移動。通過粒子的當前點與目標點,我們不難得出兩點之間的直線方程。我們每次讓x以自增1的步長,來計算y值。此時的xy便對應粒子移動到下一步的座標,這樣便實現了移動。

(4)其實可以使用非線性函式,可以採用一些緩動函式,這樣可以讓動畫變得自然一些。

粒子移動


三、連線

讓距離較近的粒子相互連線起來,實現相應效果。可以通過雙重迴圈進行連線判斷,只要兩者距離達到閥值就連線起來。

連線



四、美化

調整圖中粒子大小顏色,調整連線閥值,去除線性函式軌跡,得出結果圖。

成品預覽圖片



五、未來優化

(1)粒子移動採用非線性緩動函式。
(2)粒子移動每次步進應該由需要移動路徑的長度決定,而不只是1。

(3)加入滑鼠事件,做到與使用者互動。

專案原始碼:我的GitHub(https://github.com/printlin/dynamicPoint)