-- <* -- @Author: Saber -- @Description: 圣物装备装备升星界面 -- *> PsionicAdvanceBreakView = PsionicAdvanceBreakView or BaseClass(BaseItem) local PsionicAdvanceBreakView = PsionicAdvanceBreakView function PsionicAdvanceBreakView:__init(parent_wnd,prefab_asset,layer_name) self.base_file = "psionic" self.layout_file = "PsionicAdvanceBreakView" self.parent_wnd = parent_wnd self.layer_name = layer_name self.selected_equip_list = {} -- 选中的装备列表 格式:{[配置顺序] = {need_num= 123, list = {goods_id, goods_id, ...}}, ...} self.cur_star_list = {} self.next_star_list = {} self.cost_item_list = {} self.is_auto_buy_mat = false -- 是否自动购买材料 self.equip_need_num = 0 -- 进化所需装备数量 self.model = PsionicModel:getInstance() self.goods_model = GoodsModel:getInstance() self.slot_break_red_equip_list = {} self:Load() end function PsionicAdvanceBreakView:Load_callback() local nodes = { "bg:raw", -- 战力节点 "power_con", "power_con/power_lb1:tmp", "power_con/up_arrow", "power_con/power_cur:txt", "power_con/power_up:tmp", -- 模型,星星,属性item和装备节点 "attr_scroll", "attr_scroll/Viewport/attr_con", "star_con_cur", "star_con_next", "arrow1:obj", "arrow2:obj", "item_cur", "item_next", "confirm_btn:obj", "confirm_btn/confirm_btn_red:obj", -- 进化需求相关节点 "cost_item_bg:obj", "line1:obj", "line2:obj", "sub_title1:obj", } self:GetChildren(nodes) lua_resM:setOutsideRawImage(self, self.bg_raw, GameResPath.GetViewBigBg("ps_break_bg")) self.power_lb1_tmp.text = "战力" self.cur_equip_item = PsionicArmorItem.New(self.item_cur) self.cur_equip_item:SetAnchoredPosition(0, 0) self.cur_equip_item:SetVisible(false) self.next_equip_item = PsionicArmorItem.New(self.item_next) self.next_equip_item:SetAnchoredPosition(0, 0) self.next_equip_item:SetVisible(false) self:AddEvents() if self.need_refreshData then self:UpdateView() end end function PsionicAdvanceBreakView:AddEvents() local function click_event(target) if target == self.confirm_btn_obj then -- 确认进化 self:OnConfirmBtnClick() end end AddClickEvent(self.confirm_btn_obj, click_event, LuaSoundManager.SOUND_UI.NONE) local function update_break_red(tab_id) if not tab_id or tab_id == PsionicConst.TabId.PBreak then self:UpdateView() end end self:BindEvent(self.model, PsionicConst.UPDATE_RED_BY_TABID, update_break_red) end function PsionicAdvanceBreakView:SetData( goods_vo, need_show_effect, slot_break_red_equip_list ) self.goods_vo = goods_vo self.need_show_effect = need_show_effect -- 是否需要展示进化成功的属性流光动画 self.slot_break_red_equip_list = slot_break_red_equip_list if self.is_loaded then self.need_refreshData = false self:UpdateView() else self.need_refreshData = true end end function PsionicAdvanceBreakView:UpdateView() -- 获取当前装备的进化配置 self:UpdateBasicData() self:UpdateMaterialArmorItem() self:UpdateBreakBtnRed() end -- 加载基础数据(只加载一次) function PsionicAdvanceBreakView:UpdateBasicData( ) -- 加载属性 -- 获取配置 self.cur_equip_item:SetData(self.goods_vo, PsionicConst.ArmorItemFlag.Show) self.cur_equip_item:SetVisible(true) self.next_psionic_cfg = self.model:GetPsionicEquipGradeCfg(self.goods_vo.next) local attr_cur = self.goods_vo.basic_attrs local basic_attr_next = self.next_psionic_cfg and self.next_psionic_cfg.attrs or {} local attr_next = self.next_psionic_cfg and self.next_psionic_cfg.attrs or {} -- 需要重新构造表来计算战斗力,否则会出错 local attr_next = {} for k, v in ipairs(basic_attr_next) do attr_next[k] = {[1] = v[1], [2] = v[2]} end attr_cur = SortAttrList(attr_cur) attr_next = SortAttrList(attr_next) -- 战斗力表现 local cur_power = GetFighting(attr_cur, false) local t_p_next = GetFighting(attr_next) self.power_cur_txt.text = cur_power self.power_up_tmp.text = GetFighting(attr_next, false) - cur_power local total_len = self.power_lb1_tmp.preferredWidth + self.power_cur_txt.preferredWidth if t_p_next ~= 0 then total_len = total_len + self.up_arrow.sizeDelta.x + self.power_up_tmp.preferredWidth + 15 end local offset_x = (self.power_con.sizeDelta.x - total_len) / 2 SetAnchoredPositionX(self.power_lb1, offset_x) SetAnchoredPositionX(self.power_cur, offset_x + self.power_lb1_tmp.preferredWidth + 5) SetAnchoredPositionX(self.up_arrow, self.next_psionic_cfg and self.power_cur.anchoredPosition.x + self.power_cur_txt.preferredWidth + 5 or 999999) SetAnchoredPositionX(self.power_up, self.up_arrow.anchoredPosition.x + 20) -- 通过这两个列表重新获得一个新的属性列表 local data_list = self.model:GetPsionicLevelAttrList(attr_cur, attr_next) self.attr_item_creator = self.attr_item_creator or self:AddUIComponent(UI.ItemListCreator) local info = { data_list = data_list, scroll_view = self.attr_scroll, item_con = self.attr_con, prefab_ab_name = "psionic", prefab_res_name = "PsionicAdvanceBreakAttrItem", item_height = 28, start_y = -7.5, space_y = 8, create_frequency = 0.01, alignment = UnityEngine.TextAnchor.UpperLeft, child_names = { "arrow:obj", "val_name:tmp", "val_cur:tmp", "val_next:tmp", "attr_effect_con", }, on_update_item = function(item, i, v) -- 调整节点大小 item.arrow_obj:SetActive(self.next_psionic_cfg and true or false) item.val_name_tmp.text = WordManager:GetProperties(v.type) item.val_cur_tmp.text = WordManager:GetPropertyValue(v.type, v.cur_val) item.val_next_tmp.text = self.next_psionic_cfg and WordManager:GetPropertyValue(v.type, v.next_val - v.cur_val) or "" -- 属性流光特效 if self.need_show_effect and not item.showing_attr_effect then local function call_back( ) item.showing_attr_effect = false end self:ClearUIEffect(item.attr_effect_con) self:AddUIEffect("ui_jinjieshuxing", item.attr_effect_con, self.layer_name, Vector3(-175,0,0), 1, false, 0.75, nil, call_back) item.showing_attr_effect = true end end, } self.attr_item_creator:UpdateItems(info) -- 判断是否要显示下一等级的星星表现 self.arrow1_obj:SetActive(self.next_psionic_cfg and true or false) self.arrow2_obj:SetActive(self.next_psionic_cfg and true or false) SetAnchoredPositionX(self.star_con_cur, self.next_psionic_cfg and 228.5 or 312.5) SetAnchoredPositionX(self.item_cur, self.next_psionic_cfg and 228.5 or 312.5) -- 加载当前星数 for k, v in ipairs(self.cur_star_list) do v.gameObject:SetActive(false) end local cur_star_num = self.goods_vo.star local offset_x = (self.star_con_cur.sizeDelta.x - cur_star_num * 22) / 2 for i = 1, cur_star_num do self.cur_star_list[i] = self.cur_star_list[i] or UiFactory.createChild(self.star_con_cur, UIType.Image2, "star" .. i) SetAnchoredPosition(self.cur_star_list[i].transform, (i-1) * 22 + offset_x - 1, -3) lua_resM:setImageSprite(self, self.cur_star_list[i]:GetComponent("Image"), "psionic_asset", "ps_star_1", true) self.cur_star_list[i].gameObject:SetActive(true) end -- 加载下一级星数 for k, v in ipairs(self.next_star_list) do v.gameObject:SetActive(false) end if self.next_psionic_cfg then self.next_equip_item:SetData(nil, PsionicConst.ArmorItemFlag.Show, nil, self.goods_vo.next) self.next_equip_item:SetVisible(true) local next_equip_cfg = Config.Nucleonequip[self.goods_vo.next] local next_star_num = next_equip_cfg.star local offset_x = (self.star_con_next.sizeDelta.x - next_star_num * 22) / 2 for i = 1, next_star_num do self.next_star_list[i] = self.next_star_list[i] or UiFactory.createChild(self.star_con_next, UIType.Image2, "star" .. i) SetAnchoredPosition(self.next_star_list[i].transform, (i-1) * 22 + offset_x - 1, -3) lua_resM:setImageSprite(self, self.next_star_list[i]:GetComponent("Image"), "psionic_asset", "ps_star_1", true) self.next_star_list[i].gameObject:SetActive(true) end else self.next_equip_item:SetVisible(false) end end -- 加载进化用材料装备 function PsionicAdvanceBreakView:UpdateMaterialArmorItem() -- 加载材料装备和基础材料的消耗配置 local cost_cfg = self.goods_vo.cost local cost_item_num = #cost_cfg for k, v in pairs(self.cost_item_list) do v:SetVisible(false) end self.has_enough_equip = true -- 提前记录,是否已经存在了足够的装备材料 if self.goods_vo.next == 0 then -- 已经不需要再进化了 -- 后续补上满破的表现 self.has_enough_equip = false self.cost_item_bg_obj:SetActive(false) self.confirm_btn_obj:SetActive(false) self.sub_title1_obj:SetActive(false) self.line1_obj:SetActive(false) self.line2_obj:SetActive(false) else self.cost_item_bg_obj:SetActive(true) self.confirm_btn_obj:SetActive(true) self.sub_title1_obj:SetActive(true) self.line1_obj:SetActive(true) self.line2_obj:SetActive(true) local offset_x = (298 - cost_item_num * 80) / 2 + 10 for k, v in ipairs(cost_cfg) do self.cost_item_list[k] = self.cost_item_list[k] or UIObjPool:getInstance():PopItem(UIObjPool.UIType.AwardItem, self.cost_item_bg) self.cost_item_list[k]:SetAnchoredPosition(offset_x + (k-1) * 80, 0) self.cost_item_list[k]:SetVisible(true) self.cost_item_list[k]:SetItemSize(62, 62) local typeId, lock = self.goods_model:GetMappingTypeId(v[1], v[2]) local have_num = self.goods_model:GetPsionicBagGoodsNumByTypeID(typeId, self.goods_vo.goods_id) self.cost_item_list[k]:SetData(typeId, 0, nil, nil, lock) local get_str = string.format("%s/%s", have_num >= v[3] and ColorUtil.GREEN_DARK or ColorUtil.RED_DARK, have_num, v[3]) self.cost_item_list[k]:IsGetGoods(true, get_str) self.has_enough_equip = self.has_enough_equip and have_num >= v[3] end end end function PsionicAdvanceBreakView:UpdateBreakBtnRed( ) if self.goods_vo then -- 先判断有没有红点,再判断是不是身上穿的 -- local bool = self.model:GetPsionicBreakSlotRed(self.goods_vo.subtype) -- if bool then -- local cur_equip_vo = self.goods_model:GetPsionicEquipBySlot(self.goods_vo.subtype) -- self.confirm_btn_red_obj:SetActive(cur_equip_vo.goods_id == self.goods_vo.goods_id) -- else -- self.confirm_btn_red_obj:SetActive(false) -- end local break_red = self.slot_break_red_equip_list[self.goods_vo.subtype] and self.slot_break_red_equip_list[self.goods_vo.subtype] == self.goods_vo.goods_id or false self.confirm_btn_red_obj:SetActive(break_red) else self.confirm_btn_red_obj:SetActive(false) end end -- 进化按钮逻辑 function PsionicAdvanceBreakView:OnConfirmBtnClick( ) if self.has_enough_equip then -- 缓存当前进化对象的物品id,用于做物品升级后的结算表现 self.model._break_type_id_cache[self.goods_vo.goods_id] = DeepCopy(self.goods_vo) -- bag_type 道具背包类型 GoodsModel.GOODS_POS_TYPE self.model:Fire(PsionicConst.REQUEST_CCMD_EVENT, 13907, self.goods_vo.goods_id, self.goods_vo.bag_type) else Message.show("圣物装备不足", "fault") end end function PsionicAdvanceBreakView:__delete( ) if self.cur_equip_item then self.cur_equip_item:DeleteMe() self.cur_equip_item = nil end if self.next_equip_item then self.next_equip_item:DeleteMe() self.next_equip_item = nil end for k, v in pairs(self.cost_item_list) do UIObjPool:getInstance():PushItem(UIObjPool.UIType.AwardItem, v) end self.cost_item_list = nil end