今天有看到一個園友發了一篇自己實現的刮刮了,感覺挺好玩的就下下來看看,結果運行不了,想想也不是太難就決定自己實現一個,還是花了點時間的,源碼下載鏈接在最下面(這個絕對有用,除非你的瀏覽器不支持canvas)。廢話不多說,講解一下幾個重要的點吧:
一、首先是刮刮卡的效果,很自然想到兩層,於是我采用了兩層重疊的canvas
<canvas id="back" width="400px" height="200px" border="2px"></canvas> <canvas id="front" width="400px" height="200px" border="2px"></canvas>
back這個用來顯示底下的文字信息,上面的顯示塗層。這樣我們的處理就只與front有關了。我們就只要在back上畫字, front上面華一層銀色的塗層:
1 Canvas.fillRect(back,0,0,400,200,"gold") 2 Canvas.drawText(back,"謝謝惠顧",60,120,"black"); 3 Canvas.fillRect(front,0,0,400,200,"silver");
二、事件的監聽處理,為了方便我就沒有采用手機端,所以用的都是mouse事件,刮刮樂就是要將上面的一層去掉,這個我們很 自然的就會想到clearRect,所以事件處理的思路也很簡單就是處理出表要刮掉的那些地方,最簡單就是捕捉每個鼠標到的 點然后clear一塊,但是這樣如果塊太大的話會導致效果很難看,快太小中間會有斷點,這是處理斷點就成了一個問題,我 采用的方法就是記錄上次的點連着都清一次,這樣的效果還是挺好的。代碼如下:
1 function mouseDown(e){ 2 e.preventDefault(); 3 isDown=true; 4 } 5 function mouseUp(e){ 6 e.preventDefault(); 7 isDown=false; 8 isFirst=true; 9 } 10 function mouseMove(e) { 11 e.preventDefault(); 12 if(e.clientX>480+400||e.clientX<480+0||e.clientY<0+260||e.clientY>200+260){ 13 isDown=false; 14 } 15 if(isDown){ 16 if(isFirst){ 17 front.clearRect(e.clientX-480,e.clientY-260,10,10); 18 prex=e.clientX-480; 19 prey=e.clientY-260; 20 isFirst=false; 21 } 22 else{ 23 if(e.clientX-480>prex){ 24 var k=(e.clientY-260-prey)/(e.clientX-480-prex); 25 var i=0; 26 for(i=prex;i<e.clientX-480;i+=5){ 27 front.clearRect(i,i*k+prey-k*prex,10,10); 28 } 29 } 30 else{ 31 var k=(e.clientY-260-prey)/(e.clientX-480-prex); 32 var i=0; 33 for(i=prex;i>e.clientX-480;i-=5){ 34 front.clearRect(i,i*k+prey-k*prex,10,10); 35 } 36 } 37 prex=e.clientX-480; 38 prey=e.clientY-260; 39 } 40 }
雖然說這個實現起來很簡單,但是效果還過得去。不過我想進一步實現一點東西就遇到了點問題,首先是這個東西怎么調還是會看到一點鋸齒的,再一個是怎樣識別你已經刮完了(考慮過識別已經划過的點,但是感覺這個不太好),所以希望有解決方法的園友賜教。
