iis服务器助手广告广告
返回顶部
首页 > 资讯 > 前端开发 > JavaScript >一文教你用JavaScript制作个简单的大转盘游戏
  • 579
分享到

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

JavaScript实现大转盘游戏JavaScript大转盘游戏JavaScript转盘 2023-02-01 18:02:50 579人浏览 薄情痞子
摘要

目录背景一、开始前的准备二、画出大转盘三、把奖励放上去四、让大转盘滚起来个人总结背景 日常生活中,我们经常会见到形形色色的抽奖活动,例如九宫格、大转盘等等…&helli

背景

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

一、开始前的准备

首先就是确定产品需求,仔细一看,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大转盘游戏内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

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

本文链接: https://www.lsjlt.com/news/193889.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 一文教你用JavaScript制作个简单的大转盘游戏
    目录背景一、开始前的准备二、画出大转盘三、把奖励放上去四、让大转盘滚起来个人总结背景 日常生活中,我们经常会见到形形色色的抽奖活动,例如九宫格、大转盘等等…&helli...
    99+
    2023-02-01
    JavaScript实现大转盘游戏 JavaScript大转盘游戏 JavaScript转盘
  • 如何用JavaScript制作大转盘游戏
    今天小编给大家分享一下如何用JavaScript制作大转盘游戏的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。一、开始前的准备...
    99+
    2023-07-05
  • 教你用Pygame制作简单的贪吃蛇游戏
    目录1.序言2.安装与导入3.定义后续需要的参数4.绘制蛇与食物5.游戏规则与运行6.成品展示7.完整代码总结1.序言 目前基本上软测会用到的工具或者第三方库都已经被写完,本着不要逮...
    99+
    2024-04-02
  • 用React Native制作一个简单的游戏引擎
    目录简介开始吧对React Native游戏引擎的简单介绍让我们在React Native中建立一个蛇形游戏创建游戏实体游戏逻辑移动蛇头"游戏结束!"条件食用食物控制蛇尾巴功能结语简...
    99+
    2024-04-02
  • 教你用Js写一个简单的五子棋小游戏
    目录棋盘绘制棋子的绘制在点击 canvas 的时候获取相对于棋盘数据的坐标点是否结束悔棋功能总结 这里的五子棋只做一些基础的功能,对于相对专业的规则不做处理。 那...
    99+
    2024-04-02
  • 怎么用HTML5制作一个简单的桌球游戏
    本篇内容介绍了“怎么用HTML5制作一个简单的桌球游戏”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!话说这...
    99+
    2024-04-02
  • 如何用HTML5制作一个简单的桌球游戏
    本文小编为大家详细介绍“如何用HTML5制作一个简单的桌球游戏”,内容详细,步骤清晰,细节处理妥当,希望这篇“如何用HTML5制作一个简单的桌球游戏”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起...
    99+
    2024-04-02
  • 怎么用HTML5制作一个简单的弹力球游戏
    本篇内容主要讲解“怎么用HTML5制作一个简单的弹力球游戏”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么用HTML5制作一个简单的弹力球游戏”吧!  【创建...
    99+
    2024-04-02
  • 如何用HTML5制作一个简单的弹力球游戏
    这篇文章主要介绍“如何用HTML5制作一个简单的弹力球游戏”,在日常操作中,相信很多人在如何用HTML5制作一个简单的弹力球游戏问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”...
    99+
    2024-04-02
  • 怎样用JavaScript编写一个简单的游戏
    这篇文章将为大家详细讲解有关怎样用JavaScript编写一个简单的游戏,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。通过使用一个简单的游戏来练习一些基本的...
    99+
    2024-04-02
  • JavaScript实现一个简单的圣诞游戏
    目录前言实现效果代码CSS代码JS代码html代码演示流程前言 圣诞节快来了,热榜都被一堆圣诞树攻占了,这样的流量密码我怎么会错过,大家都发圣诞树,我就不发啦,直接分享一个圣诞小游...
    99+
    2024-04-02
  • 如何使用React Native制作一个简单的游戏引擎
    这篇文章将为大家详细讲解有关如何使用React Native制作一个简单的游戏引擎,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。开始吧要制作任何游戏,我们需要一个循环,在我们玩的时候更新我们的游戏。这个循...
    99+
    2023-06-15
  • 怎么用HTML5的Canvas API制作一个简单猜字游戏
    本文小编为大家详细介绍“怎么用HTML5的Canvas API制作一个简单猜字游戏”,内容详细,步骤清晰,细节处理妥当,希望这篇“怎么用HTML5的Canvas API制作一个简单猜字游戏”文章能帮助大家解...
    99+
    2024-04-02
  • 怎么用Javascript实现一个转盘小游戏
    本篇内容主要讲解“怎么用Javascript实现一个转盘小游戏”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么用Javascript实现一个转盘小游戏”吧!前...
    99+
    2024-04-02
  • 如何借助HTML5CanvasAPI制作一个简单的猜字游戏
    本篇文章为大家展示了如何借助HTML5CanvasAPI制作一个简单的猜字游戏,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。二话不说,先上效果图以及源代码~HTML...
    99+
    2024-04-02
  • 如何利用HTML5 Canvas制作一个简单的打飞机游戏
    这篇文章主要介绍“如何利用HTML5 Canvas制作一个简单的打飞机游戏”,在日常操作中,相信很多人在如何利用HTML5 Canvas制作一个简单的打飞机游戏问题上存在疑惑,小编查阅了各式资料,整理出简单...
    99+
    2024-04-02
  • 基于JS制作一个简易的2048游戏
    效果图 实现代码 <!DOCTYPE HTML> <html> <head> <meta http-equiv="Content-T...
    99+
    2024-04-02
  • HTML+CSS+JavaScript创建一个简单的井字游戏
    目录实现 HTML添加 CSS实现 Javascript 部分演示地址 实现 HTML 首先在 head 部分,我将包含我们稍后创建的 css 和 javascript 文件。我还...
    99+
    2024-04-02
  • 教你用Python实现一个轮盘抽奖小游戏
    目录一、Python GUI 编程简介二、流行GUI框架总结三、代码演示四、界面一、Python GUI 编程简介 Tkinter 模块(Tk 接口)是 Python 的标准 Tk ...
    99+
    2024-04-02
  • 一步步教你使用JavaScript打造一个扫雷游戏
    目录前言一、思路分析二、静态页面搭建2.1 结构层2.2 样式层三、js页面交互3.1 获取元素及变量初始化3.2 10个雷的初始化设置3.3 游戏开始事件封装3.4 核心事件函数封...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作