推薦閱讀:
一。前言
在前面給大家分享了大轉盤的抽獎方式,這是現在游戲使用較多的一種抽獎方式,今天給大家介紹另一抽獎方式——水果機,這是以前街機游戲使用較多的抽獎方式。該方式使用選中獎品的方式來進行抽獎。
二。算法講解
先聲明幾個變量來控制選項依次選中的轉動效果,可在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;
},