【游戏客户端】实现转盘活动
今天和大家分享一下,如何实现类似抽王者水晶以及csdn抽奖的转盘活动。
王者水晶抽奖示例:
我们可以看到,王者在十连的时候,每一个击中都会有停顿并且闪烁三次。
其实不管是十连抽还是单抽,其算法逻辑都是一样,下面我们直接上干货:
因为我们是使用cocos引擎实现,所以对于每个奖励的位置,我们可以通过cocoStdio来进行摆放
我们摆放好了位置之后,把导出的json文件加载进项目之中,我们就可以轻易的读取到响应奖励摆放的信息了。
当他们平常的时候是蓝色,在转和选中的时候就给它置为黄色
for i = 1, 10 do
local des = "pnlGoods"..i -- 1-10的pnl
local item = self.pnlReward:getChildByName(des)
table.insert(self.items, item)
des = "lbl"..i -- 每个道具的数字文本
local lbl = item:getChildByName(des)
table.insert(self.lbls, lbl)
des = "imgGet"
local img = item:getChildByName(des) -- 黄色状态
table.insert(self.imgs, img)
end
实现转动的效果很简单,我们只需要用一个定时器去执行一个转动函数,转动函数里面记录了当前转到的位置,并把该位置的图片置为选中(黄色)状态,以及把当前位置的前一位置重新变回蓝色,递归调用,等转到想要的位置就停下来,就可以实现转动效果了。但是问题来了,如何实现速度从快到慢呢?说来也简单,我们只需要给这个转动函数设置一个运行时间参数,当递归调用时把下一次执行的时间传过去就可以了。
-- 单抽
function DrawScene:drawOne(sender, eventType)
if eventType == ccui.TouchEventType.ended then
self:onClick(sender)
self:clean()
local num = math.random(10) -- 随机选一个抽到的位置
self.num = num
self.curNum = 1 -- 当前的位置
self.sumNum = 1 -- 总共转动的次数
self.effHandler = scheduler.scheduleGlobal(handler(self, self.runOneAct), 0.06)
end
end
function DrawScene:runOneAct(time)
scheduler.unscheduleGlobal(self.effHandler) -- 先把之前的计时器释放掉
-- 不然速度不会变化
local lastNum = self.curNum
self.curNum = self.curNum + 1
self.sumNum = self.sumNum + 1
if (self.curNum > 10) then -- 我们的总数是十个,转完10个后就从1开始
self.curNum = 1
end
if(self.sumNum <= 10 * 2 + self.num) then
local nextTime = 0.05 -- 我这里设置先转两圈,然后再在相应的位置停下
if self.sumNum > 2 * 10 then
nextTime = 0.05 -- 前两圈的速度是0.1秒,最后一圈加速0.05秒
else
nextTime = 0.1
end
self.imgs[self.curNum]:setVisible(true) -- 当前的位置变黄
self.imgs[lastNum]:setVisible(false) -- 前一个位置变回蓝
self.effHandler = scheduler.scheduleGlobal(handler(self, self.runOneAct), nextTime)
return
end
end
至于十连抽的效果也很简单,我们只需要在单抽的条件下,用一个数组存储击中的目标,然后执行多遍单抽的逻辑就可以了。