关于转盘类型的活动我相信大家多多少少都接触到了,很多的抽奖界面都是这类型的,今天这篇小文章就简单的总结一下我们游戏中需要实现这样一个效果的时候我们该怎样去做,其实只要是Cocos类型的,不管是C++的还是JS还是Lua他们之间的道理是相同的,类似于下面这样图的效果:
其实这类型的活动效果无非就分下面两种:
1、指针转动
2、底盘转动
但其实这两点在实现方面是完全一样的,我们需要控制的只是那个控件在我们设置的条件下转动。
代码需要注意的点
1、我们不能让指针停止在两个区域之间的线上
2、往往结束转动之后我们还是需要做很多操作的,该怎么写
3、最简单的写法
针对上面三点我们也简单的说说:
1、不能让停止在两个区域之间的线上我们就得设置一个最小的偏移量,保证不让停止在这个偏移量之内
2、我们利用cc.Sequence
3、最简单的方式就是让每个抽奖区域模块化,我们只需要告诉我们封装的转动的代码,你需要停止在哪个位置
核心代码
下面的区域就是我们设置的区块,因为活动中奖概率这种一般都是后台设置好概率计算好中奖结果之后给你数据,你只需要展示一个效果就行,因为这个概率是需要后台配置改变的,不会让移动端把这些写死的,就像很多人玩的王者荣耀一样,其实在点击了抽奖还没有执行抽奖动画之前其实你仔细看看都已经知道自己中了什么了,仔细看你的钻石或者金币刷新就知道了!
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
-- 开始抽奖
-- stopId 中间区域
-- sprRound 转到的指针
function ActitvityItem2:onStartDrawALotteryOrRaffle(sprRound,stopId)
if
GlobalUserItem.bSoundAble then
self.music= AudioEngine.playEffect(cc.FileUtils:getInstance():fullPathForFilename(
"sound/ZPZD.wav"
),
true
)
end
-- ExternalFun.playClickMusic(
"ZPZD"
)
--转盘总奖项数
local totalCount = 8
--转动最小圈数
local roundCountMin = 8
--转动最大圈数
local roundCountMax = 14
--所有奖项概率相同时 这样计算每个奖项占的角度 如果概率不同,可以使用table数组来处理
local singleAngle = 360/totalCount
--为了避免不必要的麻烦,在接近2个奖项的交界处,左右偏移n角度的位置,统统不停留 否则停在交界线上,这个值必须小于最小奖项所占角度的1/2
local offsetAngle = 10
--转盘停止位置的最小角度 不同概率时,直接把之前的项相加即可
local angleMin = (stopId-1) * singleAngle
--转盘转动圈数 目前随机 正常情况下可加入力量元素 根据 移动距离*参数 计算转动圈数
local roundCount = math.random(roundCountMin, roundCountMax)
--检查一下跳过角度是否合法 当前奖项角度-2*跳过角度 结果必须>0
--转动角度
local angleTotal = 360*roundCount + angleMin + math.random(offsetAngle, singleAngle-offsetAngle)
-- print(
'stopId:'
..stopId)
-- print(
'angleMin:'
..angleMin)
-- print(
'roundCount:'
..roundCount)
-- print(
'angleTotal:'
..angleTotal)
--复位转盘
sprRound:setRotation(0)
--开始旋转动作使用EaseExponentialOut(迅速加速,然后慢慢减速)
sprRound:runAction(cc.Sequence:create(
cc.EaseExponentialInOut:create(cc.RotateBy:create(4.0, angleTotal)),
cc.CallFunc:create(function()
self:onEndAction(stopId)
end)
))
最后,这是核心代码,里面的东西都加了注释的,还有里面几个角度的点需要注意一下的,这个仔细看看就能理解!