-- <* -- @Author: Saber -- @Description: 圣物系统抽奖结算界面 -- *> PsionicDrawResultView = PsionicDrawResultView or BaseClass(BaseView) local PsionicDrawResultView = PsionicDrawResultView local PsionicConst = PsionicConst function PsionicDrawResultView:__init() self.base_file = "psionic" self.layout_file = "PsionicDrawResultView" self.layer_name = "Activity" self.destroy_imm = true self.use_background = true --全屏界面默认使用这个参数,非全屏界面自行设置 self.change_scene_close = true --是否切换场景时关闭(弹出界面使用) self.append_to_ctl_queue = false --是否要添加进界面堆栈 self.is_set_zdepth = true self.blur_activity_bg = true self.use_show_anim = true self.use_hide_anim = true self.max_num = 10 self.item_list = {} -- 抽卡消耗缓存 self.cost_cache = {} self.cost_cache[PsionicConst.DrawPoolType.Normal] = {} self.cost_cache[PsionicConst.DrawPoolType.Deep] = {} self.is_animating = false self.can_close_view = false self.model = PsionicModel:getInstance() self.goods_model = GoodsModel:getInstance() self.load_callback = function () self:LoadSuccess() self:AddEvent() end self.open_callback = function ( ) self:UpdateView() end self.destroy_callback = function ( ) self:DestroySuccess() end end function PsionicDrawResultView:Open(data) self.data = data BaseView.Open(self) end -- 重新抽奖后重新加载界面数据 function PsionicDrawResultView:ReOpenView(data) self.data = data self:UpdateView() end function PsionicDrawResultView:LoadSuccess() local nodes = { "click_bg:obj", "bg:obj:raw", "title:obj", "skip_btn:obj", "box_con", "light_con:obj", "award_con", "btn_con:cg", "btn_con/draw_one_btn:obj", "btn_con/draw_ten_btn:obj", "btn_con/cost_icon1:img", "btn_con/cost_icon2:img", "btn_con/cost1:tmp", "btn_con/cost2:tmp", "btn_con/draw_tip:tmp", -- "btn_con/draw_btn:obj", -- "btn_con/draw_btn/draw_lb:tmp", -- "btn_con/confirm_btn:obj", } self:GetChildren(nodes) SetAnchoredPositionY(self.light_con, -45) lua_resM:setOutsideRawImage(self, self.bg_raw, GameResPath.GetViewBigBg("ps_draw_result_bg"), false) -- 提前预载配置 self.normal_cfg = Config.Nucleonpool[1] self.deep_cfg = Config.Nucleonpool[2] -- self:AddUIEffect("ui_jihuoxinxitong01", self.light_con, self.layer_name, nil, 1.2, true,nil,nil, nil, nil,nil) end function PsionicDrawResultView:AddEvent() local function click_event(target) if target == self.draw_one_btn_obj then self:OnDrawBtnClick(PsionicConst.DrawNumType.OneDraw) elseif target == self.draw_ten_btn_obj then self:OnDrawBtnClick(PsionicConst.DrawNumType.TenDraw) elseif target == self.click_bg_obj or target == self.bg_obj then -- 关闭遮罩 if self.can_close_view then self:Close() end elseif target == self.skip_btn_obj then -- 跳过动画 self:SkipAllAnim() end -- if target == self.confirm_btn_obj then -- self:Close() -- elseif target == self.draw_btn_obj then -- self:OnDrawBtnClick() -- end end AddClickEvent(self.draw_one_btn_obj, click_event) AddClickEvent(self.draw_ten_btn_obj, click_event) AddClickEvent(self.click_bg_obj, click_event) AddClickEvent(self.bg_obj, click_event) AddClickEvent(self.skip_btn_obj, click_event) -- AddClickEvent(self.confirm_btn_obj, click_event) -- AddClickEvent(self.draw_btn_obj, click_event) local function update_draw_data(pool_type) -- 如果对应池子的数据更新,这边也要同步表现 if self.data and self.data.pool == pool_type then self:UpdateDrawCostDataByType(self.data.pool) end end self:BindEvent(self.model, PsionicConst.UPDATE_DIG_DATA, update_draw_data) end function PsionicDrawResultView:UpdateView() self.data.col_num = 5--限定5了 不能改 self.delay_time = self.data and self.data.delay_time or self.delay_time self:UpdateDrawCostDataByType(self.data.pool) self:UpdateDrawTips() -- self:UpdateDrawBtn() self:StartDrawAnim() -- self:UpdateItemList() end -- 新版调整 根据池子类型不同,直接更新对应池子的消耗物品信息,并缓存每种情况所需要的花费 function PsionicDrawResultView:UpdateDrawCostDataByType(pool_type) local cfg_data = pool_type == PsionicConst.DrawPoolType.Normal and self.normal_cfg or self.deep_cfg local pool_data = self.model:GetPsionicDigData(pool_type) -- 当前是否能免费 local can_free = pool_data and pool_data.remain > 0 and pool_data.rtime - TimeUtil:getServerTime() < 0 or false -- 获取抽奖券数 local single_ticket_num = self.goods_model:GetTypeGoodsNum(cfg_data.one) local ten_ticket_num = self.goods_model:GetTypeGoodsNum(cfg_data.ten) local one_cost = stringtotable(cfg_data.cost)[1] local ten_cost = stringtotable(cfg_data.pay)[1] -- 单抽券价格 local single_ticket_price = tonumber(one_cost[3]) local single_ticket_price_type = tonumber(one_cost[1]) local one_cost_icon_asset, one_cost_icon_name = WordManager:GetCommonMoneyIcon(single_ticket_price_type) local ten_cost_icon_asset, ten_cost_icon_name = WordManager:GetCommonMoneyIcon(ten_cost[1]) if pool_type == PsionicConst.DrawPoolType.Normal then -- 普通池子默认展示红钻,有单抽券时显示单抽券 -- 单抽 -- 没有抽奖券的情况 if can_free then lua_resM:setImageSprite(self, self.cost_icon1_img, "psionic_asset", "psionic_dig_icon"..pool_type.."_1", true) self.cost1_tmp.text = "免费" self.cost_cache[pool_type][PsionicConst.DrawNumType.OneDraw] = {free = true} -- 免费,可以直接抽 -- 有抽奖券,则加载为抽奖券的图标 elseif single_ticket_num > 0 then lua_resM:setImageSprite(self, self.cost_icon1_img, "psionic_asset", "psionic_dig_icon"..pool_type.."_1", true) self.cost1_tmp.text = string.format("%s/1", single_ticket_num > 0 and ColorUtil.GREEN_DARK or ColorUtil.RED_DARK, single_ticket_num) self.cost_cache[pool_type][PsionicConst.DrawNumType.OneDraw] = {goods_id = cfg_data.one} -- 构造数据,扣除道具 else -- 显示为钻石付费 lua_resM:setImageSprite(self, self.cost_icon1_img, one_cost_icon_asset, one_cost_icon_name, true) self.cost1_tmp.text = single_ticket_price self.cost_cache[pool_type][PsionicConst.DrawNumType.OneDraw] = {price_type = single_ticket_price_type, cost = single_ticket_price} -- 构造数据,扣除金额 end -- 十连 -- 有十连券,则加载为十连券的图标 if ten_ticket_num > 0 then lua_resM:setImageSprite(self, self.cost_icon2_img, "psionic_asset", "psionic_dig_icon"..pool_type.."_2", true) self.cost2_tmp.text = string.format("%s/1", ColorUtil.GREEN_DARK, ten_ticket_num) self.cost_cache[pool_type][PsionicConst.DrawNumType.TenDraw] = {goods_id = cfg_data.ten} -- 构造数据,表现为扣除道具 -- 有单抽券,则加载为单抽券,并显示出所需个数相关表现 elseif single_ticket_num > 0 then lua_resM:setImageSprite(self, self.cost_icon2_img, "psionic_asset", "psionic_dig_icon"..pool_type.."_1", true) self.cost2_tmp.text = string.format("%s/9", single_ticket_num >= 9 and ColorUtil.GREEN_DARK or ColorUtil.RED_DARK, single_ticket_num) if single_ticket_num >= 9 then -- 单抽券数量足够,表现为扣除道具 self.cost_cache[pool_type][PsionicConst.DrawNumType.TenDraw] = {goods_id = cfg_data.one} -- 构造数据,表现为扣除道具 else -- 单抽不足,算出差价,表现为补齐单抽 local need_cost = single_ticket_price * (9 - single_ticket_num) self.cost_cache[pool_type][PsionicConst.DrawNumType.TenDraw] = {price_type = single_ticket_price_type, cost = need_cost} -- 构造数据,扣除金额 end -- 普通池子没抽奖券展示红钻 else lua_resM:setImageSprite(self, self.cost_icon2_img, ten_cost_icon_asset, ten_cost_icon_name, true) local need_cost = single_ticket_price * 9 self.cost2_tmp.text = need_cost self.cost_cache[pool_type][PsionicConst.DrawNumType.TenDraw] = {price_type = single_ticket_price_type, cost = need_cost} -- 构造数据,表现为扣除金额 end else -- 高级池子默认展示道具 -- 单抽 lua_resM:setImageSprite(self, self.cost_icon1_img, "psionic_asset", "psionic_dig_icon"..pool_type.."_1", true) -- 免费单抽 if can_free then self.cost1_tmp.text = "免费" self.cost_cache[pool_type][PsionicConst.DrawNumType.OneDraw] = {free = true} -- 构造数据,表现为扣除金额 -- 有抽奖券,则加载为抽奖券的图标 else self.cost1_tmp.text = string.format("%s/1", single_ticket_num > 0 and ColorUtil.GREEN_DARK or ColorUtil.RED_DARK, single_ticket_num) if single_ticket_num > 0 then self.cost_cache[pool_type][PsionicConst.DrawNumType.OneDraw] = {goods_id = cfg_data.one} -- 构造数据,扣除道具 else self.cost_cache[pool_type][PsionicConst.DrawNumType.OneDraw] = {price_type = single_ticket_price_type, cost = single_ticket_price} -- 构造数据,扣除金额 end end -- 十连 -- 有十连券,就展示十连券的表现 if ten_ticket_num > 0 then lua_resM:setImageSprite(self, self.cost_icon2_img, "psionic_asset", "psionic_dig_icon"..pool_type.."_2", true) self.cost2_tmp.text = string.format("%s/1", ColorUtil.GREEN_DARK, ten_ticket_num) self.cost_cache[pool_type][PsionicConst.DrawNumType.TenDraw] = {goods_id = cfg_data.ten} -- 构造数据,表现为扣除道具 -- 有单抽券,则加载为单抽券,并显示出所需个数相关表现 else lua_resM:setImageSprite(self, self.cost_icon2_img, "psionic_asset", "psionic_dig_icon"..pool_type.."_1", true) self.cost2_tmp.text = string.format("%s/9", single_ticket_num >= 9 and ColorUtil.GREEN_DARK or ColorUtil.RED_DARK, single_ticket_num) if single_ticket_num >= 9 then -- 单抽券满足 self.cost_cache[pool_type][PsionicConst.DrawNumType.TenDraw] = {goods_id = cfg_data.one} -- 构造数据,表现为扣除道具 else local need_cost = single_ticket_price * (9 - single_ticket_num) self.cost_cache[pool_type][PsionicConst.DrawNumType.TenDraw] = {price_type = single_ticket_price_type, cost = need_cost} -- 构造数据,扣除金额 end end end end function PsionicDrawResultView:UpdateDrawTips( ) if self.data then -- 遍历属性找到当中符合相应池子配置条件的颜色的数量,并计算出保底数 local cfg_data = self.data.pool == PsionicConst.DrawPoolType.Normal and self.normal_cfg or self.deep_cfg local rule_cfg = stringtotable(cfg_data.rule)[1] local color, num = tonumber(rule_cfg[1]), tonumber(rule_cfg[2]) local str = "" for k, v in ipairs(self.data.show_awards) do if v.color == color then str = string.format("再抽 %s 次必出橙色品质圣物", ColorUtil.GREEN_DARK, num - v.times) break end end self.draw_tip_tmp.text = str end end ---------------- -- 开始抽奖动画 -- ---------------- function PsionicDrawResultView:StartDrawAnim( ) self:InitViewNodes() self:UpdateBoxModel() end -- 初始化节点 function PsionicDrawResultView:InitViewNodes( ) -- 隐藏背景和标题 self.bg_obj:SetActive(false) self.title_obj:SetActive(false) -- self.light_con_obj:SetActive(false) self:ClearUIEffect(self.light_con) self.can_close_view = false -- 清除模型 lua_resM:clearRoleMode(self) -- 隐藏节点 self:ClearAwardItemCreator() for k,v in pairs(self.item_list) do v:SetVisible(false, nil, true) end -- 隐藏按钮 self.btn_con_cg.alpha = 0 self.btn_con_cg.blocksRaycasts = false -- 显示跳过按钮 self.skip_btn_obj:SetActive(true) end -- 创建宝箱模型 function PsionicDrawResultView:UpdateBoxModel( ) -- 容错处理,防止模型加载不出来导致后面的表现看不见 self:DelayShowRewardAnim(4) local data = { father_node = self, transform = self.box_con, layer_name = self.layer_name, fashion_type = FuncOpenModel.TypeId.OtherGoods, figure_id = PsionicConst.DrawShowModel[self.data.pool], scale = 255 * 1.4, can_rotate = false, action_name_list = {"show"}, position = Vector3(0, -120, -1000), rotate = Vector3(0, 0, 0), ui_model_type = UIModelCommon.ModelType.Model, callBack = function() -- 模型加载出来之后,停止容错的倒计时,使用模型回调产生的倒计时 self:DelayShowRewardAnim(2.5) end, } FuncOpenModel:getInstance():SetModelRes(data) end -- 延迟展示奖励和按钮等的表现 function PsionicDrawResultView:DelayShowRewardAnim(delay_time) self:ClearShowRewardDelayId() self.is_animating = true local function delay_show_reward_func( ) lua_resM:clearRoleMode(self) -- 取消隐藏背景和标题 self.bg_obj:SetActive(true) self.title_obj:SetActive(true) -- self.light_con_obj:SetActive(true) self:AddUIEffect("ui_jihuoxinxitong01", self.light_con, self.layer_name, nil, 1.2, true,nil,nil, nil, nil,nil) -- 加载奖励内容 self:UpdateItemList() -- 延时x秒显示按钮 self:DelayShowBtnCon(0.5) -- 隐藏跳过按钮 self.skip_btn_obj:SetActive(false) end self.delay_show_reward_id = setTimeout(delay_show_reward_func, delay_time) end function PsionicDrawResultView:DelayShowBtnCon(delay_time) self:ClearShowBtnConId() local function delay_show_btn_con_func( ) local function btn_con_alpha_anim_callback() self.is_animating = false end self.btn_con_alpha_id = TweenLite.to(self, self.btn_con, TweenLite.UiAnimationType.ALPHA_ALL, 1, 0.3, btn_con_alpha_anim_callback) self.btn_con_cg.blocksRaycasts = true end self.delay_show_btn_con_id = setTimeout(delay_show_btn_con_func, delay_time) -- 到了展示按钮的时候就可以关闭界面了 self.can_close_view = true end function PsionicDrawResultView:ClearShowRewardDelayId( ) if self.delay_show_reward_id then GlobalTimerQuest:CancelQuest(self.delay_show_reward_id) self.delay_show_reward_id = nil end end function PsionicDrawResultView:ClearShowBtnConId( ) if self.delay_show_btn_con_id then GlobalTimerQuest:CancelQuest(self.delay_show_btn_con_id) self.delay_show_btn_con_id = nil end if self.btn_con_alpha_id then TweenLite.Stop(self.btn_con_alpha_id) self.btn_con_alpha_id = nil end end -- 跳过所有动画 function PsionicDrawResultView:SkipAllAnim( ) self.skip_btn_obj:SetActive(false) self.is_animating = false self.can_close_view = true lua_resM:clearRoleMode(self) -- 取消隐藏背景和标题 self.bg_obj:SetActive(true) self.title_obj:SetActive(true) self:AddUIEffect("ui_jihuoxinxitong01", self.light_con, self.layer_name, nil, 1.2, true,nil,nil, nil, nil,nil) -- 加载奖励内容 self:UpdateItemList(true) self:ClearShowRewardDelayId() self:ClearShowBtnConId() self.btn_con_cg.blocksRaycasts = true self.btn_con_cg.alpha = 1 end ---------------- ---------------- function PsionicDrawResultView:UpdateItemList(skip_anim) for k,v in pairs(self.item_list) do v:SetVisible(false, nil, true) end self.col_num = self.data.col_num or self.col_num local item_list = self.data.award if not item_list or TableSize(item_list) == 0 then return end local len = #item_list local i = 0 local x, y, v, grade_cfg local function frame_count_creator() -- 累加迭代 i = i + 1 if len >= i then v = item_list[i] local item = self.item_list[i] if item == nil then item = UIObjPool:getInstance():PopItem(UIObjPool.UIType.AwardItem, self.award_con) item:SetItemSize(78, 78) self.item_list[i] = item end if len == 1 then local con_size = self.award_con.sizeDelta item:SetAnchoredPosition(261, -76) else x = (78 + 49) * ((i - 1) % 5) + 7 y = -(78 + 35) * math.floor((i - 1) / 5) - 20.5 item:SetAnchoredPosition(x, y) end item:SetGoodsVo(v[4]) local goods_Id, lock = GoodsModel:getInstance():GetMappingTypeId(v[1], v[2]) local goodVo = GoodsModel:getInstance():GetGoodsBasicByTypeId(goods_Id) local stren_data = nil if v[4] then stren_data = EquipModel:getInstance():GetBagEquipAwaraItemInfo(v[4]) stren_data.equip_key = "EquipView" end if not v.is_mul then--副本多倍 if v.is_rare == 2 then item:SetNumLimitVisible(true, 12) elseif v.is_rare == 1 then item:SetNumLimitVisible(true, 13) end else item:SetNumLimitVisible(v.is_mul ~= nil, 15) end if goodVo then item:SetData(goods_Id, v[3], goodVo.color, stren_data, lock, true, nil) else -- error("没有找到物品信息 "..v.typeId) end item:SetVisible(true, nil, true) else self:ClearAwardItemCreator() end end self.award_creator_id = GlobalTimerQuest:AddPeriodQuest(frame_count_creator, skip_anim and 0 or 0.1) end function PsionicDrawResultView:ClearAwardItemCreator( ) if self.award_creator_id then GlobalTimerQuest:CancelQuest(self.award_creator_id) self.award_creator_id = nil end end -- 抽奖按钮点击逻辑 pool_type:奖池类型 opty:次数类型 -- 消耗顺序:免费次数(单抽)> 单抽/十连券 > 红钻/彩钻 function PsionicDrawResultView:OnDrawBtnClick(opty) if not self.data then return end local pool_type = self.data.pool local cost_data = self.cost_cache[pool_type][opty] if not cost_data then return end local price_asset, price_icon, price_color local price_type, cost_price local priceText = "" local insufficientText = nil local special_icon_data = nil local cfg_data = pool_type == PsionicConst.DrawPoolType.Normal and self.normal_cfg or self.deep_cfg local function ok_callback() self.model:Fire(PsionicConst.REQUEST_CCMD_EVENT, 13911, pool_type, opty) end if cost_data.free then -- 免费抽,直接冲 ok_callback() return end local cost_goods_name = self.goods_model:getGoodsName(cfg_data.one, true) -- 使用抽奖券的情况,提示后直接使用 if cost_data.goods_id then special_icon_data = true price_asset = "psionic_asset" price_icon = "psionic_dig_icon" .. pool_type .. "_" .. opty price_type = 0 if cost_data.goods_id == cfg_data.one then -- 单抽券需要区分抽奖次数,十连券每次消耗1张 cost_price = opty == PsionicConst.DrawNumType.TenDraw and 9 or 1 else cost_price = 1 end price_color = self.goods_model:GetGoodsColor(cost_data.goods_id) priceText = string.format("%s %s %s寻宝%s次?", price_color, cost_price, cost_goods_name, pool_type == PsionicConst.DrawPoolType.Deep and "深度" or "普通", opty == PsionicConst.DrawNumType.TenDraw and 10 or 1) else -- 需要使用钻石补足的情况 price_type = cost_data.price_type cost_price = cost_data.cost price_asset, price_icon = WordManager:GetCommonMoneyIcon(price_type) -- price_color = WordManager.GetGoodsColor(pool_type == PsionicConst.DrawPoolType.Deep and 4 or 3) price_color = ColorUtil.YELLOW_DARK if pool_type == PsionicConst.DrawPoolType.Deep then -- 统一用抽奖券表现 insufficientText = string.format("%s 不足", cost_goods_name) priceText = string.format("%s 补齐 %s %s寻宝%s次?", price_color, cost_price, cost_goods_name, pool_type == PsionicConst.DrawPoolType.Deep and "深度" or "普通", opty == PsionicConst.DrawNumType.TenDraw and 10 or 1) else priceText = string.format("%s %s寻宝%s次?", price_color, cost_price, pool_type == PsionicConst.DrawPoolType.Deep and "深度" or "普通", opty == PsionicConst.DrawNumType.TenDraw and 10 or 1) end end local function use_function( toggle_tip_data, call_fun_sum ) if not self.model._dont_check_psionic_draw_tip[pool_type] then GlobalEventSystem:Fire(EventName.OPEN_COM_TOGGLE_TIP_VIEW, toggle_tip_data) else call_fun_sum() end end local data = { insufficientText = insufficientText, special_icon_data = special_icon_data, gold_type = price_type, cost_price = cost_price, ok_callback = ok_callback, togglePriceStr = priceText, use_function = use_function, toggle_function = function(flag) self.model._dont_check_psionic_draw_tip[pool_type] = flag end, recharge_open_call_back = function() self:Close() end, } CustomActivityModel:getInstance():BuyTips(data) end function PsionicDrawResultView:DestroySuccess( ) self:ClearShowRewardDelayId() self:ClearShowBtnConId() self:ClearAwardItemCreator() lua_resM:clearRoleMode(self) self:ClearUIEffect(self.light_con) for i,item in pairs(self.item_list) do UIObjPool:getInstance():PushItem(UIObjPool.UIType.AwardItem, item) end self.item_list = {} ItemUseModel:getInstance():ShowItemUseView( ) end