文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

怎么在微信小程序实现一个幸运转盘小游戏

2023-06-14 11:06

关注

这篇文章将为大家详细讲解有关怎么在微信小程序实现一个幸运转盘小游戏,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。

效果图

怎么在微信小程序实现一个幸运转盘小游戏

小程序开发思路

开发思路有三部分,第一部分是用css绘制转盘背景,第二部分是利用 wxs 语法实现响应式样式 ,第三部分是小程序内置动画api实现转盘的转动以及通过js转动随机性的实现。

本人主要介绍编写思路,下面就开始我的讲解。

如何画一个三角形

一开始,要写一个基础的 wxml 框架。

<view class="turntable">  <view class="wrapper">    <view class="item" >  <view class="item-inner"><text>10分</text>  </view></view>  </view></view>

我画了两个大小相同的长方形,长和宽分别是300rpx和600rpx,利用 position css属性,让两个长方形合并在一起。

.turntable {  display: block;  width: 100%;  height: 600rpx;}.turntable .wrapper{  position: relative;  transform-origin: center;  width: 100%;  height: 600rpx;}

怎么在微信小程序实现一个幸运转盘小游戏

合并之后我需要将两个长方体分离出来,把红色长方体变成半圆形,蓝色长方体顺时摆动60度,红色长方体逆时摆动30度,为什么要这样转,因为蓝色本来随红色逆时摆动30度,而一个三角形内角为60度,为了形成这60度的夹角,我需要红色摆完之后再将蓝色顺时移动60度,也就这样形成60度夹角。

.turntable .wrapper .item {  position: absolute;  left: 50%;  width: 300rpx;  height: 600rpx;  border-radius: 0px 300rpx 300rpx 0;  transform-origin: left center;  transform: rotate(-30deg);}.turntable .wrapper .item .item-inner {  text-align: center;  width: 300rpx;  height: 600rpx;  transform: translateX(-300rpx) rotate(60deg);   transform-origin: right center;  border-radius: 300rpx 0 0 300rpx;  font-size: 32rpx;}

怎么在微信小程序实现一个幸运转盘小游戏

接下来关键一步在 item 处增加  overflow: hidden 属性,一个三角形就出来了,并调整字体的位置。

.turntable .wrapper .item {  position: absolute;  left: 50%;  width: 300rpx;  height: 600rpx;  border-radius: 0px 300rpx 300rpx 0;  overflow: hidden;  transform-origin: left center;}.turntable .wrapper .item .item-inner text {  display: block;  transform-origin: center;  transform: translateY(100rpx) translateX(43rpx) rotate(-30deg);}

怎么在微信小程序实现一个幸运转盘小游戏

一个三角形画出来后,将6个同等大小的三角形并让他们可以拼接在一起组合成一个圆盘,只需各自修改三角的旋转角度即可。

.turntable .wrapper .item:nth-child(1) {  transform: rotate(-30deg);}.turntable .wrapper .item:nth-child(2) {  transform: rotate(-90deg);}.turntable .wrapper .item:nth-child(3) {  transform: rotate(-150deg);}.turntable .wrapper .item:nth-child(4) {  transform: rotate(-210deg);}.turntable .wrapper .item:nth-child(5) {  transform: rotate(-270deg);}.turntable .wrapper .item:nth-child(6) {  transform: rotate(-330deg);}

实现响应式样式

为了更好的适应不同业务需求,我把转盘的样式变成响应式,就可以轻松根据用外部传入的 prize 数据的长度来设置不同的样式,我把这一步的判断,放在 wxs 模块那里。

<wxs module="computed">var rotate = function (index, length) {var inital = - (360 / length / 2)var averageRotate = 360 / lengthvar deg = inital - averageRotate * indexreturn 'transform: rotate(' + deg + 'deg);'}var inner = function (length) {var averageRotate = 360 / lengthreturn 'transform: translateX(-300rpx) rotate(' + averageRotate + 'deg);'}var text = function (length) {var distance = 0var rotate = 0switch (length) {case 6:distance = 43rotate = 30breakcase 8:distance = 72rotate = 30breakcase 4:distance = -20rotate = 40break}return 'transform: translateY(100rpx) translateX(' + distance + 'rpx) rotate(-45deg);'}module.exports = {rotate: rotate,inner: inner,text: text}</wxs>

动画系统和中奖系统

通过设定好的中奖率,以一个圆为360度来计算,得出一个0-360的中奖范围,将随机得来的数判断属于哪个区间值,用区间值 reward 来决定圆盘所需转动的角度。思路大概就是这样,下面开始讲解主要的思路。

圆盘要转的角度 = reward * 一个圆分成6块的平均值  + 3 * 360

首先要设置好6个奖品区的中奖率winning,该中奖率要相加起来为1,把初始化的数据组合成一个6位数的数组从组件外传入进组件内。

prize: [{        'name': '1分',        'winnning': 0.2,        'count': 1      },      {        'name': '谢谢参与',        'winnning': 0.5,        'count': 0      }, {        'name': '5分',        'winnning': 0.05,        'count': 5      }, {        'name': '7分',        'winnning': 0.05,        'count': 7      },       {        'name': '3分',        'winnning': 0.1,        'count': 3      },       {        'name': '4分',        'winnning': 0.1,        'count': 4      }    ],

以一个圆为360度来计算出0-360的中奖取值范围。

getRange(winning) {   let temp = []     winning.forEach((item, index) => {       if (index === 0) {         temp.push(item['winnning'] * 360)       } else {         temp.push(parseInt(temp.slice(-1)) + item['winnning'] * 360)       }      })      return temp    },

生成一个随机整数,当然这数要在0-360,不然超出360或小于0是没有意义的。

let random = Math.round(Math.random() * 360)

获得随机数之后,判断在哪个奖品范围内并把在对应的区间值赋予响应数reward 内。

for (let i in winningRange) {    let currentwinning = winningRange[i] // 当前取值       if (random < currentwinning) {          this.setData({            reward: i          })          break      } else {        if (i == 0) {           continue        }        if (random >= winningRange[i - 1] && random <= currentwinning) {           this.setData({              reward: i           })           break       }     }}

把点击开始的主函数放在onPoint()内,函数开始时需判断是否仍有抽奖机会以及防止在执行动画又点击函数执行动画,经过计算得来所需的角度通过微信小程序的动画api animation 来让圆盘实现转动,动画结束后把中奖信息通过自定义组件触发事件来让组件外监听到。

onPoint() {      // 平均值      const averageRotate = 360 / this.properties.prize.length      // 是否有抽奖机会      if (this.properties.chance === 0) {        this.triggerEvent('none')        return      }      // 防止转动时点击开始按钮      if (!this.data.onRotation) {        this.setData({          onRotation: true        })        this.getReward()        let deg = this.data.reward * averageRotate + 3 * 360  // 至少3圈以上        this.animate('.wrapper', [{            rotate: 0,            ease: 'ease-in-out'          },          {            rotate: deg,            ease: 'ease-in-out'          }        ], 5000, function () {          this.setData({            onRotation: false          })          // 发送自己的抽奖信息          this.triggerEvent('onResult', this.properties.prize[this.data.reward])        }.bind(this))      }    },

最后别忘了在每次执行动画前,都要先执行动画重置动作,才能保证动画下次转到正确的角度。当然我把其放在一个函数里面,以便组件外也可以使用该函数。

onClear(){   this.clearAnimation('.wrapper')

关于“怎么在微信小程序实现一个幸运转盘小游戏”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,使各位可以学到更多知识,如果觉得文章不错,请把它分享出去让更多的人看到。

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯