HTML5小游戏-简单抽奖小游戏

  换了新工作以后,专注前端开发,平常空闲时间也比较多,可以多钻研一下技术,写一下博客。最近在学习canvas,参考网上的slotmachine插件,用canvas实现了一个简单抽奖小游戏。

  

 

     知识点

  • canvas绘制背景
  • canvas绘制图片
  • canvas绘制边框
  • canvas事件处理
  • canvas简单动画制作

     步骤

  1、准备好图片,首先是机器的外观、以及滚动的奖项图片,我一共准备了6种,奖项图片按照一定的规律命名,这样方便处理

  

    

  2、准备好canvas画布,设置好基本的CSS样式,完成以后大概是这样子。

   PS:这里我设置了canvas的背景色,方便看到效果,完成品会去掉背景色,因为背景我们要设置成机器

  

  3、计算好位置,绘制背景图、以及奖励项目边框,绘制完大概是这样子

  PS:要注意的一点是,绘制背景要等到图片加载完才能绘制(这不是废话吗!),绘制边框要等到背景绘制完,不然会被覆盖掉。

    

4、绘制奖项图片,位置和边框位置一致,完成效果大致是这样

  

   5、加上点击事件、点击开启关闭切换,完成效果见顶部,done!

 待优化

  奖项切换的效果没有实现,就是奖励上下滚动的效果

  

 总结

  试水canvas,蛮有趣的,打开了新世界的大门。

<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  <title>SlotMachine</title>
  <style>
    body {
      background: gray;
    }

    #test {
      background: #fff;
      width: 100%;
      max-width: 551px;
      position: absolute;
      top: 50%;
      left: 50%;
      transform: translate(-50%, -50%);
    }
  </style>
</head>

<body>
  <canvas id="test" width="533" height="411">
    您的浏览器不支持Canvas,现在都什么年代了
  </canvas>
  <script>
    ; (function () {
      let canvas = document.querySelector(‘#test‘);
      //引入缩放比例计算,兼容多种终端
      let scaling = {
        w: canvas.clientWidth / canvas.width,
        h: canvas.clientHeight / canvas.height
      };
      if (canvas.getContext) {
        let ctx = canvas.getContext(‘2d‘);
        let bg = new Image();
        let imgs = {
          left: new Image(),
          middle: new Image(),
          right: new Image()
        };
        let flag = {
          left: 1,
          middle: 1,
          right: 1,
          max: 6
        };
        let ps = {
          left: [70, 160],
          middle: [185, 160],
          right: [295, 160]
        };
        let interval = 1000 / 10;
        let timer = {
          left: null,
          middle: null,
          right: null
        };

        //绘制图片
        function drawImg(img, x, y) {
          ctx.drawImage(img, x, y, img.width, img.height);
        }

        //绘制背景
        function drawBg(img) {
          let pattern = ctx.createPattern(img, ‘no-repeat‘);
          ctx.fillStyle = pattern;
          ctx.fillRect(0, 0, 533, 411);
        }

        //绘制图片边框
        function drawBorder(x, y, w, h) {
          ctx.save();
          ctx.strokeStyle = ‘#000000‘;
          ctx.lineWidth = 4;
          ctx.strokeRect(x, y, w, h);
          ctx.restore();
        }

        //判断点击是否在图片范围内
        function isPointInPath(x, y, x1, y1) {
          return x <= x1 && x + 100 >= x1 && y <= y1 && y + 100 >= y1;
        }

        //动画开始
        function start(key) {
          timer[key] = setInterval(function () {
            flag[key] === flag.max ? flag[key] = 1 : flag[key]++;
            imgs[key].src = ‘./img/slot‘ + flag[key] + ‘.png‘;
          }, interval);
        }

        //动画停止
        function stop(key) {
          clearInterval(timer[key]);
          timer[key] = null;
        }

        //初始化
        function init() {
          bg.src = ‘./img/machine.png‘;
          bg.onload = () => {
            drawBg(bg);
            drawBorder(ps.left[0], ps.left[1], 100, 100);
            drawBorder(ps.middle[0], ps.middle[1], 100, 100);
            drawBorder(ps.right[0], ps.right[1], 100, 100);
            imgs.left.src = ‘./img/slot6.png‘;
            imgs.left.onload = () => {
              drawImg(imgs.left, ps.left[0], ps.left[1]);
            };

            imgs.middle.src = ‘./img/slot6.png‘;
            imgs.middle.onload = () => {
              drawImg(imgs.middle, ps.middle[0], ps.middle[1]);
            };

            imgs.right.src = ‘./img/slot6.png‘;
            imgs.right.onload = () => {
              drawImg(imgs.right, ps.right[0], ps.right[1]);
            };
          };

          canvas.addEventListener(‘click‘, function (e) {
            //引入缩放比例计算,兼容多种终端
            let x1 = e.offsetX / scaling.w;
            let y1 =  e.offsetY / scaling.h;

            for (let key in ps) {
              if (ps.hasOwnProperty(key)) {
                let item = ps[key];

                if (!isPointInPath(item[0], item[1], x1, y1)) continue;

                if (timer[key]) {
                  stop(key);
                } else {
                  start(key);
                }
              }
            }
          });
        }

        init();
      }
    })();
  </script>
</body>

</html>

原文地址:https://www.cnblogs.com/jydeng/p/9186738.html

时间: 2024-07-29 04:34:14

HTML5小游戏-简单抽奖小游戏的相关文章

生活小趣味-简单抽奖

路过商场,看过抽奖感觉挺有意思的,商场进行抽奖活动,三个奖项,一等奖的概率1/10,二等奖的概率的3/10,三等奖的概率是6/10,具体奖品我没仔细看,回来随便练手了一下,思考了一下,奖品分为10份,生成一个随机数,如果0-5则是三等奖,6-8是二等奖,9是一等奖,简单实现如下: int randomNumber=arc4random()%10; if (randomNumber>=0&&randomNumber<=5) { [self alert:@"恭喜你获得三等

微信小程序-整理各种小程序源码和资料免费下载

微信小程序整理下载 [小程序源码]微信小程序-车源宝微信版 [小程序源码]小程序-微赞社区(论坛demo) [小程序源码]微信小程序-收支账单 [小程序工具]微信小程序-日历 [小程序源码]小程序-在线聊天功能 [小程序源码]微信小程序-大好商城(新增功能天气查询和2048游戏) [小程序源码]微信小程序-查询号码归属地 [小程序源码]微信小程序-备忘录2 [小程序源码]微信小程序-QQ音乐 [小程序源码]小程序-货币汇率 [小程序源码]微信小程序-大学图书馆 [小程序源码]小程序-积分商城 [

HTML5版的String Avoider小游戏

HTML5版的String Avoider小游戏 http://www.newgrounds.com/portal/view/300760 蛮简单也蛮考验耐心,从游戏起始点移动鼠标到终点位置,鼠标移动过程绘制出移动轨迹的String平滑曲线,整个过程不能碰撞到边界,从技术角度来说其核心就是根据鼠标移动位置生成String线的算法,该游戏是ActionScript写的Flash版,这里将其改造成HTML5版的JavaScript实现,并增加可自定义关卡功能的一种设计思路. String连线我是缓存

Cocos2d-X开发一个简单的小游戏

学了这么久Cocos2d-X,今天终于可以做出一个简单的小游戏了,游戏非常简单,通过菜单项控制精灵运动 在做游戏前,先学一个新概念 调度器(scheduler): Cocos2d-x调度器为游戏提供定时事件和定时调用服务.所有Node对象都知道如何调度和取消调度事件,使用调度器有几个好处: 每当Node不再可见或已从场景中移除时,调度器会停止. Cocos2d-x暂停时,调度器也会停止.当Cocos2d-x重新开始时,调度器也会自动继续启动. Cocos2d-x封装了一个供各种不同平台使用的调度

html5 canvas 实现简易马祖小游戏

参考妙趣课堂的视频,做了这个游戏,通过这个游戏可以了解到canvas的强大.废话不多说,直接上代码. html代码: <!doctype html> <html lang="en"> <head> <meta charset="UTF-8"> <title>马祖</title> <link rel="stylesheet" type="text/css&quo

2、Cocos2dx 3.0游戏开发找小三之引擎简介

尊重开发者的劳动成果,转载的时候请务必注明出处:http://blog.csdn.net/haomengzhu/article/details/27094663 引擎简介 Cocos2d-x 的原型是 Cocos2d,一个最早来源于几位 Python 开发者在 PyWeek 竞赛中的作品, 目的是封装底层绘图代码,简 化 2D 游戏的开发过程,避免每次都"重新发明轮子". 有了 Cocos2d,开发者就可以把全部精力集中在游戏开发上,而不必关心绘图的细节. 这个 Python 版本的引

14、Cocos2dx 3.0游戏开发找小三之Scene and Layer:一场游戏一场梦

重开发者的劳动成果,转载的时候请务必注明出处:http://blog.csdn.net/haomengzhu/article/details/30474393 Scene :场景 了解了Director 之后,接下来介绍 Scene 这个与它紧密相关的游戏组件. 通过之前的学习,我们已经了解了场景以及它在流程控制中的地位. 在 Cocos2d-x 中,Scene 定义了一个场景.场景只是层的容器,包含了所有需要显示的游戏元素. 因此相对于其他游戏元素,Scene 并没有提供什么特别的功能,就是一

17、Cocos2dx 3.0游戏开发找小三之内置的常用层:三剑客LayerColor、LayerGradient、Menu

重开发者的劳动成果,转载的时候请务必注明出处:http://blog.csdn.net/haomengzhu/article/details/30477587 为了方便游戏开发者,Cocos2d-x 内置了 3 种特殊的 Layer: 具体如下所示: LayerColor:一个单纯的实心色块. LayerGradient:一个色块,但可以设置两种颜色的渐变效果. Menu:十分常用的游戏菜单. LayerColor 与 与 LayerGradient 这两个层十分简单,都仅仅包含一个色块. 不同

18、Cocos2dx 3.0游戏开发找小三之cocos2d-x,请问你是怎么调度的咩

重开发者的劳动成果,转载的时候请务必注明出处:http://blog.csdn.net/haomengzhu/article/details/30478251 Cocos2d 的一大特色就是提供了事件驱动的游戏框架, 引擎会在合适的时候调用事件处理函数,我们只需要在函数中添加对各种游戏事件的处理, 就可以完成一个完整的游戏了. 例如,为了实现游戏的动态变化,Cocos2d 提供了两种定时器事件: 为了响应用户输入,Cocos2d 提供了触摸事件和传感器事件: 此外,Cocos2d 还提供了一系列