手把手教你实现一个高性能的抽抽乐H5小游戏(含源码)
那我们就来学点有意思的,用几十行代码来实现一个高性能的抽奖小游戏.也基于此,来巩固我们的javascript基础,以及前端一些基本算法的应用.
- 防抖函数的应用
- 用css实现九宫格布局
- 生成n维环形坐标的算法
- 如何实现环形随机轨道运动函数
- 实现加速度动画
- 性能分析与优化
由于目前已有很多方案可以实现九宫格抽奖动画,比如使用动态active实现边框动画,用随机算法和定时器设置在何处停止等等. 为了进一步提高性能,本文介绍的方法,将使用坐标法,将操作dom的成本降低,完全由js实现滑块的路径的计算,滑块元素采用绝对定位,让其脱离文档流,避免其他元素的重绘等等,最后点击按钮我们会使用防抖函数来避免频繁执行函数,造成不必要的性能损失.
为了让大家更加熟悉dom结构,这里我就不用js动态生成了.如下html结构:
九宫格布局我们使用flex来实现,核心代码如下:
由上可知容器box采用flex布局,要想让flex子元素换行,我们这里要设置flex-wrap: wrap;此时九宫格布局就实现了. 滑块采用绝对定位,至于具体如何去沿着环形轨道运动,请继续看下文介绍.
由上图我们可以知道,一个九宫格的4条边,可以用以上8个坐标收尾连接起来,那么我们可以基于这个规律.来生成环形坐标集合.代码如下:
如果是单位坐标,那么cell为1,cell设计的目的就位为了和现实的元素相结合,我们可以手动设置单元格的宽度来实现不同大小的n维环形坐标集.
由抽奖动画分析可知,我们滑块运动的轨迹,其实就是环形坐标集合,所以我们只要让滑块的顶点(默认左上角)沿着环形坐标集合一步步变化就好了.
这样就能实现我们的滑块按照九宫格边框运动的动画了,当然以上函数只是基本的动画, 还没有实现在随机位置停止, 以及滑块的加速度运动,这块需要一定的技巧和js基础知识比如闭包.
加速度运动其实很简单,比如每转过一圈将setTimeout的延迟时间改变即可.代码如下:
随机停止这块主要是用了Math.random这个API, 我们在最后一圈的时候, 根据随机返回的数值来决定何时停止,这里我们在函数内部实现随机数值,完整代码如下:
防抖函数实现:
那么我们点击时,代码应该长这样:
在文章发布之后,有热心的小伙伴们提出了几个建议,综合如下:
- 抽奖动画结束后提供回调来通知页面以便处理其他逻辑
- 处理多次点击时,虽然加了防抖,但是用户在动画没结束时点击了开始按钮,又会执行动画导致动画越来越快,发生混乱.
综合以上问题,我在之前基础上做了进一步扩展,来解决以上提到的问题.
- 添加动画结束时回调:
- 处理多次点击时,虽然加了防抖,但是用户在动画没结束时点击了开始按钮,又会执行动画导致动画越来越快,发生混乱.
谢谢各位认真的建议,继续优化吧.
该实现方式的好处是支持n维环形坐标的抽奖,基于坐标法的应用还有很多,尤其是游戏和图形领域,在实现过程中一定要考虑性能和可扩展性,这样我们就可以在不同场景使用同一套方法论,岂不乐哉?本文完整源码我会放在github上,欢迎交流学习~
github地址:https://github.com/MrXujiang?tab=repositories
欢迎在公众号《趣谈前端》加入我们一起学习讨论,共同探索前端的边界。
男子窃取游戏源代码 再包装成新游戏获利8千万
封面新闻记者 田之路
近日,封面新闻记者获悉,一起通过盗取游戏源代码的案件宣判。男子邱某担任游戏公司总经理后,重新将游戏再加工、包装后自立门户,获利8千万余元。经成都高新法院判定,邱某获刑5年。
2017年2月初,邱某入职盛大某某公司任总经理,通过职务上的便利获知了公司SVN服务器账号、密码,并私自取得“某人”游戏源代码。
2017年5月至6月期间,邱某通过他人分别设立某甲科技公司与某乙科技公司(邱某为该两家公司的实际控制人),在未经著作权人许可的情况下,将“某人”游戏进行换皮、加工等形式修改,更名为“某赢家”游戏。
2017年8月,邱某从盛大某某公司正式离职,利用某甲科技公司负责“某赢家”游戏的技术支持,利用某乙科技公司上线运营“某赢家”游戏。经司法鉴定,“某赢家”游戏源代码与“某人”源代码相似度达99%,存在实质性相似。现场勘查显示,“某赢家”游戏上线运营期间,玩家充值金额为8224万余元。
2018年7月,成都高新区检察院以侵犯著作权罪对邱某提起公诉。诉讼期间,高新区检察院积极督促邱某与权利人盛大某某公司签订协议,赔偿权利人220万元并保证其在签订协议后3年内不再从事与权利人直接或间接竞争的网络游戏的研发和经营。
【如果您有新闻线索,欢迎向我们报料,一经采纳有费用酬谢。报料微信关注:ihxdsb,报料QQ:3386405712】
Flutter跨平台、H5、小程序源码大集合,快学习起来
介绍:非常漂亮的一套Flutter UI 套件,可以供学习Flutter
源码地址:https://www.dandroid.cn/?p=7214
介绍:用Flutter构建漂亮UI界面,里面涉及大量效果组件,入门可学习
源码地址:https://www.dandroid.cn/?p=7233
介绍:基于Vue2.0开发、通过拖拽快速生成页面的平台,类似 易企秀、Maka、百度 H5 等平台
源码地址:https://www.dandroid.cn/?p=7249
介绍:Taro 多端统一实例 – 网易严选(小程序 + H5 + React Native)
源码地址:https://www.dandroid.cn/?p=7261
介绍:支持 H5, 微信小程序 沪深/港股/数字货币/期货/美股 K线图(kline),走势图,缩放,拖拽,十字光标,画图工具,截图,图. 分析家语法
源码地址:https://www.dandroid.cn/?p=7264
介绍:Flutter跨平台商城app
源码地址:https://www.dandroid.cn/?p=7267
介绍:用Taro做跨端开发框架,Taro基本采用React的写法,项目集成了 redux dva 控制单向数据流,用immer来提供不可变数据,提升整体的性能,减少渲染
源码地址:https://www.dandroid.cn/?p=7272
介绍:基于Vue实现开箱即用移动端商城的单页应用
源码地址:https://www.dandroid.cn/?p=7281
介绍:h5页面分享组件、支持分享到微信、朋友圈、新浪微博、QQ空间、QQ好友
源码地址:https://www.dandroid.cn/?p=7290
介绍:uniapp仿奶茶类小程序前端模板
源码地址:https://www.dandroid.cn/?p=7294
更多高质量源码尽在www.dandroid.cn 到桌源码网
本文作者及来源:Renderbus瑞云渲染农场https://www.renderbus.com
文章为作者独立观点不代本网立场,未经允许不得转载。