-- <* -- @Author: Saber -- @Description: 藏宝图系统:高级藏宝图抽奖界面 -- *> TreasureMapAdvanceRollView = TreasureMapAdvanceRollView or BaseClass(BaseView) local TreasureMapAdvanceRollView = TreasureMapAdvanceRollView local cos = math.cos local sin = math.sin local rad = math.rad local deg = math.deg local Quaternion = Quaternion local TweenFunc = TweenFunc local ClampAngleType2 = ClampAngleType2 function TreasureMapAdvanceRollView:__init() self.base_file = "treasureMap" self.layout_file = "TreasureMapAdvanceRollView" self.layer_name = "UI" self.destroy_imm = true self.use_background = true --全屏界面默认使用这个参数,非全屏界面自行设置 self.hide_maincancas = false --全屏界面需要隐藏主UI self.change_scene_close = true --是否切换场景时关闭(弹出界面使用) self.auto_close_time = 10 self.model = TreasureMapModel:getInstance() self.item_pos_radius = 190 -- 抽奖节点分布在容器内的分布半径 self.roll_item_list = {} self.load_callback = function () self:LoadSuccess() self:AddEvent() end self.open_callback = function ( ) self:UpdateView() end self.destroy_callback = function ( ) self:DestroySuccess() self.model._tm_can_fly_goods = true -- 解除道具飞入表现限制 end end function TreasureMapAdvanceRollView:Open(vo) self.result_data = vo BaseView.Open(self) end function TreasureMapAdvanceRollView:LoadSuccess() local nodes = { "adv_role:raw", "bg:raw", -- 背景图相关 "item_con", -- 奖励节点 "selected:obj", "close_btn:obj", "pro_fill:img", "feedback_btn:obj", "feedback_red:obj", "pin", "roll_btn:obj:img", "roll_btn/roll_btn_lb:tmp", "preview_btn:obj", "tip_bg:obj", "tip_lb:tmp", } self:GetChildren(nodes) -- 暂时屏蔽再次使用高级藏宝图的按钮 self.roll_btn_img.raycastTarget = false -- 加载背景图 lua_resM:setOutsideRawImage(self, self.adv_role_raw, GameResPath.GetRoleBg("tm_adv_role_336_608"), false) lua_resM:setOutsideRawImage(self, self.bg_raw, GameResPath.GetViewBigBg("tm_adv_bg"), false) end function TreasureMapAdvanceRollView:AddEvent() local function click_event(target) if target == self.close_btn_obj then -- 关闭界面 self.model._check_tm_tips = TreasureMapConst.Advance self:Close() elseif target == self.roll_btn_obj then -- 再次摇奖(重新开始高级藏宝图寻宝) self:OnRollBtnClicked() elseif target == self.preview_btn_obj then -- 查看奖励预览 self.model:Fire(TreasureMapConst.OPEN_REWARD_PERVIEW_VIEW, true, TreasureMapConst.Advance) elseif target == self.feedback_btn_obj then -- 查看遗宝界面(月度次数奖励) self.model:Fire(TreasureMapConst.OPEN_FEEDBACK_VIEW, true) end end AddClickEvent(self.close_btn_obj, click_event) AddClickEvent(self.roll_btn_obj, click_event) AddClickEvent(self.preview_btn_obj, click_event) AddClickEvent(self.feedback_btn_obj, click_event) local function updateFeedbackRed(red_type) if red_type and red_type == TreasureMapConst.RedType.MonthReward then self:UpdateFeedbackRed() end end self:BindEvent(self.model, TreasureMapConst.UPDATE_TREASUREMAP_RED, updateFeedbackRed) local function updateMonthTimesData() self:UpdateMonthTimesData() end self:BindEvent(self.model, TreasureMapConst.UPDATE_MONTH_TIMES_DATA, updateMonthTimesData) end function TreasureMapAdvanceRollView:UpdateView() self:UpdateMonthTimesData() self:UpdateRewardItems() self:StartRollItemAnim() self:UpdateFeedbackRed() end -- 更新界面基础数据 function TreasureMapAdvanceRollView:UpdateMonthTimesData( ) -- 更新遗宝进度 local momth_times_data = self.model:GetAdvTreasureMapMonthTimesData() local month_times_reward_cfg = self.model:GetTreasureMapMonthTimesRewardCfg() local percentage = 0 if momth_times_data and month_times_reward_cfg then local times = momth_times_data.times local cfg_num = #month_times_reward_cfg local v = nil for k = 1, cfg_num do v = month_times_reward_cfg[k] -- 满足了本次的领取条件但 未领取,或者超过了最高档位所需次数 if v[1] <= times and (not momth_times_data.receive_list[v[1]] or k == cfg_num) then percentage = 1 break end if v[1] > times then -- 这个档位的次数都没有满足,就获取百分比 percentage = times / v[1] break end end end self.pro_fill_img.fillAmount = percentage self:FeedbackBtnAction(percentage >= 1) end function TreasureMapAdvanceRollView:FeedbackBtnAction(show) cc.ActionManager:getInstance():removeAllActionsFromTarget(self.feedback_btn) if show then local action1 = cc.ScaleTo.New(0.3, 0.95, 0.95, 0.95) local action2 = cc.ScaleTo.New(0.3, 1.05, 1.05, 1.05) local action = cc.RepeatForever.New(cc.Sequence.New(action1, action2)) cc.ActionManager:getInstance():addAction(action, self.feedback_btn) else SetLocalScale(self.feedback_btn, 1, 1, 1) end end -- 创建奖励道具 function TreasureMapAdvanceRollView:UpdateRewardItems( ) self.reward_item_data = self.model:GetRollRewardItemData(self.result_data) -- self.target_index = target_index local item_num = TableSize(self.reward_item_data) local angle_offset = 360 / item_num local start_angle = 90 - angle_offset/2 local rad_start_angle local item for k, v in ipairs(self.reward_item_data) do item = self.roll_item_list[k] if not item then item = UIObjPool:getInstance():PopItem(UIObjPool.UIType.AwardItem, self.item_con) item:SetItemSize(78, 78) self.roll_item_list[k] = item end item:SetVisible(true) rad_start_angle = rad(start_angle) -- 坐标设置:y正向为起点顺时针分布 item:SetAnchoredPosition(self.item_pos_radius * cos(rad_start_angle) + 280 - 39, self.item_pos_radius * sin(rad_start_angle) - 280 + 39) local reward_data = stringtotable(v.rewards)[1] local typeId, lock = GoodsModel:getInstance():GetMappingTypeId(reward_data[1], reward_data[2]) item:SetData(typeId, reward_data[3], nil, nil, lock) item._angle = start_angle -- 变换角度 start_angle = ClampAngleType2(start_angle - angle_offset) end end -- 开始抽奖动画 function TreasureMapAdvanceRollView:StartRollItemAnim() cc.ActionManager:getInstance():removeAllActionsFromTarget(self.pin) local angel = self:AnimRotateAngle() local anim_end_fun = function() self.is_animating = false self.selected_obj:SetActive(true) local selected_angel = math.ceil(angel / 36) * 36 self.selected.localRotation = Quaternion.Euler(0, 0, selected_angel) self:ShowGetReward() self:AutoCloseTimer() -- self.roll_btn_lb_tmp.text = "再次寻宝" end local start_angel = self.pin.localEulerAngles.z start_angel = ClampAngleType2(start_angel) self.selected_obj:SetActive(false) -- local selected_angel = self.selected.localEulerAngles.z -- 播放动画 local pin_action_callback = function(percent) local ratio = self:AnimPercentageAmount(percent) local temp_angle = angel * ratio local temp_angle2 = start_angel * (1-ratio) self.pin.localRotation = Quaternion.Euler(0, 0, temp_angle2 + temp_angle) -- 更新选中节点的旋转角度 -- local temp_spin_angel = ClampAngleType2(temp_angle2 + temp_angle) -- temp_spin_angel = math.ceil(temp_spin_angel / 36) * 36 -- if temp_spin_angel ~= selected_angel then -- selected_angel = temp_spin_angel -- self.selected.localRotation = Quaternion.Euler(0, 0, selected_angel) -- end end local anim_time = self.model:GetTreasureMapKvCfg("advanced_map_speed").value local spin_action = cc.CustomUpdate.New(anim_time, pin_action_callback) spin_action = cc.Sequence.New(spin_action, cc.CallFunc.New(anim_end_fun)) cc.ActionManager:getInstance():addAction(spin_action, self.pin) -- 修改文本 self.roll_btn_lb_tmp.text = "挖宝中..." self.is_animating = true -- 清掉藏宝图数据 self.model:SetCurrentTreasureData(nil) end function TreasureMapAdvanceRollView:AnimPercentageAmount(ratio) local div = TreasureMapConst.SpeedUpRatio if ratio < div then return div * TweenFunc.easeInQuint(ratio/div) else return (1-div) * TweenFunc.easeOutQuint((ratio-div)/(1-div)) + div end end -- 获取抽中道具所在的角度,并推算出一个n圈的终点角度 function TreasureMapAdvanceRollView:AnimRotateAngle() local target_angle self.target_index = 1 for k, v in ipairs(self.roll_item_list) do if self.reward_item_data[k].reward_id == self.result_data.reward_id then -- 获取抽中档位所在的节点的角度,并做一个减少90度的偏移,求得旋转指针最后的角度 self.target_index = k target_angle = v._angle - 90 break end end -- print("Saber:TreasureMapAdvanceRollView [204] self.target_index: ",self.target_index) target_angle = target_angle + math.random(-15, 15) -- 在节点范围内进行一个合理的偏移 -- 起始角度必须先将指针的角度归零 -- 默认转10圈,然后停在目标角度范围内 local angle = TreasureMapConst.AnimRollTime * -360 + target_angle return angle end -- 展示获得道具的表现 function TreasureMapAdvanceRollView:ShowGetReward( ) --触发快捷使用 OperateActivityModel:getInstance():Fire(OperateActivityModel.QUIK_USE, true) --道具飞背包 local goods_data = stringtotable(self.reward_item_data[self.target_index].rewards)[1] local goods_Id, lock = GoodsModel:getInstance():GetMappingTypeId(goods_data[1] , goods_data[2]) local goods_fly_data = {[1] = goods_Id} if TableSize(goods_fly_data) > 0 then MainUIModel:getInstance():PlayGoodsFlyList(goods_fly_data) end --飘字 local goods_fly_data = { [1] = { goods_type_id = goods_Id, num = goods_data[3], } } if TableSize(goods_fly_data) > 0 then MainUIModel:getInstance():AddFloatInfo(goods_fly_data, true) end end function TreasureMapAdvanceRollView:UpdateFeedbackRed( ) self.feedback_red_obj:SetActive(self.model:GetTreasureMapRed(TreasureMapConst.RedType.MonthReward)) end function TreasureMapAdvanceRollView:AutoCloseTimer( ) local end_time = TimeUtil:getServerTime() + self.auto_close_time local function auto_close_time_func() local left_time = end_time - TimeUtil:getServerTime() if left_time > 0 then self.roll_btn_lb_tmp.text = string.format("%s 秒后自动关闭", left_time) else self.model._check_tm_tips = TreasureMapConst.Advance self:Close() end end auto_close_time_func() self:ClearAutoCloseTimer() self.auto_close_time_func_id = GlobalTimerQuest:AddPeriodQuest(auto_close_time_func, 0.5, -1) end function TreasureMapAdvanceRollView:ClearAutoCloseTimer( ) if self.auto_close_time_func_id then GlobalTimerQuest:CancelQuest(self.auto_close_time_func_id) self.auto_close_time_func_id = nil end end -- 再次摇奖按钮 function TreasureMapAdvanceRollView:OnRollBtnClicked( ) if self.is_animating then Message.show("挖宝中...", "fault") return end local goods_id = TreasureMapConst.GoodId[TreasureMapConst.Advance] local left_goods_num = GoodsModel:getInstance():GetTypeGoodsNum(goods_id) if left_goods_num <= 0 then -- 提示购买高级藏宝图 self.model:BuyTreasureMapItemFunc(TreasureMapConst.Advance) -- ShopModel:getInstance():Fire(ShopModel.OPEN_SHOP_BUY_TIP_VIEW, goods_id, 1) else local function ok( ... ) self.model._check_tm_tips = false self:Close() self.model:Fire(TreasureMapConst.REQUEST_CCMD_EVENT, 42401, TreasureMapConst.Advance) end local ask_str = "是否再次进行高级寻宝?" Alert.show(ask_str,Alert.Type.Two,ok,nil,"确定","取消") end end function TreasureMapAdvanceRollView:DestroySuccess( ) cc.ActionManager:getInstance():removeAllActionsFromTarget(self.feedback_btn) if self.is_animating then self:ShowGetReward() end cc.ActionManager:getInstance():addAction(spin_action, self.pin) for k, v in pairs(self.roll_item_list) do UIObjPool:getInstance():PushItem(UIObjPool.UIType.AwardItem, v) end self:ClearAutoCloseTimer() self.roll_item_list = nil self.model:CheckTreasureTipUseViewOpen() end