這類活動你確定見過數組
關於轉盤類型的活動我相信你們多多少少都接觸到了,不少的抽獎界面都是這類型的,今天這篇小文章就簡單的總結一下咱們遊戲中須要實現這樣一個效果的時候咱們該怎樣去作,其實只要是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) ))
最後,這是核心代碼,裏面的東西都加了註釋的,還有裏面幾個角度的點須要注意一下的,這個仔細看看就能理解!