推荐阅读:

一。前言

      在前面给大家分享了大转盘的抽奖方式,这是现在游戏使用较多的一种抽奖方式,今天给大家介绍另一抽奖方式——水果机,这是以前街机游戏使用较多的抽奖方式。该方式使用选中奖品的方式来进行抽奖。

二。算法讲解

先声明几个变量来控制选项依次选中的转动效果,可在properties里面声明,以方便调试时修改数值:

		//最大速度
maxSpeed: {
default: 20,
type: cc.Float,
max: 30,
min: 1,
},
//减速时间==加速时间
duration: {
default: 2,
type: cc.Float,
max: 10,
min: 1,
},
//加速度
acc: {
default: 8,
type: cc.Float,
max: 10,
min: 1,
},
gearNum: {
default: 10,
type: cc.Integer,
max: 10,
min: 1,
},

不需要经常修改的变量,声明在onLoad中:

this.wheelState = 0;      //转盘状态  1--加速  2--减速   0--静止
this.curSpeed = 0; //当前速度
this.spinTime = 0; //减速前旋转时间
this.firstAngle = 30; //每个奖品的中间角度
this.gearAngle = 60; //每个奖品的角度
this.finalAngle = 0; //最终结果指定的角度
this.decAngle = 3 * 360;//减速旋转三周

抽奖转动状态设置为3个阶段,0(未转动),1(加速阶段),2(减速状态)。在加速状态时,通过判断转动速度是否达到最大速度来判断下一阶段是继续加速还是开始减速。在减速阶段,通过判断减速阶段需要转动的角度是否等于减速阶段已经转过的角度,从而判断转动是否结束。

三。功能实现

1.加速阶段

		if (self.wheelState == 1)
{
self.spinTime += dt;//加速阶段的时间累计
self.uiRoot.startAward.rotation += self.curSpeed;//每帧后旋转的角度
this.showIndexLight(self.uiRoot.startAward.rotation);//显示指针到达区域的奖品的外发光 if (self.curSpeed <= self.maxSpeed) {
self.curSpeed += self.acc;//修改下一帧速度
} else {
if (self.spinTime < self.duration) {//判断时间是否到
return;
}
//设置目标值
self.finalAngle = self.targetID * self.gearAngle + self.firstAngle;//指针最后停留的位置
self.maxSpeed = self.curSpeed;//当前速度未转动过程中的最大速度
self.wheelState = 2;
}
}

2.减速阶段

		 else if (self.wheelState == 2)
{
var curRo = self.uiRoot.startAward.rotation;
var hadRo = curRo - self.finalAngle;//减速阶段已经转过的角度
self.curSpeed = self.maxSpeed * ((self.decAngle - hadRo) / self.decAngle) + 0.2;//后面加一个数是使指针最后能停下来
self.uiRoot.startAward.rotation += self.curSpeed;
this.showIndexLight(self.uiRoot.startAward.rotation); if ((self.decAngle - hadRo) <= 0) {//判断是否转完
self.wheelState = 0;
self.uiRoot.startAward.rotation = self.finalAngle;
this.showIndexLight(self.uiRoot.startAward.rotation);
//大转盘结束后的一些列操作,根据实际情况需要增加删除
self.ctrolWheelItem(true);
self.uiRoot.close.active = true;
self.uiRoot.startBtn.active = true;
self.uiRoot.close.active = true;
self.uiRoot.sign.interactable = true;
self.uiRoot.wheel.interactable = true;
for (let i = 0; i < self.uiRoot.wheelBg.childrenCount; i++) {
cc.find("item" + i, self.uiRoot.wheelBg).getComponent(cc.Button).interactable = true;
} var data = cls.WheelLayer._srvData.SC_Wheel_Info;
let info = gm.GameData.getBagDataById(data.award[this.targetID].id); self.showRewardBox(data.award[this.targetID].id, info.Icon, data.award[this.targetID].num); console.log("抽奖操作结束,需要同步奖励奖励数据,暂时不知道同步到哪里去");
}

同步指针指到的奖品区域外发光

    //显示指针到达的区域发光
showIndexLight(rot) {
var index = parseInt(rot / 60) % 6;/60代表每个奖品格子的角度,6代表一共6个格式
for (let i = 0; i < this.wheelLight.length; i++) {
this.wheelLight[i].active = false;
}
this.wheelLight[index].active = true;
},

最新文章

  1. ASP.NET MVC 静态资源打包和压缩问题小记
  2. user-select : 保护版权内容的简单方案
  3. Java初学(五)
  4. iOS 面试题及答案
  5. android ant 多渠道批量打包
  6. sql server 小记——分区表
  7. [转载]C#对象序列化与反序列化
  8. MySQL innotop实时监测工具
  9. ReactJs入门思路
  10. Js的两种post方式
  11. Golang:使用 httprouter 构建 API 服务器
  12. 自用lca模板
  13. RTMPdump(libRTMP) 源代码分析 8: 发送消息(Message)
  14. Head First Python-python面向对象
  15. Eclipse中创建一个新的SpringBoot项目
  16. 同步工具:CountDownLatch、CyclicBarrier和Semaphore
  17. (5) 电商场景下的常见业务SQL处理
  18. MMIO----Wav格式文件解析
  19. 转:CRF++
  20. 说说java

热门文章

  1. JedisClient操作redis 单机版和集群版
  2. C#编程之IList、List和ArrayList
  3. python初步编写用户登录
  4. python中的元类(metaclass)
  5. 必懂的wenpack优化
  6. 没事别想不开做Halcon视觉工程师 halcon机器视觉如何学习?
  7. vue教程二 vue组件(2)
  8. 洛谷 P3811 题解
  9. 从三个语言(C++,Java,.Net)的几个性能测试案例来看性能优化
  10. poj 1050 To the Max(最大子矩阵之和)