-- <* -- @Author: Saber -- @Description: 招财猫活动主界面 -- *> FortuneCatMainView = FortuneCatMainView or BaseClass(BaseView) local FortuneCatMainView = FortuneCatMainView 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 FortuneCatMainView:__init() self.base_file = "fortuneCat" self.layout_file = "FortuneCatMainView" self.layer_name = "UI" self.destroy_imm = true self.use_background = true --全屏界面默认使用这个参数,非全屏界面自行设置 self.blur_activity_bg = false self.use_show_anim = true self.use_hide_anim = true self.hide_maincancas = false self:AddPreLoadList("fortuneCat", {"FortuneCatRecordItem"}) self.need_refresh_roll_item = false -- 是否需要等待33219协议刷新 self.can_roll = false -- 是否可以抽奖 self.recharge_cost = nil -- 本次抽奖的扣除多少彩钻 self.recharge_condi = nil -- 本次抽奖的累充需求 self.item_pos_radius = 190 -- 抽奖节点分布在容器内的分布半径 self.roll_item_list = {} -- 抽奖节点列表 self.record_item_list = {} -- 抽奖记录节点列表 self.in_rolling_anim = false -- 是否正在抽奖动画中 self.roll_btn_has_effect = false -- 抽奖按钮是否已经有特效了 self.temp_target_id = nil -- 用于在抽取过程中关闭界面直接弹出获奖信息 self.temp_roll_cost = nil -- 缓存本次抽奖的花费 self.tab_index = 1 -- 默认显示全服记录 self.has_update_record = false -- 是否已经更新了一次招财记录 self.model = FortuneCatModel:getInstance() self.model._is_fc_view_open = true self.skip_anim = self.model._skip_anim_cache -- 是否跳过动画缓存 self.ca_model = CustomActivityModel:getInstance() self.open_guide_close = true self.load_callback = function () self:LoadSuccess() self:AddEvent() self.model:ShutDownFcLoginRed(self.sub_type) self.model:Fire(FortuneCatModel.REQUEST_CCMD_EVENT, 33220, self.base_type, self.sub_type) self.model:Fire(FortuneCatModel.REQUEST_CCMD_EVENT, 33222, self.base_type, self.sub_type) end self.open_callback = function ( ) self:UpdateView() self:StartLightAnim() end self.destroy_callback = function ( ) self:DestroySuccess() -- 抽奖过程中关闭界面直接弹出结果 if self.in_rolling_anim then self.model:ShowDrawRewardEffect(self.fc_cfg, self.temp_target_id, self.temp_roll_cost) end self.model._skip_anim_cache = self.skip_anim self.model._is_fc_view_open = false end end -- 定制活动子类型 function FortuneCatMainView:Open(sub_type) self.base_type = CustomActivityModel.CustomActBaseType.FORTUNE_CAT self.sub_type = sub_type BaseView.Open(self) end function FortuneCatMainView:LoadSuccess() local nodes = { "bg:raw", "close_btn:obj", "money_node", "bg/spin_selected:obj", "skip_anim_tog:obj:tog", -- 跳过动画tog "ad_img2:obj", -- 广告词2,需要根据条件拉伸 "ad_img3:obj", "ad_img4:obj", "ad_img4/ad_tip4:tmp", "light_con_r", "light_con_y", -- 闪光容器 -- 抽奖记录容器 "record_scroll", "record_scroll/Viewport/record_con", "no_record:tmp", -- 招财按钮相关 "roll_btn:obj:img", "roll_btn/roll_btn_effect", "roll_btn/roll_spin", "roll_btn/cost_icon:obj:img", "roll_btn/btn_lb1:tmp", "roll_btn/roll_cost:tmp", "roll_btn/roll_finished:tmp", -- 奖品节点 "item_con", -- 招财记录tab "record_tab1:obj:img", "record_tab2:obj:img", "record_tab1/record_tab1_lb:tmp", "record_tab2/record_tab2_lb:tmp", -- 招财剩余次数 "roll_left_time:tmp", -- 活动剩余时间 "left_time:tmp", -- 招财条件 "buy_condition:tmp", } self:GetChildren(nodes) self.roll_spin.localRotation = Quaternion.Euler(0, 0, -22.5) self.spin_selected_obj:SetActive(false) -- 特殊背景节点 self.special_bg_list = {} -- for i = 1, 8 do -- self.special_bg_list[i] = {} -- self.special_bg_list[i].obj = self:GetChild("bg/special_bg" .. i).gameObject -- end self.skip_anim_tog_tog.isOn = self.skip_anim -- 货币栏 self.ui_money_view = UIMoneyView.New(self.money_node) self.ui_money_view:SetPosition(0,0) self.ui_money_view:SetData() self.ui_money_view:ChangeShowFlag("smallWindow2") self.ui_money_view:ShowMoneyEffect(false) -- 修改页签文本 self.record_tab1_lb_tmp.text = "全服记录" self.record_tab2_lb_tmp.text = "个人记录" self.ad_tip4_tmp.text = "限定次数彩钻翻倍,财运滚滚来!" lua_resM:setOutsideRawImage(self, self.bg_raw, GameResPath.GetViewBigBg("fc_main_bg"), false) end function FortuneCatMainView:AddEvent() local function click_event(target) if target == self.close_btn_obj then self:Close() elseif target == self.roll_btn_obj then self:OnRollBtnClicked() elseif target == self.record_tab1_obj then self:OnRecordTabClick(1) elseif target == self.record_tab2_obj then self:OnRecordTabClick(2) elseif target == self.skip_anim_tog_obj then self.skip_anim = self.skip_anim_tog_tog.isOn end end AddClickEvent(self.close_btn_obj, click_event, LuaSoundManager.SOUND_UI.NONE) AddClickEvent(self.roll_btn_obj, click_event) AddClickEvent(self.record_tab1_obj, click_event, LuaSoundManager.SOUND_UI.SWITCH) AddClickEvent(self.record_tab2_obj, click_event, LuaSoundManager.SOUND_UI.SWITCH) AddClickEvent(self.skip_anim_tog_obj, click_event, LuaSoundManager.SOUND_UI.SWITCH) -- 活动配置更新之后要马上刷新整个界面 local function update_after_config_updated() self:UpdateView() end self:BindEvent(self.model, FortuneCatModel.UPDATE_FORTUNE_CAT_CONFIG, update_after_config_updated) local function update_roll_event_data(sub_type) if sub_type == self.sub_type then self:UpdateFcRollInfo() end end self:BindEvent(self.model, FortuneCatModel.UPDATE_FORTUNE_CAT_ROLL_TIME, update_roll_event_data) local function roll_succeed_func(vo) if vo and vo.sub_type == self.sub_type then self.in_rolling_anim = true self:ClearUIEffect(self.roll_btn_effect) self.roll_btn_has_effect = false self.temp_target_id = vo.sort self.temp_roll_cost = self.recharge_cost self:StartRollItemAnim(vo.sort) end -- debug -- self:StartRollItemAnim(math.floor(math.random(1, 8))) end self:BindEvent(self.model, FortuneCatModel.UPDATE_FORTUNE_CAT_RESULT, roll_succeed_func) local function update_fc_record(sub_type) -- if sub_type == self.sub_type and not self.has_update_record then -- self.has_update_record = true if sub_type == self.sub_type then self:UpdateFcRecord() end end self:BindEvent(self.model, FortuneCatModel.UPDATE_FORTUNE_CAT_ROLL_RECORD, update_fc_record) end function FortuneCatMainView:UpdateView() self:UpdateFcEventData() self:CreateRollItems() self:OnRecordTabClick() end -- 播放闪光动画 function FortuneCatMainView:StartLightAnim( ) if not self.light_anim_action then cc.ActionManager:getInstance():removeAllActionsFromTarget(self.light_con_r) local target_scale_x = 1 local function scale_action() SetLocalScale(self.light_con_r, target_scale_x, 1, 1) SetLocalScale(self.light_con_y, target_scale_x * -1, 1, 1) target_scale_x = target_scale_x * -1 end local delay_action = cc.DelayTime.New(1) local anim_action = cc.Sequence.New(delay_action, cc.CallFunc.New(scale_action)) self.light_anim_action = cc.RepeatForever.New(anim_action) cc.ActionManager:getInstance():addAction(self.light_anim_action, self.light_con_r) end end -- 点击记录页签回调 tab_index:1全服记录 2个人纪录 function FortuneCatMainView:OnRecordTabClick(tab_index) self.tab_index = tab_index or self.tab_index -- 调整按钮表现 lua_resM:setImageSprite(self, self.record_tab1_img, "fortuneCat_asset", self.tab_index == 1 and "fc_rank_tab2" or "fc_rank_tab1", true) lua_resM:setImageSprite(self, self.record_tab2_img, "fortuneCat_asset", self.tab_index == 2 and "fc_rank_tab2" or "fc_rank_tab1", true) self.record_tab1_lb_tmp.color = ColorUtil:ConvertHexToRGBColor(self.tab_index == 1 and "ffffff" or "dadafe") self.record_tab2_lb_tmp.color = ColorUtil:ConvertHexToRGBColor(self.tab_index == 2 and "ffffff" or "dadafe") -- 更新排行数据 self:UpdateFcRecord() end -- 更新招财猫活动主要信息 function FortuneCatMainView:UpdateFcEventData( ) self.event_data = self.ca_model:getActList(self.base_type, self.sub_type) self:ClearEventLeftTimeId() if not self.event_data then return end local function left_time_func() local left_time = self.event_data.etime - TimeUtil:getServerTime() if left_time > 0 then self.left_time_tmp.text = string.format("活动剩余:%s", ColorUtil.GREEN_DARK, TimeUtil:qianggouTimeLeft2(left_time)) else self.left_time_tmp.text = string.format("活动剩余:已结束", ColorUtil.RED_DARK) self:ClearEventLeftTimeId() end end self.event_left_time_id = GlobalTimerQuest:AddPeriodQuest(left_time_func, 0.5, -1) left_time_func() -- 更新招财猫抽奖相关信息 self:UpdateFcRollInfo() end -- 更新招财猫抽奖相关信息 function FortuneCatMainView:UpdateFcRollInfo( ) self.roll_time_data = self.model:GetFortuneCatRollTimes(self.base_type, self.sub_type) self.fc_cfg = self.model:GetFortuneCatConfig(self.base_type, self.sub_type) -- print("Saber:FortuneCatMainView [start:216] self.fc_cfg ------------------------------------------") -- PrintTable(self.fc_cfg) -- 确保这两个数据都有了才加载 if self.roll_time_data and self.fc_cfg then -- 先判断是否已经抽完了 local is_finished = self.fc_cfg.max_times <= self.roll_time_data.times -- 这个次数是已抽次数,前端获取配置时要+1 local roll_time = is_finished and self.roll_time_data.times or self.roll_time_data.times + 1 local time_cfg = self.fc_cfg.confs[roll_time] -- 获取目前充值额度下,还能转盘几次 local left_roll_time = 0 -- 需要额外充值多少获得转盘次数 local need_dia = nil if not is_finished then for i = roll_time, self.fc_cfg.max_times do if self.roll_time_data.recharge >= self.fc_cfg.confs[i].recharge then left_roll_time = left_roll_time + 1 else need_dia = self.fc_cfg.confs[i].recharge - self.roll_time_data.recharge break end end end -- 抽奖按钮 self.btn_lb1_tmp.text = is_finished and "" or "投入" self.roll_cost_tmp.text = is_finished and "" or time_cfg.cost self.roll_finished_tmp.text = is_finished and "已转完" or "" self.cost_icon_obj:SetActive(not is_finished) SetImageGray(self.roll_btn_img, is_finished) -- 居中对齐货币icon和花费 local len1 = self.cost_icon.sizeDelta.x local len2 = self.roll_cost_tmp.preferredWidth local offset_x = (161 - len1 - len2 - 2) / 2 SetAnchoredPositionX(self.cost_icon, offset_x) SetAnchoredPositionX(self.roll_cost, self.cost_icon.anchoredPosition.x + len1 + 2) -- 剩余次数 self.roll_left_time_tmp.text = string.format("当前可转盘次数:%s次", left_roll_time == 0 and ColorUtil.RED_DARK or ColorUtil.GREEN_DARK, left_roll_time) -- 是否已经获得了所有转盘次数 local get_all_times = left_roll_time + self.roll_time_data.times >= self.fc_cfg.max_times self.ad_img2_obj:SetActive(not get_all_times) self.ad_img3_obj:SetActive(not get_all_times) self.ad_img4_obj:SetActive(get_all_times) -- 右下方条件文本 self.buy_condition_tmp.text = get_all_times and "" or (need_dia and string.format("%s彩钻", need_dia > 0 and need_dia or 0) or "") -- SetSizeDeltaX(self.ad_img2, self.buy_condition_tmp.preferredWidth + 112) -- 做一个可抽奖的缓存,不可抽奖的时候不发协议 self.can_roll = left_roll_time > 0 self.recharge_cost = not is_finished and tonumber(time_cfg.cost) or nil self.recharge_condi = not is_finished and tonumber(time_cfg.recharge) or nil -- 添加特效 if not self.in_rolling_anim and self.can_roll and self.recharge_cost and GoodsModel:getInstance():IsJinEnough(self.recharge_cost) then if not self.roll_btn_has_effect then self:AddUIEffect("ui_bianqiang", self.roll_btn_effect, self.layer_name, nil, {x=2.7,y=2.7}, true, nil, nil, nil, nil, nil) self.roll_btn_has_effect = true end else self:ClearUIEffect(self.roll_btn_effect) self.roll_btn_has_effect = false end end end function FortuneCatMainView:ClearEventLeftTimeId( ) if self.event_left_time_id then GlobalTimerQuest:CancelQuest(self.event_left_time_id) self.event_left_time_id = nil end end -- 创建招财猫抽奖用节点 function FortuneCatMainView:CreateRollItems( ) self.fc_cfg = self.fc_cfg or self.model:GetFortuneCatConfig(self.base_type, self.sub_type) -- local function special_bg_callback(index, show) -- if self.special_bg_list[index] then -- self.special_bg_list[index].obj:SetActive(show) -- end -- end if self.fc_cfg then local item_data = self.fc_cfg.rebacks local item_num = TableSize(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(item_data) do item = self.roll_item_list[k] if not item then item = FortuneCatRollItem.New(self.item_con) self.roll_item_list[k] = item end rad_start_angle = rad(start_angle) -- 坐标设置:y正向为起点顺时针分布 item:SetAnchoredPosition(self.item_pos_radius * cos(rad_start_angle), self.item_pos_radius * sin(rad_start_angle)) -- item:SetData(v, k, special_bg_callback) item:SetData(v, k) item._angle = start_angle -- 变换角度 start_angle = ClampAngleType2(start_angle - angle_offset) end self.need_refresh_roll_item = false else self.need_refresh_roll_item = true end end -- 创建招财猫服务器记录 function FortuneCatMainView:UpdateFcRecord( ) -- 创建的时候要暂停动画 self:StopRecordItemAction() -- 追加字段,判断是否获取个人记录 local record_list = self.model:GetFortuneCatRollRecord(self.base_type, self.sub_type, self.tab_index == 2) for k, v in pairs(self.record_item_list) do v:SetVisible(false) end -- 节点高度 local max_item_num = 20 -- 最大节点数 local node_height = self.record_scroll.sizeDelta.y local height = 0 local item self.record_count = 0 for k, v in ipairs(record_list) do if k > max_item_num then break end item = self.record_item_list[k] if not item then item = FortuneCatRecordItem.New(self.record_con) self.record_item_list[k] = item end item:SetAnchoredPosition(2, -height) item:SetVisible(true) height = height + item:SetData(v, self.sub_type) self.record_count = self.record_count + 1 end self.no_record_tmp.text = self.record_count == 0 and "暂无记录" or "" SetSizeDeltaY(self.record_con, height) -- 记录一下当前的节点数 -- 生成节点的高度超过了容器高度,就需要展示轮播 if height > node_height then self:StartRecordItemAction() end end -- 招财记录动画相关 -- 招财记录动画相关 -- 招财记录动画相关 -- 开始轮播招财记录动画 function FortuneCatMainView:StartRecordItemAction() self:StopRecordItemAction() local time = FortuneCatModel.RecordAnimDuration local function func() self:UpdateRecordItemPos() self:MoveRecordItem() end self.auto_record_item_anim_id = GlobalTimerQuest:AddPeriodQuest(func, time, -1) end function FortuneCatMainView:StopRecordItemAction() if self.auto_record_item_anim_id then GlobalTimerQuest:CancelQuest(self.auto_record_item_anim_id) self.auto_record_item_anim_id = nil end self:StopRecordItemAnim() end -- 播放招财记录节点的动画 function FortuneCatMainView:MoveRecordItem() local first_text = self.record_item_list[1] local move_height = first_text:GetAnchoredPosition().y move_height = move_height > 0 and 0 or move_height for k,text in pairs(self.record_item_list) do text:StartAction(move_height) end end -- 停止招财记录节点的动画 function FortuneCatMainView:StopRecordItemAnim() for k,text in pairs(self.record_item_list) do text:StopAction() end end function FortuneCatMainView:UpdateRecordItemPos() local delete_index = {} local height = 0 local count = 0 for i = 1, self.record_count do local text = self.record_item_list[i] if text then local vis = text:GetVisible() local h = text:GetRecordHeight() local y = text:GetAnchoredPosition().y height = height + (vis and h or 0) if y + h > 0.1 and vis then -- 将超出屏幕并显示中的节点保存到移动临时队列 0.1 由于浮点误差有可能出现不该隐藏的节点也添加到队列中,做加大误差处理 table.insert(delete_index, i) end end end local del_num = 0 local t = {} for i,v in ipairs(delete_index) do local index = v - del_num local text = table.remove(self.record_item_list, index) t[#t+1] = text del_num = del_num + 1 end -- 将临时队列的节点存回去 for i = 1, #t do t[i]:SetAnchoredPosition(2, -height) table.insert(self.record_item_list, t[i]) end end -- 玩家招财动画相关 -- 玩家招财动画相关 -- 玩家招财动画相关 -- 开启抽奖随机闪烁动画 function FortuneCatMainView:StartRollItemAnim(target_id) cc.ActionManager:getInstance():removeAllActionsFromTarget(self.roll_spin) -- print("Saber:FortuneCatMainView [391] target_id: ",target_id) local angel = self:AnimRotateAngle(target_id) local anim_end_fun = function() self.in_rolling_anim = false self.roll_spin.localRotation = Quaternion.Euler(0, 0, angel) local spin_angel = math.ceil(ClampAngleType2(angel) / 45) * 45 self.spin_selected_obj:SetActive(true) self.spin_selected.localRotation = Quaternion.Euler(0, 0, spin_angel) self.model:ShowDrawRewardEffect(self.fc_cfg, target_id, self.temp_roll_cost) self.model:Fire(FortuneCatModel.REQUEST_CCMD_EVENT, 33220, self.base_type, self.sub_type) self.temp_target_id = nil self.temp_roll_cost = nil self:UpdateFcRollInfo() -- 恢复货币更新 if self.ui_money_view then self.ui_money_view:ReBindValueUpdate() end end self.spin_selected_obj:SetActive(false) local start_angel = self.roll_spin.localEulerAngles.z start_angel = ClampAngleType2(start_angel) -- 跳过动画 if self.skip_anim then anim_end_fun() else -- local spin_selected_angel = self.spin_selected.localEulerAngles.z -- 播放动画 local spin_action_callback = function(percent) -- local ratio = TweenFunc.easeInOut(percent) local ratio = self:AnimPercentageAmount(percent) local temp_angle = angel * ratio local temp_angle2 = start_angel * (1-ratio) self.roll_spin.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 / 45) * 45 -- if temp_spin_angel ~= spin_selected_angel then -- spin_selected_angel = temp_spin_angel -- self.spin_selected.localRotation = Quaternion.Euler(0, 0, spin_selected_angel) -- end end local spin_action = cc.CustomUpdate.New(FortuneCatModel.AnimTime, spin_action_callback) spin_action = cc.Sequence.New(spin_action, cc.CallFunc.New(anim_end_fun)) cc.ActionManager:getInstance():addAction(spin_action, self.roll_spin) end end function FortuneCatMainView:AnimPercentageAmount(ratio) local div = FortuneCatModel.AnimAmountDiv if ratio < div then return div * TweenFunc.easeInQuint(ratio/div) else return (1-div) * TweenFunc.easeOutQuint((ratio-div)/(1-div)) + div end end function FortuneCatMainView:ClearRollItemDelay( ) if self.rollItem_anim_delay_id then GlobalTimerQuest:CancelQuest(self.rollItem_anim_delay_id) self.rollItem_anim_delay_id = nil end end -- 获取抽中道具所在的角度,并推算出一个n圈的终点角度 function FortuneCatMainView:AnimRotateAngle(target_id) local target_angle for k, v in ipairs(self.roll_item_list) do if v.sort and v.sort == target_id then -- 获取抽中档位所在的节点的角度,并做一个减少90度的偏移,求得旋转指针最后的角度 target_angle = v._angle - 90 end end target_angle = target_angle + math.random(-15, 15) -- 在节点范围内进行一个合理的偏移 -- 起始角度必须先将指针的角度归零 -- 默认转10圈,然后停在目标角度范围内 local angle = FortuneCatModel.AnimRollTime * -360 + target_angle return angle end -- 点击招财按钮 function FortuneCatMainView:OnRollBtnClicked( ) if self.in_rolling_anim then Message.show("正在转盘中...", "falut") return end if self.can_roll then -- 可抽,弹出tips界面 local function ok_callback() self.model:Fire(FortuneCatModel.REQUEST_CCMD_EVENT, 33221, self.base_type, self.sub_type) self.has_update_record = false -- 停用货币更新 if self.ui_money_view then self.ui_money_view:UnBindAllValueUpdate() end end if GoodsModel:getInstance():IsJinEnough(self.recharge_cost) then -- 这边需要特殊处理,彩钻够了就直接发协议 ok_callback() else local function use_function( toggle_tip_data, call_fun_sum ) if tab_cfg.price ~= 0 then GlobalEventSystem:Fire(EventName.OPEN_COM_TOGGLE_TIP_VIEW, toggle_tip_data) else call_fun_sum() end end local data = { gold_type = 1, cost_price = self.recharge_cost, ok_callback = ok_callback, togglePriceStr = string.format("%s 彩钻进行一次彩钻星轮?", ColorUtil.ORANGE_DARK, self.recharge_cost), use_function = use_function, no_need_toggle = true, qc_type = 0, } CustomActivityModel:getInstance():BuyTips(data) end else if self.recharge_cost then -- 不可抽,但是存在抽奖充值条件,则代表还有次数需飘字提示 -- local function ok( ... ) -- OpenFun.Open(158, 0) -- -- self:Close() -- end -- local ask_str = string.format("还需充值 %s%s,才能转动彩钻星轮哦~", WordManager:GetMoneyFaceStr(1), -- ColorUtil.ORANGE_DARK, self.recharge_condi - self.roll_time_data.recharge) -- Alert.show(ask_str,Alert.Type.Two,ok,nil,"前往充值","取消") local qc_data = { price = self.recharge_condi - self.roll_time_data.recharge, close_callback = ok, qc_type = 2, } GlobalEventSystem:Fire(EventName.OPEN_RECHARGE_TIP_VIEW, true, qc_data) else Message.show("已完成本期彩钻星轮", "fault") end end end function FortuneCatMainView:DestroySuccess( ) self:ClearEventLeftTimeId() self:ClearRollItemDelay() self:StopRecordItemAction() self:ClearUIEffect(self.roll_btn_effect) cc.ActionManager:getInstance():removeAllActionsFromTarget(self.roll_spin) cc.ActionManager:getInstance():removeAllActionsFromTarget(self.light_con_r) if self.ui_money_view then self.ui_money_view:DeleteMe() self.ui_money_view = nil end for k, v in pairs(self.roll_item_list) do v:DeleteMe() v = nil end self.roll_item_list = nil for k, v in pairs(self.record_item_list) do v:DeleteMe() v = nil end self.record_item_list = nil end