换了新工作以后,专注前端开发,平常空闲时间也比较多,可以多钻研一下技术,写一下博客。最近在学习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>

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

  1. HTML5版的String Avoider小游戏

    HTML5版的String Avoider小游戏 http://www.newgrounds.com/portal/view/300760 蛮简单也蛮考验耐心,从游戏起始点移动鼠标到终点位置,鼠标移动 ...

  2. canvas写个简单的小游戏

    之前在HTML5 Canvas属性和方法汇总一文中,介绍过Canvas的各种属性以及方法的说明,并列举了自己写的一些Canvas demo,接下来开始写一个简单的小游戏吧,有多简单,这么说吧,代码不到 ...

  3. 【Unity 3D】学习笔记29:游戏的例子——简单的小制作地图

    无论学习.只看不练是坏科学. 因此,要总结回想这怎么生产MMROPG小地图的游戏.于MMROPG游戏类,在游戏世界中行走时导致各地,通常在屏幕的右上角,将有一个区域,以显示当前的游戏场景微缩.在游戏世 ...

  4. Scratch 简单的小游戏 --- 碰碰球

    Scratch 简单的小游戏 --- 碰碰球 ================================ 积木脚本块的简要分类: 1. 角色 2. 背景 3. 角色和背景组成的场景 4. 挡板角 ...

  5. java实现简单窗体小游戏----球球大作战

    java实现简单窗体小游戏----球球大作战需求分析1.分析小球的属性: ​ 坐标.大小.颜色.方向.速度 2.抽象类:Ball ​ 设计类:BallMain—创建窗体 ​ BallJPanel—画小 ...

  6. 使用JavaScript实现简单的小游戏-贪吃蛇

    最近初学JavaScript,在这里分享贪吃蛇小游戏的实现过程, 希望能看到的前辈们能指出这个程序的不足之处. 大致思路 首先要解决的问题 随着蛇头的前进,尾巴也要前进. 用键盘控制蛇的运动方向. 初 ...

  7. 5、Cocos2dx 3.0游戏开发找小三之測试例子简单介绍及小结

    重开发人员的劳动成果.转载的时候请务必注明出处:http://blog.csdn.net/haomengzhu/article/details/27186557 測试例子简单介绍 Cocos2d-x ...

  8. 6、Cocos2dx 3.0游戏开发找小三之游戏的基本概念

    重开发人员的劳动成果,转载的时候请务必注明出处:http://blog.csdn.net/haomengzhu/article/details/27689713 郝萌主友情提示: 人是习惯的产物,当你 ...

  9. 微信小程序——【百景游戏小攻略】

    微信小程序--[百景游戏小攻略] 本次课程小项目中的图片以及文章还未获得授权!请勿商用!未经授权,请勿转载! 博客班级 https://edu.cnblogs.com/campus/zjcsxy/SE ...

随机推荐

  1. Redis常用操作-------Set(集合)

    1.SADD key member [member ...] 将一个或多个 member 元素加入到集合 key 当中,已经存在于集合的 member 元素将被忽略. 假如 key 不存在,则创建一个 ...

  2. Python-习题-11

    1,内容回顾列表:增 append insert extend 删 remove pop clear del 改 li[索引] = '被修改的内容' li[切片]:'被修改的内容' 查 for循环 r ...

  3. 【个人阅读】M1/M2阶段总结

    1.以前博客的链接 http://www.cnblogs.com/zyctsl/p/4028006.html http://www.cnblogs.com/zyctsl/p/4094011.html ...

  4. 【个人博客作业II】有关代码规范问题的讨论

    参考课程辅导书<构建之法>可以知道,程序的代码规范常指代码风格规范和代码设计规范两个方面,其中:代码风格规范包括(缩进,行宽,括号,断行与空白行,分行,命名,下划线,大小写,注释这几个部分 ...

  5. 《Linux内核设计与实现》读书笔记四

    Chapter 3 进程管理 3.1 进程 进程就是处于执行期的程序(目标码存放在某种存储介质上),但进程并不仅仅局限于一段可执行程序代码.通常进程还要包含其他资源,像打开的文件,挂起的信号,内核内部 ...

  6. 大三上学期安卓一边学一边开始做一个自己觉得可以的项目 广商小助手App 加油

    这项目构思好多 一个人一步一步来 一边做一边为后面应用铺设 广商小助手APP 设计出的软件登录场景 实现(算是可以) 界面大体出来了 界面点击方面也做了很多特效 上图其实点击各颜色后会出现各种图和反应 ...

  7. Redis持久化的两种方式和区别

    该文转载自:http://www.cnblogs.com/swyi/p/6093763.html Redis持久化的两种方式和区别 Redis是一种高级key-value数据库.它跟memcached ...

  8. Linux命令博客目录

    Linux 目录结构 Linux命令(一) pwd ,cd Linux命令(二) 复制文件 cp Linux命令(三) 移动文件 mv Linux命令(四)删除文件 rm Linux终端常用快捷键 L ...

  9. [cnblog新闻]历史性时刻:云硬件支出首次高于传统硬件

    https://news.cnblogs.com/n/617487/ 据调研公司 IDC 声称,2018 年第三季度云硬件支出占 IT 总收入的 50.9%. 知名调研公司 IDC 声称,面向云的 I ...

  10. 【转帖】ARM的两种不同的CPU docker 应该也是支持arm的

    armel和armhf区别选择 知识经验  3年前 (2014-11-07)  20603浏览  1评论 目录 fpu单元 armel与armhf 安装armel和armhf arm-linux-gn ...