自己实现一个刮刮乐

  今天有看到一个园友发了一篇自己实现的刮刮了,感觉挺好玩的就下下来看看,结果运行不了,想想也不是太难就决定自己实现一个,还是花了点时间的,源码下载链接在最下面(这个绝对有用,除非你的浏览器不支持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                 }

   虽然说这个实现起来很简单,但是效果还过得去。不过我想进一步实现一点东西就遇到了点问题,首先是这个东西怎么调还是会看到一点锯齿的,再一个是怎样识别你已经刮完了(考虑过识别已经划过的点,但是感觉这个不太好),所以希望有解决方法的园友赐教。

源码下载  

在线演示

posted @ 2013-12-07 22:26  mrbean  阅读(3497)  评论(7编辑  收藏  举报