local UIHeroLevelUp = UIViewClass() local resonance_info = require 'Proto/resonance_info_pb' local _heroLastLevel --武将上次的等级用于经验值动画 local _heroLastId -- 上次选择的武将,防止切换到不同武将时等级不同也播放升级特效 local EventSystem = require('Event/EventSystem') local _isOneKeyUpdate = false --武将一键升级为true时,不显示经验动画 local UpdateFrequency = 0.075 local _pressInterval=0.02 function UIHeroLevelUp:OnCreated() self.sliderAni = self.slider_XP.transform:GetComponent(typeof(SliderAnimation)) end function UIHeroLevelUp:OnOpened() _isOneKeyUpdate = false self.itemEvent= {} for i=1,4 do self:RegistTriggerEvent(self.item[i].item.event_Click, UIEventTriggerType.PointerDown) self:RegistTriggerEvent(self.item[i].item.event_Click, UIEventTriggerType.PointerUp) self:RegistTriggerEvent(self.item[i].btn_Get, UIEventTriggerType.PointerDown) self.itemEvent[i] = {} self.itemEvent[i].isOpenPress = false self.itemEvent[i].tempPressTime = 0 self.itemEvent[i].tempTotalPressTime = 0 end self:RegistSystemEvent(EventID.UI_HeroShow_UpdateHeroShow, self.ShowUpgradeInfo) self:RegistSystemEvent(EventID.UI_ResonanceChange_Refresh, self.RefreshResonanceLv) self:RefreshResonanceLv() CTL.FormationResonance.SetSubResonanceImage(self.icon_Resonance, resonance_info.Hero_Level) UIUtils.SetLabelText(self.lab_HP, Const_IDS[DataSheetManager.AttrData:GetDataByID(LuaConst.AttrTypeId.hplmt).Name]) UIUtils.SetLabelText(self.lab_ATK, Const_IDS[DataSheetManager.AttrData:GetDataByID(LuaConst.AttrTypeId.atk).Name]) UIUtils.SetLabelText(self.lab_DEF, Const_IDS[DataSheetManager.AttrData:GetDataByID(LuaConst.AttrTypeId.def).Name]) self:SetHeroLastLevel() self:UpdateHeroShow(true) self:OnExpPillUpdate() CTL.Bag.RegisteEventByItemType(LuaConst.ItemType.Materials, self.OnExpPillUpdate, self, LuaConst.ItemMaterialsType.ExpPill) end function UIHeroLevelUp:OnExpPillUpdate(itemFirstType) for i, v in DataSheetManager.HeroLevelMaterial:GetEnumerator() do if i <= 4 then self:InitItem(i, v.ItemID) else break end end self:RefreshRedPoint() end function UIHeroLevelUp:RefreshResonanceLv() if MDL.Unlock.IsUnlock(MDL.Unlock.FunctionType.Resonance) then UIUtils.SetActive(self.btn_Resonance, true) else UIUtils.SetActive(self.btn_Resonance, false) end UIUtils.SetLabel(self.txt_ResonanceLv, string.FormatByIdsId(Const_IDS["IDS_Resonance_Level"], MDL.FormationResonance.GetSubResonanceLv(resonance_info.Hero_Level))) end function UIHeroLevelUp:InitItem(index, itemId) local data = MDL.Bag.GetItemInOneCell(itemId) if not data then self.item[index].state:SetState(1) else self.item[index].state:SetState(0) UTL.Item.SetItemCell(self.item[index].item,itemId,data.Count) end self.itemEvent[index].itemId = itemId end function UIHeroLevelUp:OnClosed() CTL.Bag.UnRegisteEventByItemType(LuaConst.ItemType.Materials, self.OnExpPillUpdate, self, LuaConst.ItemMaterialsType.ExpPill) self:StopPressItem() end --更新武将信息 function UIHeroLevelUp:UpdateHeroShow(isInit) local heroId = MDL.HeroSelect.curSelectHeroID if isInit then self:SetHeroLastLevel() end if MDL.HeroSelect.IsCanShowRankUp(heroId) then self:StopPressItem() self:ShowUpgradeInfo(isInit) else self:ShowUpgradeInfo(isInit) end end function UIHeroLevelUp:SetExtraStateNumberActive(active) UIUtils.SetActive(self.txt_ATKAdd, active) UIUtils.SetActive(self.txt_DEFAdd, active) UIUtils.SetActive(self.txt_HPAdd, active) UIUtils.SetActive(self.img_HPAdd, active) UIUtils.SetActive(self.img_ATKAdd, active) UIUtils.SetActive(self.img_DEFAdd, active) end function UIHeroLevelUp:ShowUpgradeInfo(isInit) UIUtils.SetActive(self.group_Upgrades,true) self.slider_XP.value = 0 self:ShowBaseInfo() self:RefreshExpInfo(isInit) self:OnExpPillUpdate() end function UIHeroLevelUp:RefreshRedPoint() local heroId = MDL.HeroSelect.curSelectHeroID local isShowRedPoint = CTL.HeroSelect.IsBagExpEnoughLevelUp(heroId) self.btn_Next:SetRedPoint(isShowRedPoint) self.btn_Max:SetRedPoint(isShowRedPoint) local isRank = MDL.HeroSelect.IsCanRankUp(heroId) self.btn_Nobility:SetRedPoint(isRank) end function UIHeroLevelUp:RefreshExpInfo(isInit) local heroId = MDL.HeroSelect.curSelectHeroID --经验值显示 local exp = MDL.HeroSelect.GetHeroExp(heroId) local nextLevelExp = MDL.HeroSelect.GetHeroNextLevelExp(heroId) UIUtils.SetLabel(self.txt_XP, string.format("%s/%s", exp, nextLevelExp)) local currentLevel = MDL.HeroSelect.GetHeroLevel(heroId) local lastLevel, lastId = self:GetHeroLastLevelAndID() local diffLevel = currentLevel - lastLevel if diffLevel >= 1 and heroId == lastId then EventSystem.Dispatch(EventID.UI_HeroShow_PlayLevelUpEffect) end if(isInit or _isOneKeyUpdate) then self.sliderAni.enabled = false self.slider_XP.value = exp / nextLevelExp else self:UpdateExpAnimation(diffLevel, exp / nextLevelExp) _isOneKeyUpdate = false end end function UIHeroLevelUp:ShowBaseInfo() local heroId = MDL.HeroSelect.curSelectHeroID --等级显示 local currentLevel = MDL.HeroSelect.GetHeroLevel(heroId) local heroLevelUpData = DataSheetManager.HeroLevelUp:GetDataByHeroLevel(currentLevel) local levelStr = UTL.Item.GetNobilityByTeamLevel(heroLevelUpData.HeroLevel, 2) -- 爵位转换 local teamLevelName = string.FormatByIdsId(Const_IDS[heroLevelUpData.TeamLevelName], levelStr) UIUtils.SetLabel(self.txt_LvBefore, teamLevelName) if MDL.HeroSelect.IsHeroReachMaxLevel(heroId) then UIUtils.SetActive(self.sprite_Arrow, false) UIUtils.SetActive(self.txt_LvAfter, false) else UIUtils.SetActive(self.sprite_Arrow, true) UIUtils.SetActive(self.txt_LvAfter, true) local _heroLevelUpData = DataSheetManager.HeroLevelUp:GetDataByHeroLevel(currentLevel + 1) local _levelStr = UTL.Item.GetNobilityByTeamLevel(_heroLevelUpData.HeroLevel, 2) -- 爵位转换 local _teamLevelName = string.FormatByIdsId(Const_IDS[_heroLevelUpData.TeamLevelName], _levelStr) UIUtils.SetLabel(self.txt_LvAfter, _teamLevelName) end -- 是否在进爵阶段 local isCanNobility = MDL.Nobility.GetCanNobilityByHeroLevel(currentLevel) self.switchState:SetState(isCanNobility and 1 or 0) --显示攻防血信息 local currentLevel = MDL.HeroSelect.GetHeroLevel(heroId) local attrTypeId = MDL.HeroSelect.GetHeroLevelAttrID(heroId) local heroNextLevel = currentLevel + 1 local heroStar = MDL.HeroStar.GetHeroStarLevel(heroId) local isReachMaxLevel = MDL.HeroSelect.IsHeroReachMaxLevel(heroId) local atk, def, hp = MDL.HeroSelect.GetAtkDefHp(attrTypeId, currentLevel, heroStar) --当前攻防血 UIUtils.SetLabel(self.txt_ATKPresent, tostring(atk)) UIUtils.SetLabel(self.txt_DEFPresent, tostring(def)) UIUtils.SetLabel(self.txt_HPPresent, tostring(hp)) if isReachMaxLevel then self:SetExtraStateNumberActive(false) else local nextAtk, nextDef, nextHp= MDL.HeroSelect.GetAtkDefHp(attrTypeId, heroNextLevel, heroStar) if isCanNobility then local nobilityAttrTypeId = MDL.HeroSelect.GetHeroNobilityAttrID(heroId) local curNobilityID = MDL.HeroSelect.GetHeroRankLevel(heroId) local data = DataSheetManager.HeroNobilityAttr:GetDataByHeroAttrTypeID_NobilityID(nobilityAttrTypeId, curNobilityID + 1).Attr_Table if curNobilityID == 1 then for i = 1, #data do if data[i].AttrID == 1 then nextHp = nextHp + data[i].AttrNum elseif data[i].AttrID == 2 then nextAtk = nextAtk + data[i].AttrNum elseif data[i].AttrID == 3 then nextDef = nextDef + data[i].AttrNum end end else local curData = DataSheetManager.HeroNobilityAttr:GetDataByHeroAttrTypeID_NobilityID(nobilityAttrTypeId, curNobilityID).Attr_Table for i = 1, #data do if data[i].AttrID == 1 then nextHp = nextHp + (data[i].AttrNum - curData[i].AttrNum) elseif data[i].AttrID == 2 then nextAtk = nextAtk + (data[i].AttrNum - curData[i].AttrNum) elseif data[i].AttrID == 3 then nextDef = nextDef + (data[i].AttrNum - curData[i].AttrNum) end end end end self:SetExtraStateNumberActive(true) --增加的攻防血 UIUtils.SetLabel(self.txt_ATKAdd, tostring(nextAtk)) UIUtils.SetLabel(self.txt_DEFAdd, tostring(nextDef)) UIUtils.SetLabel(self.txt_HPAdd, tostring(nextHp)) end end function UIHeroLevelUp:UpdateExpAnimation(diffLevel, endValue) if self.sliderAni then self.sliderAni.enabled = true self.sliderAni:Init(self.slider_XP.value, diffLevel, endValue) else logging.warn(LTAG.CRIT, "not find SliderAnimation") end end --武将升级 function UIHeroLevelUp:HeroUpgrade() self:SetHeroLastLevel() MDL.HeroSelect.AddHeroExpRequest(MDL.HeroSelect.curSelectHeroID, MDL.HeroSelect.HeroAddExpType.Upgrade, 0, 1) end --武将一键升级 function UIHeroLevelUp:HeroUpgradeOneKey() self:SetHeroLastLevel() MDL.HeroSelect.AddHeroExpRequest(MDL.HeroSelect.curSelectHeroID, MDL.HeroSelect.HeroAddExpType.OneKeyUpgrade, 0, 1) _isOneKeyUpdate=true end --武将进爵 function UIHeroLevelUp:HeroRankLevelUp() local teamLevel = MDL.Player.GetRoleLevel() local heroId = MDL.HeroSelect.curSelectHeroID local currentLevel = MDL.HeroSelect.GetHeroLevel(heroId) if teamLevel > currentLevel then MDL.Nobility.NobilityHeroUpRequest(heroId) else CTL.Tips.AddTipsMsg(Const_IDS["IDS_Nobility_AfterRank"]) end end --停止点击升级道具 function UIHeroLevelUp:StopPressItem() if self.upgradeItems then for i = 1, #self.upgradeItems do self.upgradeItems[i]:StopPress() end end end --武将消耗道具升级 function UIHeroLevelUp:HeroUpgradeCostItem(itemId, count) if MDL.Nobility.GetCanNobilityByHeroLevel(MDL.HeroSelect.GetHeroLevel(MDL.HeroSelect.curSelectHeroID)) then CTL.Tips.AddTipsMsg(Const_IDS["IDS_Nobility_AfterRank"]) else self:SetHeroLastLevel() MDL.HeroSelect.AddHeroExpRequest(MDL.HeroSelect.curSelectHeroID, MDL.HeroSelect.HeroAddExpType.CostItem, itemId, count) end end function UIHeroLevelUp:SetHeroLastLevel() local heroId=MDL.HeroSelect.curSelectHeroID local currentLevel=MDL.HeroSelect.GetHeroLevel(heroId) _heroLastLevel=currentLevel _heroLastId = heroId end function UIHeroLevelUp:GetHeroLastLevelAndID() return _heroLastLevel, _heroLastId end function UIHeroLevelUp:OnButtonClicked(obj) if(obj==self.btn_Next) then --升级 self:HeroUpgrade() elseif(obj==self.btn_Max) then --一键升级 self:HeroUpgradeOneKey() elseif(obj==self.btn_Nobility) then --进爵 self:HeroRankLevelUp() elseif obj == self.btn_Resonance then UIManager.OpenView(Const_UI_Lua.UIEnum.UIResonanceInfo, {subResonanceID = resonance_info.Hero_Level, isShowGoto = false}) end end function UIHeroLevelUp:OnPointerUp(obj, eventData) for i, v in ipairs(self.item) do if obj == v.item.event_Click then self.itemEvent[i].isOpenPress = false self.itemEvent[i].tempTotalPressTime = 0 end end end function UIHeroLevelUp:OnPointerDown(obj, eventData) for i, v in ipairs(self.item) do if obj == v.btn_Get then local itemId = self.itemEvent[i].itemId UTL.ItemTips.ShowCommonTipsById(itemId) elseif obj == v.item.event_Click then self:OnClickItem(i) end end end function UIHeroLevelUp:OnClickItem(index) local itemId = self.itemEvent[index].itemId local count = self:GetNeedCostItemCount(index) self:HeroUpgradeCostItem(itemId,count) self.itemEvent[index].isOpenPress = true self:StopRepeatFunc(self.OnUpdateFun) self:StartRepeatFunc(self.OnUpdateFun, UpdateFrequency) self.itemEvent[index].tempPressTime = -0.05 end function UIHeroLevelUp:OnUpdateFun(deltaTime, timeSinceUpdate) for i=1,4 do if self.itemEvent[i].isOpenPress then if self.itemEvent[i].tempPressTime >= _pressInterval then self.itemEvent[i].tempPressTime = 0 local count=self:GetNeedCostItemCount(i) if count >0 then self:HeroUpgradeCostItem(self.itemEvent[i].itemId,count) else self.itemEvent[i].isOpenPress = false end else self.itemEvent[i].tempPressTime=self.itemEvent[i].tempPressTime+deltaTime end self.itemEvent[i].tempTotalPressTime = self.itemEvent[i].tempTotalPressTime + deltaTime end end end function UIHeroLevelUp:GetNeedCostItemCount(index) local count=0 if self.itemEvent[index].tempTotalPressTime>3 then count= 10 elseif self.itemEvent[index].tempTotalPressTime>1 then count= 5 elseif self.itemEvent[index].tempTotalPressTime>0.5 then count= 3 else count= 1 end local hasCount =self:GetItemCount(index) if(hasCount==0) then return 0 else if hasCount>=count then return count else return hasCount end end end function UIHeroLevelUp:GetItemCount(index) local itemId = self.itemEvent[index].itemId local data = MDL.Bag.GetItemInOneCell(itemId) if data then return data.Count else return 0 end end return UIHeroLevelUp