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

View Code

转载于:https://www.cnblogs.com/jydeng/p/9186738.html

HTML5小游戏-简单抽奖小游戏相关推荐

  1. 数字抽奖小程序_抽奖小程序凭什么成为流量的风口?怎么以最快的方式引流?...

    现在不管是实体店还是线上,最需要的就是客户流量,怎么才能最快速的引流呢? 推广到用户,并且让用户推广用户,更快的裂变. 现在市面上的抽奖小程序,轻松地做到了快速裂变发展用户的效果.成为流量风口. 抽奖 ...

  2. 抽奖小程序 c语言,抽奖小程序 一抽奖小程序,需十位学生信息,抽出一等奖1名,二等奖2名,三等奖......

    1, 一抽奖小程序,需十位学生信息,抽出一等奖1名,二等奖2名,三等奖... public static void main(String[] args) {int input = 10;Scanne ...

  3. 基于HTML5canvars的小游戏,HTML5之canvas简单射箭小游戏

    最近折腾一个自己个人主页,无奈履历太渣,能放在首页的东西不多,于是想给自己的个人主页上添加一个小游戏.遂参考了各种教程,使用HTML5的canvas元素做了一个相当原始的东西出来,效果如图~ QQ截图 ...

  4. 简单游戏的c语言程序,[C语言编写小程序]简单打飞碟游戏

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 同样是最初步的模拟,有待再完善下去.飞碟速度上的问题还是希望大家自己调整gamespeed的速度. 空格是发射,发射的具体样子我没写. #include ...

  5. c语言小程序游戏飞机游戏,[C语言编写小程序]简单打飞碟游戏

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 同样是最初步的模拟,有待再完善下去.飞碟速度上的问题还是希望大家自己调整gamespeed的速度. 空格是发射,发射的具体样子我没写. #include ...

  6. 使用html5 canvas绘制简单图形小作品~灰太狼

    <!-- 作者:1457225624@qq.com 时间:xxxx-xx-xx 描述:大家好!我是小张,今天我用html5,,canvas的画布画出了一个小作品, 画的不好看,,,还请原谅,,下 ...

  7. 能打印出心形的c语言小程序,简单的小程序(打印出螺旋行的矩阵)

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 运行结果: please input a number between 1 to 99 10 1&nbsp&nbsp 2&nbsp ...

  8. 小程序转盘抽奖,小程序抽奖

    很多地方都会用到就记录一下,有懒的到处找,可以随机,也可以从后台获取数据,改一下参数就可以用,如果帮到了你就点个赞吧 下载地址

  9. C++(11)--编程实践1-经典养成类游戏简单实践

    经典养成类游戏简单实践-小公主养成记 <老九学堂C++课程>学习笔记.<老九学堂C++课程>详情请到B站搜索<老九零基础学编程C++入门> ------------ ...

最新文章

  1. oracle 更改ip
  2. 【BZOJ】1067: [SCOI2007]降雨量(rmq+变态题)
  3. 【Python面试】 说说Python可变与不可变数据类型?
  4. 【线段树】【LCT】【LCA】树点涂色(luogu 3703)
  5. 我理解中的“大前端”/“大无线”
  6. 极光推送指定用户推送_App用户都睡着了?是时候用推送和活动唤醒一波了!
  7. ota编译及差分包制作
  8. 直指Adobe的龌龊行径
  9. Atitit 读取文件并处理目录1.1. 3. 以二进制读取 fread取代fgets 11.2. 4.将整个文件读入到一个字符串的方法 file_get_contents() 11.3.
  10. 选择RDP报表工具的原因
  11. 前端安全问题的解决方法
  12. RTL8188无线网卡AP功能的开发过程
  13. php soapfault 怎么用,SoapFault出现的问题及解决办法分享
  14. python tcl quartus_使用TCL脚本语言操作Quartus(一)
  15. 计算机科学与因果关系,因果关系,概率和时间
  16. 计算机基础技能应用查询中心,《计算机基础及技能训练》大纲
  17. GCC(Graph Contrastive Clustering)论文代码复现
  18. PB powerbuilder 电子邮件发送
  19. 简单的python爬虫程序:爬取斗鱼直播人气前五十的主播
  20. 几个重要的排列组合定理公式

热门文章

  1. AUC和ROC曲线的前世今生
  2. SWITCH语句中如果执行了一条CASE语句是空的后,程序会
  3. 性能监控:top命令
  4. /backend_agg.py:238: RuntimeWarning: Glyph 26085 missing from current font.
  5. Excel服务器数据库修改,excel服务器与数据库
  6. Linux CPU软中断案例一则
  7. 揭秘奥运会四大难解之谜
  8. 她他它的用法?收藏给小孩看吧
  9. 十大技术类公众微信号地址
  10. DNS和Web服务的配置与访问