PsionicSkillView = PsionicSkillView or BaseClass(BaseItem) local PsionicSkillView = PsionicSkillView function PsionicSkillView:__init(parent_wnd,prefab_asset,layer_name) self.base_file = "psionic" self.layout_file = "PsionicSkillView" self.parent_wnd = parent_wnd self.layer_name = layer_name self.model = PsionicModel:getInstance() self.goods_model = GoodsModel:getInstance() self.cur_lv_pro = {} self.next_lv_pro = {} self.upgrade_need_num = nil -- 缓存升级需要材料数 self:Load() end function PsionicSkillView:Load_callback() local nodes = { "bg:raw", "upgrade_btn:obj:img", "upgrade_btn/upgrade_red:obj", "upgrade_btn/upgrade_btn_lb:tmp", -- 技能等级描述相关节点 "skill_stage_lb1:tmp", "skill_stage_lb2:tmp", "skill_progress_con1", "skill_progress_con2:obj", "arrow1:obj", "arrow2:obj", "skill_lvBg1", "skill_lvBg2:obj", -- 等级战力相关 "power_con:obj", "power_con/up_arrow:obj", "power_con/power_cur:txt", "power_con/power_up:tmp", "power_con/power_lb1:tmp", -- 技能节点相关 "skill_icon1:img", "skill_lv1:tmp", "skill_icon2:obj:img", "skill_lv2:tmp", -- 技能描述 "skill_desc:tmp", -- 技能描述容器内节点 "attr_scroll", "attr_scroll/Viewport/attr_con", -- 觉醒花费相关 "cost_item_bg:obj", "cost_item_con", "cost_item_name:tmp", "cost_item_num:tmp", } self:GetChildren(nodes) self.power_lb1_tmp.text = "战力" lua_resM:setOutsideRawImage(self, self.bg_raw, GameResPath.GetViewBigBg("ps_main_skill_bg")) self.cost_item = UIObjPool:getInstance():PopItem(UIObjPool.UIType.AwardItem, self.cost_item_con) self.cost_item:SetAnchoredPosition(0, 0) self.cost_item:SetItemSize(78, 78) self.cost_item:SetVisible(false) self:AddEvents() if self.need_refreshData then self:UpdateView() end end function PsionicSkillView:AddEvents( ) local function click_event(target, x, y) if target == self.upgrade_btn_obj then -- 升级按钮 self:OnClickUpgradeBtn() end end AddClickEvent(self.upgrade_btn_obj, click_event, LuaSoundManager.SOUND_UI.NONE) -- 技能等级提升后刷新技能等级相关数据 local function update_skill_data(pos) if not pos or (self.skill_data and self.skill_data.pos == pos) then self:UpdateView() end end self:BindEvent(self.model, PsionicConst.UPDATE_SLOT_SKILL, update_skill_data) -- 技能觉醒等级提升后刷新下级突破配置及消耗信息 local function update_awake_data(pos) if not pos or (self.skill_data and self.skill_data.pos == pos) then self:UpdateAttrItem() self:UpdateUpgradeCost() self:UpdateSkillRed() end end self:BindEvent(self.model, PsionicConst.UPDATE_PSIONIC_AWAKE_DATA, update_awake_data) local function update_skill_red(tab_id) if not tab_id or tab_id == PsionicConst.TabId.PSkill then self:UpdateUpgradeCost() end end self:BindEvent(self.model, PsionicConst.UPDATE_RED_BY_TABID, update_skill_red) end -- data为服务端返回的技能数据 13900 function PsionicSkillView:SetData( skill_data ) self.skill_data = skill_data if self.is_loaded then self.need_refreshData = false self:UpdateView() else self.need_refreshData = true end end function PsionicSkillView:UpdateView( ) if self.skill_data then self.skill_lv = self.skill_data and self.skill_data.skill_lv or 1 -- 技能等级 self.awake_lv = self.skill_data and self.skill_data.sec_lv or 0 -- 觉醒等级 -- 技能等级配置 Config.Nucleonsection self.skill_lv_cfg = self.model:GetPsionicAwakeCfg(self.skill_data.pos, self.awake_lv) self.skill_cfg = ConfigItemMgr.Instance:GetSkillItem(self.skill_data.skill_id) local is_max = self.skill_lv_cfg.next == 0 -- 是否已经升满 self.next_skill_lv_cfg = not is_max and self.model:GetPsionicAwakeCfg(self.skill_data.pos, self.awake_lv + 1) or nil self.sec_skill_id = self.next_skill_lv_cfg and self.next_skill_lv_cfg.sec_skill[1][1] or nil if not self.sec_skill_id then -- 拿不到下一级的配置,就拿当前的配置 self.sec_skill_id = self.skill_lv_cfg and self.skill_lv_cfg.sec_skill[1][1] or nil end self.next_sec_skill_lv = self.next_skill_lv_cfg and self.next_skill_lv_cfg.sec_skill[1][2] or 1 self.sec_skill_cfg = self.sec_skill_id and ConfigItemMgr.Instance:GetSkillItem(self.sec_skill_id) or nil self:UpdateBasicData() self:UpdateSkillLvData() self:UpdateAttrItem() self:UpdateUpgradeCost() end self:UpdateSkillRed() end -- 加载基础数据(一次更新只加载一次) function PsionicSkillView:UpdateBasicData( ) -- self.skill_name_tmp.text = Trim(self.skill_cfg.name) lua_resM:setOutsideImageSprite(self, self.skill_icon1_img, GameResPath.GetSkillIcon(self.skill_data.skill_id)) lua_resM:setOutsideImageSprite(self, self.skill_icon2_img, GameResPath.GetSkillIcon(self.skill_data.skill_id)) end -- 根据技能等级记载配置数据 function PsionicSkillView:UpdateSkillLvData( ) local is_max = self.skill_lv_cfg.next == 0 -- 是否已经升满 self.skill_lv1_tmp.text = string.format("Lv.%s", self.awake_lv) self.skill_lv2_tmp.text = is_max and "" or string.format("Lv.%s", self.awake_lv+1) -- 加载描述 -- 获取目标等级的配置 local desc = "" local lvs_cfg = self.skill_cfg.lvs and self.skill_cfg.lvs[1] or nil -- 主技能只有1级 if lvs_cfg then desc = Trim(lvs_cfg.desc) end -- 下一级的描述 local next_lvs_cfg = not is_max and self.sec_skill_cfg.lvs and self.sec_skill_cfg.lvs[self.next_sec_skill_lv] or nil if next_lvs_cfg then desc = desc .. string.format("\n下一级:%s", Trim(next_lvs_cfg.desc)) elseif is_max then -- 满级的情况,就使用当前等级的 local cur_sec_skill_lv = self.skill_lv_cfg and self.skill_lv_cfg.sec_skill[1] and self.skill_lv_cfg.sec_skill[1][2] or 1 desc = desc .. string.format("\n%s", Trim(self.sec_skill_cfg.lvs[cur_sec_skill_lv].desc)) end self.skill_desc_tmp.text = desc -- 加载等级描述 self.skill_stage_lb1_tmp.text = string.format("%s段觉醒", ChineseNumber(self.awake_lv)) self.skill_stage_lb2_tmp.text = is_max and "" or string.format("%s段觉醒", ChineseNumber(self.awake_lv+1)) -- 加载进度节点 -- 当前等级 for i = 1, 6 do self.cur_lv_pro[i] = self.cur_lv_pro[i] or UiFactory.createChild(self.skill_progress_con1, UIType.Image, "pro" .. i) SetAnchoredPosition(self.cur_lv_pro[i].transform, (i-3) * 12 - 6, -6) lua_resM:setImageSprite(self, self.cur_lv_pro[i]:GetComponent("Image"), "psionic_asset", i <= self.awake_lv and "ps_skill_pro1" or "ps_skill_pro0", true) end -- 下一等级 if not is_max then for i = 1, 6 do self.next_lv_pro[i] = self.next_lv_pro[i] or UiFactory.createChild(self.skill_progress_con2, UIType.Image, "pro" .. i) SetAnchoredPosition(self.next_lv_pro[i].transform, (i-3) * 12 - 6, -6) lua_resM:setImageSprite(self, self.next_lv_pro[i]:GetComponent("Image"), "psionic_asset", i <= (self.awake_lv + 1) and "ps_skill_pro1" or "ps_skill_pro0", true) end end -- 根据技能等级调整节点 self:UpdateNodePos(is_max) end -- 加载属性节点和升级道具 function PsionicSkillView:UpdateAttrItem( ) local is_max = self.skill_lv_cfg.next == 0 -- 是否已经升满 self.attr_next = not is_max and self.model:GetPsionicAwakeCfg(self.skill_data.pos, self.skill_lv_cfg.next) or nil local info_list = {} -- 组合配置 local cur_attr = self.skill_lv_cfg.attrs local cur_power = GetFighting(cur_attr) self.power_cur_txt.text = cur_power local next_attr = self.attr_next and self.attr_next.attrs or nil -- 更新战力和战力节点位置 local total_len = self.power_cur_txt.preferredWidth + self.power_lb1_tmp.preferredWidth if next_attr then local next_power = GetFighting(next_attr) self.power_up_tmp.text = next_power - cur_power 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, next_attr 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 combine_attr_list = self.model:GetPsionicLevelAttrList(cur_attr, next_attr) -- 属性条目 for k, v in ipairs(combine_attr_list) do info_list[#info_list+1] = {attr_list = v, is_max = is_max} end self.attr_item_creator = self.attr_item_creator or self:AddUIComponent(UI.ItemListCreator) local info = { data_list = info_list, scroll_view = self.attr_scroll, item_con = self.attr_con, item_class = PsionicSkillAttrItem, item_height = 36, start_x = 6, start_y = -4, space_y = 0, create_frequency = 0.01, alignment = UnityEngine.TextAnchor.UpperLeft, on_update_item = function(item, i, v) item:SetData(v, i) end, } self.attr_item_creator:UpdateItems(info) end -- 根据技能等级调整节点 function PsionicSkillView:UpdateNodePos(is_max) self.arrow1_obj:SetActive(not is_max) self.arrow2_obj:SetActive(not is_max) self.skill_lvBg2_obj:SetActive(not is_max) self.skill_icon2_obj:SetActive(not is_max) self.skill_progress_con2_obj:SetActive(not is_max) SetAnchoredPositionX(self.skill_stage_lb1, is_max and 304.5 or 213) SetAnchoredPositionX(self.skill_progress_con1, is_max and 304.5 or 213) SetAnchoredPositionX(self.skill_icon1, is_max and 304.5 or 213) SetAnchoredPositionX(self.skill_lv1, is_max and 304.5 or 213) SetAnchoredPositionX(self.skill_lvBg1, is_max and 304.5 or 213) end function PsionicSkillView:UpdateUpgradeCost( ) -- 加载升级花费 if self.attr_next then -- 存在下一级的配置,就还没满级 local cost = self.skill_lv_cfg.cost[1] local typeId, lock = self.goods_model:GetMappingTypeId(cost[1], cost[2]) local have_num = self.goods_model:GetTypeGoodsNum(typeId) self.cost_item:SetData(typeId, 0, nil, nil, lock) self.cost_item:SetVisible(true) self.cost_item_name_tmp.text = self.goods_model:getGoodsName(typeId, true, true) self.cost_item_num_tmp.text = string.format("需求数量:%s/%s", cost[3] <= have_num and ColorUtil.GREEN_DARK or ColorUtil.RED_DARK, have_num, cost[3]) self.upgrade_need_num = cost[3] self.upgrade_btn_obj:SetActive(true) self.cost_item_bg_obj:SetActive(true) else self.cost_item_name_tmp.text = "" self.cost_item_num_tmp.text = "" self.cost_item:SetVisible(false) self.upgrade_btn_obj:SetActive(false) self.cost_item_bg_obj:SetActive(false) self.upgrade_need_num = nil end end -- 点击升级按钮回调 function PsionicSkillView:OnClickUpgradeBtn( ) if self.skill_data and self.attr_next and self.upgrade_need_num then local cost = self.skill_lv_cfg.cost[1] local have_num = self.goods_model:GetTypeGoodsNum(cost[2]) if have_num < self.upgrade_need_num then Message.show("道具不足") UIToolTipMgr:getInstance():AppendGoodsTips(cost[2], x, y, nil, nil, nil, nil, true) return end -- local function ok( ... ) if not self.model._block_skill_upgrade_click then self.model:Fire(PsionicConst.REQUEST_CCMD_EVENT, 13908, self.skill_data.pos) self.model._block_skill_upgrade_click = true end -- end -- local ask_str = string.format("是否确定消耗%s %s进行圣物觉醒?", -- self.upgrade_need_num, self.goods_model:getGoodsName(cost[2], true, false)) -- Alert.show(ask_str, Alert.Type.Two, ok, nil, "确定", "取消") end end function PsionicSkillView:UpdateSkillRed( ) local skill_red = self.skill_data and self.model:GetPsionicSkillSlotRedCache(self.skill_data.pos) or false self.upgrade_red_obj:SetActive(skill_red) SetImageGray(self.upgrade_btn_img, not skill_red) SetTMPSharedMaterial(self.upgrade_btn_lb_tmp, skill_red and ShaderTools.TMPSharedMaterialType.FZZZOutlineDarkOrangeBtn or ShaderTools.TMPSharedMaterialType.FZZZOutlineDarkGrayBtn) end function PsionicSkillView:__delete( ) if self.cost_item then UIObjPool:getInstance():PushItem(UIObjPool.UIType.AwardItem, self.cost_item) end self.cost_item = nil self.model._block_skill_upgrade_click = false -- 关闭界面时取消掉这个点击屏蔽 end