之前參加六角學院有寫過Canvas Game所以這次範例對我來說還算輕鬆
有時候知道要做什麼,但不常寫還是容易忘記。
以前作品:CanvasGame
起手式
就是先定義畫布1
2
3const canvas = document.querySelector('#draw')
const ctx = canvas.getContext('2d')
canvas
這邊還是不得不推薦吳哲宇老師動畫互動網頁特效入門(JS/CANVAS)的課程,有興趣想深入學習的可以考慮看看。或者只使用 JavaScript 的 2D 打磚塊遊戲也可以逐步的練習Canvas
定義幾個變數
有些變數並不是一開始就可以完全想到並且定義他,越熟練會定義越快,不熟練也沒關係,邊做邊定義也可。1
2
3
4let startDrawing = false
let startPos = {x:0,y:0}
let hue = 0;//顏色
let direction = true;//判斷變粗或變細
startDrawing
:用來判斷開始或結束繪製startPos
:我們必須知道從什麼位置開始畫
事件觸發
什麼人、在什麼時候做、什麼事情:
畫布在滑鼠按下的時候並且移動才可以開始畫圖,而且離開時要停止畫圖。
所以總共有4個事件:mousedown、mousemove、mouseup、mouseleave1
2
3
4
5
6
7canvas.addEventListener('mousedown',e => {
startDrawing = true;
startPos = { x:e.offsetX , y:e.offsetY }
})
canvas.addEventListener('mousemove',draw)
canvas.addEventListener('mouseup', () => { startDrawing = false; })
canvas.addEventListener('mouseleave', () => { startDrawing = false; })
- 當滑鼠按下時,
startDrawing
變成ture
並且取得現在滑鼠位置 - 滑鼠移動時開始畫
- 滑鼠放開時,
startDrawing
變成false
(不畫了) - 滑鼠離開這畫面時,
startDrawing
變成false
(也不畫了)
mouseleave和mouseout差別
主要就是處理冒泡事件的方式不同
開始畫圖
1 | function draw(e){ |
ctx開頭的部分就是canvas繪畫的過程這邊就不贅述
幾個重點提到:
- if(startDrawing):就是我們一開始說的判斷是否可以開始畫。
- startPos:因為我們會連續觸發繪畫,每畫一次都要移動startPos,而這個startPos就是我們的滑鼠位置,每次都從
(startPos.x, startPos.y)
畫到{ x:e.offsetX , y:e.offsetY }
- hue:(自定義的名稱)顏色,值為0~360。
- direction:因範例需要變大變小的輪迴,所以再定義一個
direction
去判斷什麼時候該變大或變小。
HSL Color,Amos有詳細介紹過。
HSL(色相角度但不加單位0~360, 色彩飽和度0~100%, 色彩亮度0~100%)
HSL( 240, 100%, 50% )
補充
還有許多Canvas的屬性雖然無法全部記下來,但至少要知道
然後會查
就可以了。
不負責任聲明ಥ◡ಥ:
純屬個人筆記,每個範例都有不同的寫法,還有很多細節可以加入,有任何問題都歡迎提出一起研究哦,我會很感謝您的!- 2018.08.14