由於喜歡玩拼圖遊戲,因此本身開用canvas開發了一個拼圖遊戲,在這裏分享一下開發的過程。html
拼圖塊有直線和彎曲的兩種邊,要生成直線邊只需知道兩個點就能夠生成一條線段,而生成彎曲的邊則稍微複雜一些。這裏用四個點來生成彎曲的線。首要用隨機數決定彎曲的方向是凹仍是凸。再由是凹仍是凸計算出垂直於邊的向量,即下圖中的紫色與藍色向量。首先按比例由A和B獲得E和F兩個點的座標:A和B座標記做 和 ,比例爲 ,則E點座標 ,F點座標 。加上垂直的向量獲得C與D兩個點。git
最後只需用貝塞爾曲線就獲得了拼圖的一個邊。 (參考:stackoverflow.com/a/49371349/… )github
爲了加快拼圖塊的繪製速度,須要再建立一個隱藏的canvas用於緩存拼圖塊。以下圖所示全部拼圖塊只需繪製一次複雜的形狀,以後繪製只需從隱藏的canvas複製到用戶看到的canvas中。canvas
雖然在必定程度上緩存解決了卡頓問題,可是當拼圖塊數量達到數千張時,移動時仍是會出現卡頓。雖然每次移動的只是一小部分的拼圖塊,可是全部拼圖塊仍是須要從新繪製。更好的辦法是,每次鼠標移動時只繪製移動的拼圖塊,而不是全部拼圖塊。爲了實現這種效果,須要用兩層canvas。以下圖所示,底部灰色背景層在底部繪製靜止的部分,只須要移動開始時從新繪製。圖中紫色的另一層在最上面,繪製移動的拼圖塊,每次鼠標移動都須要繪製。緩存