飞道的博客

基于Canvas的九宫格抽奖,就是仿csdn的APP做的,能过审不?

226人阅读  评论(0)

引言:

九宫格抽奖一直就挺火爆,手机端也经常用,这不来了兴趣写了一波,看着效果还不错,拿出来大家唠唠!

效果:

实现思路

  1. 绘制出背景大图,两张图片,一张稍微小,并且稍小的图片颜色更深一些;

  2. 绘制8张白色背景的小图片(绘制的顺序?待会说明),作为奖项卡的背景,一张立即抽奖的黄色背景图片放在中间;

  3. 在对应的背景图片上,绘制出奖项图片和文字,完成整个抽奖页面的布局;

  4. 给立即抽奖的背景图片添加点击事件,点击后旋转【开启定时任务】(旋转方式有3种,目前写了顺时针一种,另外两种,只需在第2步设置好顺序即可,待会详细说明);

  5. 旋转的步数,目前设置的规则是2圈 + (0-8)随机一位,因1圈是8步,2圈就是16步,加上随机0到8,可以得到的步数有8种:16 17 18 19 20 21 22 23;

  6. 达到最终步数以后,清除定时器,重置相关参数,根据旋转方形指示所在的下标确定中奖情况;

实现

绘制背景

大背景从坐标(0,0)开始,宽高是340;次背景图x,y分别加10,从(10,10)开始,宽高为320,颜色稍深。


  
  1. //绘制选项卡背景
  2. ChouJiang.prototype.drawBG=function(){
  3. var image,img,sx= 0,sy= 0,sWidth= 340,sHeight= 340,dx= 0,dy= 0,dWidth= 340,dHeight= 340;
  4. //背景
  5. image = this.imgObj[ 14];
  6. img = new _.ImageDraw({ image:image, sx:sx, sy:sy, sWidth:sWidth, sHeight:sHeight, dx:dx, dy:dy , dWidth:dWidth, dHeight:dHeight});
  7. this.renderArr.push(img);
  8. sx= 0,sy= 0,sWidth= 320,sHeight= 320,dx= 10,dy= 10,dWidth= 320,dHeight= 320;
  9. //背景小
  10. image = this.imgObj[ 15];
  11. img = new _.ImageDraw({ image:image, sx:sx, sy:sy, sWidth:sWidth, sHeight:sHeight, dx:dx, dy:dy , dWidth:dWidth, dHeight:dHeight});
  12. this.renderArr.push(img);
  13. }

 

绘制奖项卡背景图


  
  1. //绘制选项卡背景
  2. ChouJiang.prototype.drawImage=function(){
  3. var image,img,rect,x= 0,sx= 0,sy= 0,sWidth= 100,sHeight= 100,dx= 0,dy= 0,dWidth= 100,dHeight= 100,dx_dis= 18,dy_dis= 18;
  4. //绘制9张小背景
  5. var imgKey = 0;
  6. for( var i= 0;i< 3;i++){
  7. dy = dy_dis+i* 102;
  8. for( var j= 0;j< 3;j++){
  9. dx = dx_dis+j* 102;
  10. if(i== 1&&j== 1){
  11. imgKey= 4;
  12. } else{
  13. imgKey= 3;
  14. }
  15. //背景
  16. image = this.imgObj[imgKey];
  17. img = new _.ImageDraw({image:image,sx:sx,sy:sy,sWidth:sWidth,sHeight:sHeight, dx:dx, dy:dy ,dWidth:dWidth,dHeight:dHeight});
  18. this.renderArr.push(img);
  19. if(imgKey== 4){ //中间的抽奖卡片
  20. this.choujiangImage=img;
  21. } else{
  22. //注意添加的顺序 ,因为转动的时候是根据这个数组来的
  23. if(i== 0){
  24. img.id=j;
  25. this.imgArr.push(img);
  26. } else if(i== 1){
  27. if(j== 0){
  28. img.id= 7;
  29. this.imgArr[ 7]=img;
  30. } else if(j== 2){
  31. img.id= 3;
  32. this.imgArr[ 3]=img;
  33. }
  34. } else if(i== 2){
  35. if(j== 0){
  36. img.id= 6;
  37. this.imgArr[ 6]=img;
  38. } else if(j== 1){
  39. img.id= 5;
  40. this.imgArr[ 5]=img;
  41. } else if(j== 2){
  42. img.id= 4;
  43. this.imgArr[ 4]=img;
  44. }
  45. }
  46. }
  47. }
  48. }
  49. }

说明:

代码要注意的点就是imgArr数组里元素的摆放顺序,此代码设置的是顺时钟旋转,抽奖的时候是按imgArr顺序往后取,如果当前是0下标对应的元素,下一步要走的就是1下标对应的元素,再下一步就2下标对应的元素了,以此类推,取完7以后再回到0开始取,就达到了尾部接上头部的效果,所以imgArr的顺序决定了抽奖时旋转的顺序,数组元素的下标如图:如果要逆时针怎么设置下标?如下图即可如果要横着旋转抽奖呢?同样的道理代码给imgArr数组添加元素的时候按下图的下标添加即可:

                             

 

如果要逆时针怎么设置下标?如下图即可

                      

如果要横着旋转抽奖呢?同样的道理代码给imgArr数组添加元素的时候按下图的下标添加即可:

                       

绘制奖项卡内容图片和文字

这个跟上面的道理差不多,对应上就行,代码很类似


  
  1. //绘制选项图片和文字
  2. ChouJiang.prototype.drawCard=function(){
  3. var image,img,rect,x= 0,sx= 0,sy= 0,sWidth= 64,sHeight= 64,dx= 0,dy= 0,dWidth= 48,dHeight= 48,disX= 45,disY= 40;
  4. //绘制9张奖项卡
  5. var imgKey = 5;
  6. var content= "",tx=ty= 0,text;
  7. for( var i= 0;i< 3;i++){
  8. dy = i* 102;
  9. for( var j= 0;j< 3;j++){
  10. dx = j* 102;
  11. //背景
  12. image = this.imgObj[imgKey++];
  13. img = new _.ImageDraw({image:image,sx:sx,sy:sy,sWidth:sWidth,sHeight:sHeight, dx:dx, dy:dy ,dWidth:dWidth,dHeight:dHeight,disX:disX,disY:disY});
  14. //img.id=i;
  15. this.renderArr.push(img);
  16. //天气
  17. tx=dx+ 68;ty=dy+ 102;
  18. if(i== 0){
  19. if(j== 0){
  20. content= this.textArr[ 0];
  21. } else if(j== 1){
  22. content= this.textArr[ 1];
  23. } else if(j== 2){
  24. content= this.textArr[ 2];
  25. }
  26. } else if(i== 1){
  27. if(j== 0){
  28. content= "";
  29. } else if(j== 1){
  30. content= "";
  31. } else if(j== 2){
  32. content= this.textArr[ 3];
  33. }
  34. } else if(i== 2){
  35. if(j== 0){
  36. content= this.textArr[ 6];
  37. } else if(j== 1){
  38. content= this.textArr[ 5];
  39. } else if(j== 2){
  40. content= this.textArr[ 4];
  41. }
  42. }
  43. text = new _.Text({
  44. x:tx,
  45. y:ty,
  46. text:content,
  47. font: '12px ans-serif',
  48. textAlign: 'center',
  49. fill: true,
  50. fillStyle: '#DD4646'
  51. });
  52. this.renderArr.push(text);
  53. }
  54. }
  55. }

抽奖指示图的绘制:一个圆角正方形,让它包裹在奖项卡背景图的外围,这里随机取(0-7)的一个数,也就是奖项卡背景数组对应的下标值,取到什么下标就绘制这个方形图片,框住在对应的那个背景图上,抽奖转动的时候也就是让这个方形图片按imgArr的顺序的往后一个个的框住,达到转动的效果:

抽奖方形指示图:

绘制代码:


  
  1. //抽奖时转动的方形图片
  2. ChouJiang.prototype.drawCjImage=function(){
  3. //随机从出现在一个卡片的位置
  4. var index = _.getRandom( 0, this.imgArr.length);
  5. this.currImageIndex=index; //当前卡片被选择下标
  6. var imgObj = this.imgArr[index]; //卡片背景对象
  7. var image,img,sx= 0,sy= 0,sWidth= 100,sHeight= 100,dx=imgObj.dx -2,dy=imgObj.dy -2,dWidth= 104,dHeight= 104;
  8. //转动方形图片
  9. image = this.imgObj[ 16];
  10. img = new _.ImageDraw({ image:image, sx:sx, sy:sy, sWidth:sWidth, sHeight:sHeight, dx:dx, dy:dy , dWidth:dWidth, dHeight:dHeight});
  11. this.renderArr2.push(img);
  12. }

此时已经绘制好全部页面了。

点击抽奖

我设定转圈数为2,每一圈是8步,然后在从0-7随机一个数字,假如随机到是5,总步数加起来是 2*8+5=21步;

开启定时任务,里面代码让当前位置+1,比如上图中的背包下标是6,加1就是7,我们就从imgArr数组里面取到下标为7的元素,也就是图中的“谢谢参与”,让抽奖指示图的坐标位置和此元素的一样,这样就可以包裹住“谢谢参与”,效果如下图:

然后定时任务的下一步代码,当前位置同样执行递增,于是7+1=8,程序判断下标大于了7,于是设定为0,下一步就让抽奖指示图的位置和书一本的位置一样,以此类推,当达到了总布数21的时候,就清除定时器,判断中奖情况,弹出中奖提示。


  
  1. //鼠标点击事件
  2. ChouJiang.prototype.mouseClick=function(e){
  3. var that= this;
  4. //随机从出现在一个卡片的位置
  5. var index = _.getRandom( 0, this.imgArr.length);
  6. //转两圈 + 随机数0-8
  7. this.totalCount = this.imgArr.length * 2 + index; //转圈总步数
  8. this.moveCount= 0;
  9. this.timmer=setInterval( this.move.bind( this), 100);
  10. }
  11. //转动
  12. ChouJiang.prototype.move=function(){
  13. var arr = this.imgArr;
  14. this.currImageIndex++;
  15. this.moveCount++;
  16. if( this.currImageIndex==arr.length){
  17. this.currImageIndex= 0;
  18. }
  19. console.log( this.currImageIndex, this.totalCount);
  20. var imgObj = this.imgArr[ this.currImageIndex]; //卡片背景对象
  21. //更新方形的位置,其实只有一个元素,不循环也可以
  22. var rectImage = this.renderArr2[ 0];
  23. rectImage.dx=imgObj.dx;
  24. rectImage.dy=imgObj.dy;
  25. if( this.moveCount== this.totalCount){
  26. console.log( '停止');
  27. clearInterval( this.timmer);
  28. this.timmer= null;
  29. //console.log("id==="+imgObj.id,this.textArr[imgObj.id]);
  30. var res = this.textArr[imgObj.id];
  31. setTimeout(function(){
  32. alert(res);
  33. }, 30);
  34. }
  35. this.render2();
  36. }

全部完成了

最终效果就跟文章开头的一样。

 

源码下载

方式1:少量积分,下载代码

方式2:关注下方公众号,回复 127 下载代码

 更多源码

♥ 基于canvas的手风琴特效(附源码)

♥ 抖音很火的华为太空人表盘(附源码)

♥ 基于JavaScript页面动态验证码(附源码)

♥ 基于JavaScript的拖动滑块拼图验证(附源码)

♥ 基于JavaScript的幸运大转盘(附源码)

♥ 抖音很火的罗盘时钟(附源码)

♥ 基于JavaScript的俄罗斯方块小游戏(附源码)

♥ 基于JavaScript的贪吃蛇游戏(附源码)

♥ 基于JavaScript的拼图游戏(附源码)

♥ 用JavaScript给女儿做的烟花特效(附源码)

♥ 老父亲给女儿做的下雪特效,满足女儿看雪的愿望(附源码)

♥ 雷达扫描特效(附源码)

♥ 香港黄金配角吴孟达去世,80后程序员以轮播图来悼念达叔,达叔一路走好!(附源码)

♥ 仿抖音刷新进度条(附源码)

♥ 仿头条方形刷新进度条(附源码)

♥ 仿360加速球、水波评分特效(附源码)

♥ 基于canvas的刮刮卡(附源码)

♥ 原生js写的左侧飞入拼图特效,你是喜欢美女单飞还是双飞(附源码)

♥ 用js写的旋转木马,在新年献给各位刚登基的皇帝,让你的后宫转起来!程序员就是可以为所欲为!(附源码)

♥ 用js写的轮播图,八位女明星,你翻谁的牌,程序员就是可以为所欲为!(附源码)

♥ 原生js实现美女拼图,把美女老婆抱回家,5个美女够不够!程序员就是可以为所欲为!(附源码)

♥ 用js仿探探拖拽卡片的效果、飞卡片的效果,感觉挺酷,最后有美女看哦!(附源码)

♥ 老婆说程序员不懂浪漫,程序员默默拿起了键盘,这就亲手带你去看流星雨,女人真的会影响男人拔刀的速度!(附源码)

♥ 学生成绩管理系统(jsp+jquery+java+mysql+tomcat)有源码,你的毕设我的心(附源码)


转载:https://blog.csdn.net/dkm123456/article/details/115640032
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场