这类活动你确定见过数组
关于转盘类型的活动我相信你们多多少少都接触到了,不少的抽奖界面都是这类型的,今天这篇小文章就简单的总结一下咱们游戏中须要实现这样一个效果的时候咱们该怎样去作,其实只要是Cocos类型的,不论是C++的仍是JS仍是Lua他们之间的道理是相同的,相似于下面这样图的效果:dom
其实这类型的活动效果无非就分下面两种:模块化
一、指针转动动画
二、底盘转动指针
但其实这两点在实现方面是彻底同样的,咱们须要控制的只是那个控件在咱们设置的条件下转动。 blog
代码须要注意的点游戏
一、咱们不能让指针中止在两个区域之间的线上get
二、每每结束转动以后咱们仍是须要作不少操做的,该怎么写it
三、最简单的写法io
针对上面三点咱们也简单的说说:
一、不能让中止在两个区域之间的线上咱们就得设置一个最小的偏移量,保证不让中止在这个偏移量以内
二、咱们利用cc.Sequence
三、最简单的方式就是让每一个抽奖区域模块化,咱们只须要告诉咱们封装的转动的代码,你须要中止在哪一个位置
核心代码
下面的区域就是咱们设置的区块,由于活动中奖几率这种通常都是后台设置好几率计算好中奖结果以后给你数据,你只须要展现一个效果就行,由于这个几率是须要后台配置改变的,不会让移动端把这些写死的,就像不少人玩的王者荣耀同样,其实在点击了抽奖尚未执行抽奖动画以前其实你仔细看看都已经知道本身中了什么了,仔细看你的钻石或者金币刷新就知道了!
-- 开始抽奖 -- 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) ))
最后,这是核心代码,里面的东西都加了注释的,还有里面几个角度的点须要注意一下的,这个仔细看看就能理解!