一文教你用JavaScript制作个简单的大转盘游戏

目录
  • 背景
  • 一、开始前的准备
  • 二、画出大转盘
  • 三、把奖励放上去
  • 四、让大转盘滚起来
  • 个人总结

背景

日常生活中,我们经常会见到形形色色的抽奖活动,例如九宫格、大转盘等等……以前都没去深入考虑过,如果让我去做这些小游戏,有哪些需要注意的事项,不试不知道,一试全是坑。正好最近有需求让我做一个大转盘游戏,那我也总结一下我的一些感想和经验。

一、开始前的准备

首先就是确定产品需求,仔细一看,emmm,就是正常的一个大转盘该有的东西,也没啥特殊要求,唯一需要注意的是大转盘的转盘个数需要动态变化,即用户设置多少奖品我就需要显示多少块区域。

既然要做大转盘,不外乎三个步骤:

  • 画出大转盘
  • 把奖励放上去
  • 让大转盘滚起来

这有啥难的,让UI给我N个大转盘背景图,用户设了多少奖品我就显示对应的背景图... 哦,那样图片太多了,太麻烦了,也行吧... 那给我每个角度的扇形切图一张,我转一下不就出来了?... 啊?不给啊,那没事了...(当时的表情:冷静分析...仔细思索...眉头稍皱...好耶,我凉了呀)

二、画出大转盘

画出大转盘底图部分就不必多说了,最难的部分在于把一个圆动态平均分成N份,并让其在底图上正常显示。

我采用的方法是:用户选择了多少奖品(除2个奖品以外)我就在底图上生成多少个宽高为底图50%的div,目的是使每个div的右下角正好与底图的中心点重合(这里有个坑,看下去就知道了),接着计算出对应的圆心角 angle = 360 / n ,然后将其形变后以右下角为圆心旋转对应的角度拼成一个圆形。其中,形变和旋转分别采用skew与rotate进行实现。

注:

  • skew形变的角度为(90 - angle)deg
  • 如果要给每一块加上渐变色的话,由于使用了skew形变,所以要显示从左到右的渐变的效果,就需要从原先正方形的底边变到右边,即:background: linear-gradient('45deg', color1, color2)

如想看到更为细致的旋转原理与demo,请点击下方链接:

原理:https://www.w3cplus.com/css3/building-a-circular-navigation-with-css-transforms.html

demo:https://tympanus.net/Tutorials/CircularNavigation/interactivedemo/index.html

// 以下为N为8时,用纯JS写的一个测试demo
const n = 8; // 奖品数量
const circle = document.getElementById('circle');
for(let i = 0; i < n ; i++) {
    let item = document.createElement('div');
    item.className = `circle-item  circle-item-${n}`;
  	// n为2时,旋转原点不在右下角改为底部中点,不需要skew形变,并且宽度不是50%而是100%
    if(n !== 2) {
      item.style=
        `transform: rotate(${i * angle}deg) skew(${90 - angle}deg);
         transform-origin: bottom right;
         background-color: ${colorList[i % colorList.length]}; //设置了每个格子的背景色,可以不设置
        `
    } else {
      item.style=
        `transform: rotate(${i * angle}deg);
         transform-origin: bottom;
         background-color: ${colorList[i % colorList.length]};
        `
    }
    circle.appendChild(item);
  }

本以为算解决了一个难题,直到我开始测试时,发现 n == 3时出现了奇怪的现象:

好嘛,当 n == 3时,只设置50%的宽高显然并不能填充满整个背景图。于是更改了当 n != 2时的样式,改为宽高的60%,并设置其初始位置往左和上各平移10%。

.circle-item {
    border: 1px solid;
    height: 60%;
    width: 60%;
    position: absolute;
    left: -10%;
    top: -10%;
}

这样乍一看是实现了平均分的问题,但仔细一想还有一个问题,那便是如果加上指针,指针永远是向上的,这样看起来就怪怪的了,所以还需要将整个图像进行一个旋转,使初始指针默认指向第一块的中心位置。

旋转角度为: (180 - angle) / 2

三、把奖励放上去

把奖励放上去我想到两种方法:

1、给每个奖励生成一个与底部背景图宽高一样的正方形,然后将其对着中心点旋转对应的角度,将其一层层的放在底部背景图上,即可完成。如下图1所示,每一个正方形的大小都是与底部的背景图的宽高是一样的,只是将其进行一个旋转即可。(当时以为不好显示用户抽中的扇形的部分,就没采用这种方法,现在总结了才发现只需要将颜色填充在每个扇形中即可,不用填充在奖励背景上,如下图2所示,应该也是能实现的)

图1 每一层奖励的范围

图2 总结时想到的实现方法

2、将奖励直接放在每一个扇形区域里面,这样我就直接修改每个扇形的背景色即可。看上去很简单,但实际开始操作了就发现了两个问题:

  • 由于每一块方格是skew形变出来的,奖励直接放上去也会产生形变,需要将形变消除;
  • 奖励居中显示很麻烦,到现在我也没有找到可以套用的公式;

第一点解决起来较为简单,只需要将奖励进行一个反向的skew变形,旋转角度为:-(90 – (angle / 2))deg。 第二点我到现在也没有找到可以套用的公式,是每一种给他写了一个样式居中的。(还好产品只要求2-6的奖励数量,不然可能就没有这篇文章了,如果大家有好的方法也可以教教我)

两种方法各有优点: 方法一的优点是不需要将奖励进行反向形变,怎么放上去就是怎么显示; 方法二的优点是奖励与扇形不分离,我不需要额外的添加太多的div来实现奖励正确显示。

四、让大转盘滚起来

大转盘到现在已经完成了七七八八了,现在就差最后一步,让其滚起来,点击一次后滚动到对应的位置然后停下。

采用的方法是给大转盘添加一个旋转的动画,突然想起来 transform 中有 ease-in-out 这个过渡方法,即慢-快-慢的过渡效果,正好满足我抽奖所需,于是直接采用了这种方法。

这里有个小细节,由于大转盘上本来就设置了transform的动画效果,如果不想现在的旋转动画覆盖掉之前的动画,就需要单独给动画加上一层div,放在大转盘底图的外边一层。

const circle = 8; // 旋转圈数
let circleAdd = 0; // 抽奖次数,每次抽完自增
let rotateAngle = 0; // 旋转角度
let getPrizeIndex = 0; // 抽到的奖品的index

在定义完上面的内容之后计算需要旋转的角度: rotateAngle = circle * 360 * circleAdd - angle * getPrizeIndex,将这个rotateAngle放入需要旋转的style中即可完成旋转。

这里走了两次弯路,一次是没有加上circleAdd,然后就发现第一次大转盘会正常旋转,第二次开始就不动或者只往前滚不到360°甚至往回滚!原因是因为每一次给style赋新值的时候,由于已经有旋转的角度了,他会在你设置新的旋转角度的时候从上一个旋转角度开始执行动画。

第二次是我在写计算公式的时候,想当然的把上面的“-”写成了“+”,想的是我先旋转了circle * circleAdd圈,然后还要滚 getPrizeIndex 个奖励就是我需要显示的奖励,然后发现指针指向的奖励与我需要选择的 getPrizeIndex 并不相符。仔细检查了才发现虽然大转盘旋转是顺时针方向的,但是奖励的读取方向应该是逆向的,所以应该是“-”而不是“+”。

个人总结

在写这个大转盘之前我一直没觉得大转盘这种小游戏有多难,无非就是转一下,然后奖励显示一下,这有啥难的?写了之后才发现自己真的too young too simple,一个简单的大转盘里面也有不少的数学的公式需要学习计算,真的是走一步卡半天,一步一个坑。还是需要多多学习!

到此这篇关于一文教你用JavaScript制作个简单的大转盘游戏的文章就介绍到这了,更多相关JavaScript大转盘游戏内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • JS旋转实现转盘抽奖效果

    本文实例为大家分享了JS旋转实现转盘抽奖效果的具体代码,供大家参考,具体内容如下 闲来没事,做了一个模拟转盘抽奖的HTML&JS的效果: 可以在设置的时候,选择几个区域,并且可以填写指针将要停止的区域 比如,我选择了"区域2",结果就是这样 具体可以见下面的源码:(注意,这里JQ文档没有贴出来,需要自行引入) HTML文件: <!DOCTYPE html> <html>     <head>         <meta charset=

  • js抽奖转盘实现方法分析

    本文实例讲述了js抽奖转盘实现方法.分享给大家供大家参考,具体如下: HTML  这里.left 固定了圆的宽度和高度,还有canvas也设置了固定宽高 绘制圆心的坐标也就出来了 (203,203) 抽奖转盘是由一个大圆和一个内圆完成 :大圆负责绘制上奖品 ,内圆负责确定指针的位置,指针直接使用图片,决定位置确定 <div class="left"> <div class="turnplate" style="background:#1b

  • js实现大转盘抽奖游戏实例

    本文实例讲述了js实现大转盘抽奖游戏.分享给大家供大家参考.具体实现方法如下: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <hea

  • 原生JS实现H5转盘游戏的示例代码

    目录 1. 基础的页面布局(index.html) 1.1 html布局 1.2 css布局(style.css) 2. 工具函数(用于调整概率) 3. 传参及接收值配置 4. dom 操作方法及具体逻辑处理 5. FAQ(注意事项) 本文是真实的实战项目,可以直接拿去用 —— 转盘抽奖 可以自由调整概率,你也可以成为黑心商家 项目效果是这样滴:视频链接 1. 基础的页面布局(index.html) 这里不做过多解释了,就是一些页面布局 大家直接复制粘贴过去用就行(是不是很贴心~) 1.1 ht

  • JS实现简单的抽奖转盘效果示例

    本文实例讲述了JS实现简单的抽奖转盘效果.分享给大家供大家参考,具体如下: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>www.jb51.net JS抽奖转盘</title> <style> *{ margin:0; padding:0; list-style: none; } .big{

  • 一文教你用JavaScript制作个简单的大转盘游戏

    目录 背景 一.开始前的准备 二.画出大转盘 三.把奖励放上去 四.让大转盘滚起来 个人总结 背景 日常生活中,我们经常会见到形形色色的抽奖活动,例如九宫格.大转盘等等……以前都没去深入考虑过,如果让我去做这些小游戏,有哪些需要注意的事项,不试不知道,一试全是坑.正好最近有需求让我做一个大转盘游戏,那我也总结一下我的一些感想和经验. 一.开始前的准备 首先就是确定产品需求,仔细一看,emmm,就是正常的一个大转盘该有的东西,也没啥特殊要求,唯一需要注意的是大转盘的转盘个数需要动态变化,即用户设置

  • javascript制作的简单注册模块表单验证

    一个注册框  进行表单验证处理 如图 有简单的验证提示功能 代码思路也比较简单 输入框失去焦点时便检测,并进行处理 表单具有 onsubmit = "return check()"行为,处理验证情况 点击提交表单按钮时,进行最终的验证,达到是否通过表单提交的请求. 先是最基本的html+css部分 <style type="text/css"> body{margin:0;padding: 0;} .login{position:relative;mar

  • 使用JavaScript制作一个简单的计数器的方法

    设计思想 该方法的关键是Cookie技术和动态图像特性的综合运用.使用Cookie,可以在用户端的硬盘上记录用户的数据,下次访问此站点时,即可读取用户端硬盘的Cookie,直接得知来访者的身份和访问次数等有关信息.JavaScript中通过document.cookie属性访问Cookie,这个属性包括名字.失效日期.有效域名.有效URL路径等.用等号分开的名字和其值是Cookie的实际数据,本例中用来存储该访问者访问该页面的次数.通过把Web页中的图像映射到一个Images数组,一定条件下修改

  • javascript结合Flexbox简单实现滑动拼图游戏

    滑动拼图就是把一张图片分成几等份,打乱顺序(下图),然后通过滑动拼凑成一张完整的图片. 要实现一个拼图游戏,需要考虑怎样随机的打乱顺序,怎样交换两张图片的位置,等等.但是,使用了Flexbox布局以后,这都不需要你去考虑,浏览器会帮你做,Flexbox就是这么的强大.关于Flexbox的介绍可以点击这里. 这个游戏中要用的是Flexbox布局的order属性,order属性可以用来控制Flex项目的顺序. 这里我用九个canvas元素来把图片分成九等分,也可以用其他方法,比如背景图片定位: <d

  • 如何利用Python开发一个简单的猜数字游戏

    前言 本文介绍如何使用Python制作一个简单的猜数字游戏. 游戏规则 玩家将猜测一个数字.如果猜测是正确的,玩家赢.如果不正确,程序会提示玩家所猜的数字与实际数字相比是"大(high)"还是"小(low)",如此往复直到玩家猜对数字. 准备好Python3 首先,需要在计算机上安装Python.可以从Python官网下载并安装.本教程需要使用最新版的Python 3(版本3.x.x). 确保选中将Python添加到PATH变量的框.如果不这样做,将很难运行该程序.

  • JavaScript制作简单网页计算器

    本文实例为大家分享了JavaScript制作简单网页计算器的具体代码,供大家参考,具体内容如下 一.题目 利用JavaScript中的函数,完成数字加.减.乘.除的运算,实现一个简单的计算器. 二.代码 <!doctype html> <html> <head> <meta charset="utf-8"> <title>网页计算器</title> </head>   <body> <

  • 基于javascript制作微信聊天面板

    本文实例分享了javascript制作微信聊天面板的相关代码,具体内容如下 先上图吧 点击头像更换说话对象,简单说下实现原理,html中创建一个ul用于存放所有说话的内容,对话内容是有javascript 动态生成, 主要难点:先布局好css,当时奥巴马发送时候,让这个li有浮动,当是小胖时候,让这个li左浮动. 代码: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UT

  • 探索Emberjs制作一个简单的Todo应用

    目标 使用Emberjs制作一个简单的Todo应用,实现这样一个效果:通过在文本框输入文本,创建一条代办事项,代办事项可以选择优先级,完成的事项可以删除. 准备 完成这个应用,需要做点准备: 1.创建一个html页面,暂时不管样式: 2.脚本:emberjs,handlebars.jQuery.这三个脚本可以从网上获得,我们将把他们加入到head标签里去. 制作 创建页面,加入脚本,就可以开始制作应用.html代码如下: 复制代码 代码如下: <!doctype html> <html&

  • 使用JavaScript制作待办事项列表的示例代码

    目录 JavaScript待办事项列表 如何制作JavaScript待办事项列表 第 1 步: 项目的基本结构 第 2 步: 使用 HTML 创建一个输入位置 第 3 步: 制作查看 Todo 文本的列表 第 4 步: 使用 JavaScript 激活待办事项列表 JavaScript 解释 JavaScript待办事项列表 我在此处展示了有关如何使用 JavaScript创建待办事项列表 HTML 的完整信息和教程.我借助HTML 和 CSS来设计它.在 JavaScript 的帮助下实现.

  • JavaScript实现一个简单的圣诞游戏

    目录 前言 实现效果 代码 CSS代码 JS代码 html代码 演示流程 前言 圣诞节快来了,热榜都被一堆圣诞树攻占了,这样的流量密码我怎么会错过,大家都发圣诞树,我就不发啦,直接分享一个圣诞小游戏给大家玩,代码太长一定要先赞和收藏. 实现效果 一个简单的2D网页小游戏它的制作过程是有规律可寻的,它每个部分都有一定的套路,我们应该 把有规律的部分总结在一起,形成一个模板,把相应的模板写好了,到要生产某个对象时就可以用 模板,还有游戏的整个流程每个函数,每个js文件之间都是分工明确的:我们要总结好

随机推荐