local UIPrefabObject = require "app/bf/unity/uiprefab_object" local BattleUI = class("BattleUI", BaseUI) local GRID_CELL = "app/ui/battle/cell/grid_cell" local GRID_CELL_PATH = "assets/prefabs/ui/battle/cell/grid_cell.prefab" local SKILL_NODE_CELL = "app/ui/battle/cell/skill_node_cell" local SELECT_SKILL_CELL = "app/ui/battle/cell/select_skill_cell" local BATTLE_SELECT_SKILL_COMP = "app/ui/battle/battle_skill_select_comp" local DEFAULT_X = 10000 local BOARD_POS_UP = BF.Vector2(0, 47) local BOARD_POS_DOWN = BF.Vector2(0, -740) local BG_PATH = "assets/arts/textures/background/battle/%s.png" local CacheVector2 = CS.UnityEngine.Vector2(0, 0) local CACHE_SKILL_POS_1 = {x = 10, y = 360} local CACHE_SKILL_POS_2 = {x = 10, y = 420} local BATTLE_COMMON_PATH = "assets/arts/textures/background/battle_common/%s.png" function BattleUI:getPrefabPath() return "assets/prefabs/ui/battle/battle_ui.prefab" end function BattleUI:onClose() self:clear() end function BattleUI:getBGMId() return AudioManager.BGM_ID.BATTLE end function BattleUI:onLoadRootComplete() self:_display() self:_addListeners() self:_bind() end function BattleUI:_display() local uiMap = self.root:genAllChildren() self.uiMap = uiMap self.gridNode = uiMap["battle_ui.bg_2.board_node.grid_node"] self.boardNode = uiMap["battle_ui.bg_2.board_node"] self.boardNode:setAnchoredPositionX(DEFAULT_X) self.boardMask2D = self.gridNode:getComponent(GConst.TYPEOF_UNITY_CLASS.UI_RECT_MASK_2D) self.boardMask = uiMap["battle_ui.bg_2.board_node.grid_node.board_mask"] self.boardMask:setVisible(false) self.boardCacheNode = uiMap["battle_ui.bg_2.board_cache_node"] self.boardCacheNode:setVisible(false) self.boardCacheBox = uiMap["battle_ui.bg_2.board_cache_node.skill_box"] self.boardCacheBox:setAnchoredPositionX(DEFAULT_X) self.battleRoot = uiMap["battle_ui.battle_root"] self.maxLayerNode = uiMap["battle_ui.battle_root.battle_node.max_layer_show_node"] self:initBg() self:initSkill() self:initBuff() self:initBattlefield() self:initNumberNode() self:initComboNode() self:initHpNode() self:initFxNode() self:hideGenerateSkillGridCells() self:initTutorialNode() self:initUISfxs() self:initSkillSelectCells() self:hideAllSfxSmoke() self:initSkillLineSfx() self:initGenerateSkillEffect() self:initSelectSkillNode() self:initCommonSkillDescTips() self:initBossEnterAni() self:initCounterAttack() end function BattleUI:_addListeners() local uiMap = self.root:genAllChildren() uiMap["battle_ui.top_node.close_btn"]:addClickListener(function() ModuleManager.BattleManager:showPauseUI() end) self:addEventListener(EventManager.CUSTOM_EVENT.SHOW_ELIMINATION_TUTORAIL, function(posIdList) self:showTutorialFinger(posIdList) end) end function BattleUI:_bind() self:bind(DataManager.BattleData, "lvDirty", function() self:refreshLv() end, true) end function BattleUI:initBg() self.bg = self.uiMap["battle_ui.battle_root.bg"] self.bg:setLocalScale(0, 0, 0) local width = self.bg:fastGetSizeDelta() self.bg:setAnchoredPositionX(width/4) end function BattleUI:refreshChessBoard(boardBg) self.boardNode:setTexture(string.format(BATTLE_COMMON_PATH, boardBg), function() self.boardNode:setAnchoredPositionX(0) end) end function BattleUI:loadBg(bgName) self.bg:setTexture(string.format(BG_PATH, bgName), function() self.bg:setLocalScale(1, 1, 1) end) end function BattleUI:moveBattlefield(time) local width = self.bg:fastGetSizeDelta() self.bg:setAnchoredPositionX(width/4) if self.bgMoveTween == nil then self.bgMoveTween = self.bg:getTransform():DOAnchorPosX(-width/4, time) self.bgMoveTween:SetIntId(GConst.DOTWEEN_IDS.BATTLE) self.bgMoveTween:SetAutoKill(false) else local x, y = self.bg:fastGetAnchoredPosition() CacheVector2.x = -width/4 CacheVector2.y = y self.bgMoveTween:ChangeEndValue(CacheVector2, time, true) self.bgMoveTween:Restart() end end function BattleUI:initSkill() if self.skillNodeCells then return end self.skillNodeCells = {} local uiMap = self.root:genAllChildren() for name, elementType in pairs(GConst.BattleConst.ELEMENT_TYPE) do local obj = uiMap["battle_ui.bg_2.skill_node.skill_node_cell_" .. elementType] if obj then self.skillNodeCells[elementType] = CellManager:addCellComp(obj, SKILL_NODE_CELL) local skillEntity = DataManager.BattleData:getSkillEntities()[elementType] if skillEntity then self.skillNodeCells[elementType]:refresh(skillEntity) end self.skillNodeCells[elementType]:getBaseObject():setActive(skillEntity ~= nil) self.skillNodeCells[elementType]:addClickListener(function() ModuleManager.TipsManager:showBattleBoardSkillTips(elementType) end) end end uiMap["battle_ui.bg_2.skill_node"]:getComponent(GConst.TYPEOF_UNITY_CLASS.BF_HORIZONTAL_OR_VERTICAL_LAYOUT):RefreshLayout() end function BattleUI:initBuff() -- buff icon self.atkBuffIconList = { self.uiMap["battle_ui.top_node.buff_l.buff_1"], self.uiMap["battle_ui.top_node.buff_l.buff_2"], self.uiMap["battle_ui.top_node.buff_l.buff_3"], self.uiMap["battle_ui.top_node.buff_l.buff_4"], } for k, v in ipairs(self.atkBuffIconList) do v:addClickListener(function() self.battleController:showBuffTips(1) end) v:setLocalScale(0, 0, 0) end self.atkBuffTextList = { self.uiMap["battle_ui.top_node.buff_l.text_1"], self.uiMap["battle_ui.top_node.buff_l.text_2"], self.uiMap["battle_ui.top_node.buff_l.text_3"], self.uiMap["battle_ui.top_node.buff_l.text_4"], } for k, v in ipairs(self.atkBuffTextList) do v:setText(GConst.EMPTY_STRING) end self.defBuffIconList = { self.uiMap["battle_ui.top_node.buff_r.buff_1"], self.uiMap["battle_ui.top_node.buff_r.buff_2"], self.uiMap["battle_ui.top_node.buff_r.buff_3"], self.uiMap["battle_ui.top_node.buff_r.buff_4"], } for k, v in ipairs(self.defBuffIconList) do v:addClickListener(function() self.battleController:showBuffTips(2) end) v:setLocalScale(0, 0, 0) end self.defBuffTextList = { self.uiMap["battle_ui.top_node.buff_r.text_1"], self.uiMap["battle_ui.top_node.buff_r.text_2"], self.uiMap["battle_ui.top_node.buff_r.text_3"], self.uiMap["battle_ui.top_node.buff_r.text_4"], } for k, v in ipairs(self.defBuffTextList) do v:setText(GConst.EMPTY_STRING) end -- buff的tips self.battleBuffTipsRoot = self.uiMap["battle_ui.battle_buff_tips"] self.battleBuffTipsRoot:setLocalScale(0, 0, 0) local battleBuffTipsMask = self.uiMap["battle_ui.battle_buff_tips.mask"] battleBuffTipsMask:addClickListener(function() if self.autoCloseBuffSid then self:unscheduleGlobal(self.autoCloseBuffSid) self.autoCloseBuffSid = nil end self.battleBuffTipsRoot:setLocalScale(0, 0, 0) end) self.battleBuffTipsBg = self.uiMap["battle_ui.battle_buff_tips.bg"] self.battleBuffTipsBuff = self.uiMap["battle_ui.battle_buff_tips.bg.buff"] self.battleBuffTipsBuffList = {} local children = self.battleBuffTipsBg:getChildList() if children then for k, v in ipairs(children) do table.insert(self.battleBuffTipsBuffList, v) end end end function BattleUI:refreshBuff(side, buffList) if side == GConst.BattleConst.SIDE_ATK then local buffObj = nil local count = #buffList local buffIconCount = #self.atkBuffIconList local index = 1 for i = 1, count do buffObj = buffList[i] if buffObj and buffObj.buff:getIcon() then local icon = self.atkBuffIconList[index] local text = self.atkBuffTextList[index] icon:setLocalScale(1, 1, 1) icon:setSprite(GConst.ATLAS_PATH.ICON_BUFF, buffObj.buff:getIcon()) local round = buffObj.round if round <= 1 or round > 9 then text:setText(GConst.EMPTY_STRING) else text:setText(tostring(round)) end index = index + 1 if index > buffIconCount then break end end end for i = index, buffIconCount do self.atkBuffIconList[i]:setLocalScale(0, 0, 0) self.atkBuffTextList[i]:setText(GConst.EMPTY_STRING) end else local buffObj = nil local count = #buffList local buffIconCount = #self.defBuffIconList local index = 1 for i = 1, count do buffObj = buffList[i] if buffObj and buffObj.buff:getIcon() then local icon = self.defBuffIconList[index] local text = self.defBuffTextList[index] icon:setLocalScale(1, 1, 1) icon:setSprite(GConst.ATLAS_PATH.ICON_BUFF, buffObj.buff:getIcon()) local round = buffObj.round if round <= 1 or round > 9 then text:setText(GConst.EMPTY_STRING) else text:setText(tostring(round)) end index = index + 1 if index > buffIconCount then break end end end for i = index, buffIconCount do self.defBuffIconList[i]:setLocalScale(0, 0, 0) self.defBuffTextList[i]:setText(GConst.EMPTY_STRING) end end end function BattleUI:clearBuff(side) if side == GConst.BattleConst.SIDE_ATK then for k, v in ipairs(self.atkBuffIconList) do v:setLocalScale(0, 0, 0) end for k, v in ipairs(self.atkBuffTextList) do v:setText(GConst.EMPTY_STRING) end else for k, v in ipairs(self.defBuffIconList) do v:setLocalScale(0, 0, 0) end for k, v in ipairs(self.defBuffTextList) do v:setText(GConst.EMPTY_STRING) end end end function BattleUI:showLeftBuffTips(buffList, autoClose) local x = self.battleBuffTipsBg:fastGetAnchoredPosition() if x > 0 then self.battleBuffTipsBg:setAnchoredPositionX(-x) end self:showBuffTips(buffList, autoClose) end function BattleUI:showRightBuffTips(buffList, autoClose) local x = self.battleBuffTipsBg:fastGetAnchoredPosition() if x < 0 then self.battleBuffTipsBg:setAnchoredPositionX(-x) end self:showBuffTips(buffList, autoClose) end function BattleUI:showBuffTips(buffList, autoClose) if #buffList <= 0 then return end self.battleBuffTipsRoot:setLocalScale(1, 1, 1) local buffObj = nil local count = #buffList local index = 1 local addY = 0 for i = 1, count do buffObj = buffList[i] if buffObj and buffObj.buff:getIcon() then local buffTipsObj = self:getBattleBuffTipsObj(index) buffTipsObj:setLocalScale(1, 1, 1) buffTipsObj:setAnchoredPositionY(-addY) local buffTipsObjMap = buffTipsObj:genAllChildren() buffTipsObjMap["buff.icon"]:setSprite(GConst.ATLAS_PATH.ICON_BUFF, buffObj.buff:getIcon()) local round = buffObj.round if round <= 1 or round > 9 then buffTipsObjMap["buff.round"]:setText(GConst.EMPTY_STRING) else buffTipsObjMap["buff.round"]:setText(tostring(round)) end local descTx = buffTipsObjMap["buff.desc"] descTx:setText(buffObj.buff:getDesc()) descTx:getComponent(GConst.TYPEOF_UNITY_CLASS.UI_TEXT_MESH_PRO):ForceMeshUpdate() local height = descTx:getComponent(GConst.TYPEOF_UNITY_CLASS.UI_TEXT_MESH_PRO).renderedHeight if height > 30 then addY = addY + 56 + height - 30 else addY = addY + 56 end index = index + 1 end end for i = index, #self.battleBuffTipsBuffList do self.battleBuffTipsBuffList[i]:setLocalScale(0, 0, 0) end self.battleBuffTipsBg:setSizeDeltaY(addY + 10) if self.autoCloseBuffSid then self:unscheduleGlobal(self.autoCloseBuffSid) self.autoCloseBuffSid = nil end if autoClose then self.autoCloseBuffSid = self:performWithDelayGlobal(function() self.battleBuffTipsRoot:setLocalScale(0, 0, 0) end, 1.5) end end function BattleUI:getBattleBuffTipsObj(index) if self.battleBuffTipsBuffList[index] then return self.battleBuffTipsBuffList[index] end local prefab = CS.UnityEngine.Object.Instantiate(self.battleBuffTipsBuff:getGameObject()) local prefabObject = UIPrefabObject:create() prefabObject:initWithPrefab(self.battleBuffTipsBuff:getAssetPath(), prefab) prefabObject:initPrefabHelper() prefabObject:setParent(self.battleBuffTipsBg, false) table.insert(self.battleBuffTipsBuffList, prefabObject) return prefabObject end function BattleUI:initBattlefield() self.battleNode = self.uiMap["battle_ui.battle_root.battle_node"] end function BattleUI:getBattleNode() return self.battleNode end function BattleUI:initNumberNode() self.battleNumberNode = self.uiMap["battle_ui.battle_root.battle_number_node"] self.battleNumberRed = self.uiMap["battle_ui.cache_node.battle_number_red"] self.battleNumberGreen = self.uiMap["battle_ui.cache_node.battle_number_green"] self.battleNumberBlue = self.uiMap["battle_ui.cache_node.battle_number_blue"] self.battleNumberWhite = self.uiMap["battle_ui.cache_node.battle_number_white"] self.battleNumberSpecial = self.uiMap["battle_ui.cache_node.battle_number_special"] end function BattleUI:getNumberNode() return self.battleNumberNode end function BattleUI:getBattleNumberRed() return self.battleNumberRed end function BattleUI:getBattleNumberGreen() return self.battleNumberGreen end function BattleUI:getBattleNumberBlue() return self.battleNumberBlue end function BattleUI:getBattleNumberWhite() return self.battleNumberWhite end function BattleUI:getBattleNumberSpecial() return self.battleNumberSpecial end function BattleUI:initComboNode() self.comboNode = self.uiMap["battle_ui.top_node.combo"] self.comboAnimator = self.comboNode:getComponent(GConst.TYPEOF_UNITY_CLASS.ANIMATOR) self.comboNodeVisible = false self.comboNode:setVisible(false) self.comboBg1 = self.uiMap["battle_ui.top_node.combo.bg.bg_1"] self.comboBg1:setVisible(false) self.comboTx1 = self.uiMap["battle_ui.top_node.combo.number.text.text_1"] self.comboTxComp1 = self.comboTx1:getComponent(GConst.TYPEOF_UNITY_CLASS.UI_TEXT) self.comboTx2 = self.uiMap["battle_ui.top_node.combo.number.text.text_2"] self.comboTxComp2 = self.comboTx2:getComponent(GConst.TYPEOF_UNITY_CLASS.UI_TEXT) self.comboFx1 = self.uiMap["battle_ui.top_node.combo.bg.vfx_ui_hit_b01"] self.comboFx1:setActive(false) self.comboFxVisible1 = false self.comboFx2 = self.uiMap["battle_ui.top_node.combo.bg.vfx_ui_hit_b02"] self.comboFx2:setActive(false) self.comboFxVisible2 = false self.comboFx3 = self.uiMap["battle_ui.top_node.combo.bg.vfx_ui_hit_b03"] self.comboFx3:setActive(false) self.comboFxVisible3 = false end function BattleUI:hideCombo() if not self.comboNodeVisible then return end self.comboNodeVisible = false if self.comboSid then self:unscheduleGlobal(self.comboSid) end self.comboSid = self:performWithDelayGlobal(function() self.comboSid = nil self.comboNode:setVisible(false) if self.comboFxVisible1 then self.comboFxVisible1 = false self.comboFx1:setActive(false) end if self.comboFxVisible2 then self.comboFxVisible2 = false self.comboFx2:setActive(false) end if self.comboFxVisible3 then self.comboFxVisible3 = false self.comboFx3:setActive(false) end end, 0.5) end function BattleUI:showCombo(count) if count > 99 then count = 99 end self.comboNodeVisible = true self.comboNode:setVisible(true) if count <= 5 then if self.comboFxVisible1 then self.comboFxVisible1 = false self.comboFx1:setActive(false) end if self.comboFxVisible2 then self.comboFxVisible2 = false self.comboFx2:setActive(false) end if self.comboFxVisible3 then self.comboFxVisible3 = false self.comboFx3:setActive(false) end self.comboBg1:setVisible(false) self.comboTx1:setText(GConst.INT_TO_STRING[count], self.comboTxComp1) self.comboTx1:setAnchoredPositionX(0) self.comboTx2:setText(GConst.EMPTY_STRING, self.comboTxComp2) self.comboAnimator:Play(GConst.BattleConst.ANIMATOR_HASH_NAME_BATTLE_COMBO_1, -1, 0) elseif count <= 10 then if self.comboFxVisible1 then self.comboFxVisible1 = false self.comboFx1:setActive(false) end if self.comboFxVisible2 then self.comboFxVisible2 = false self.comboFx2:setActive(false) end if not self.comboFxVisible3 then self.comboFxVisible3 = true self.comboFx3:setActive(true) end self.comboBg1:setVisible(true) self.comboTx1:setText(GConst.INT_TO_STRING[count], self.comboTxComp1) if count == 10 then self.comboTx1:setAnchoredPositionX(-26) else self.comboTx1:setAnchoredPositionX(0) end self.comboTx2:setText(GConst.EMPTY_STRING, self.comboTxComp2) self.comboAnimator:Play(GConst.BattleConst.ANIMATOR_HASH_NAME_BATTLE_COMBO_2, -1, 0) else if not self.comboFxVisible1 then self.comboFxVisible1 = true self.comboFx1:setActive(true) end if not self.comboFxVisible2 then self.comboFxVisible2 = true self.comboFx2:setActive(true) end if self.comboFxVisible3 then self.comboFxVisible3 = false self.comboFx3:setActive(false) end self.comboBg1:setVisible(true) self.comboTx1:setText(GConst.EMPTY_STRING, self.comboTxComp1) self.comboTx2:setText(GConst.INT_TO_STRING[count], self.comboTxComp2) self.comboAnimator:Play(GConst.BattleConst.ANIMATOR_HASH_NAME_BATTLE_COMBO_3, -1, 0) end end function BattleUI:initCounterAttack() self.counterAttackNode = self.uiMap["battle_ui.battle_root.battle_number_node.counter_attack"] self.counterTx = self.uiMap["battle_ui.battle_root.battle_number_node.counter_attack.text_number"] self.counterAttackNode:setVisible(false) end function BattleUI:showCounterAttack(count, side) local x = 280 if side == GConst.BattleConst.SIDE_ATK then x = -280 end self.counterAttackNode:setAnchoredPositionX(x) self.counterTx:setText(I18N:getGlobalText(I18N.GlobalConst.COUNTER_ATTACK_DESC) .. "+" .. count) self.counterAttackNode:setVisible(true) end function BattleUI:hideCounterAttack() self.counterAttackNode:setVisible(false) end function BattleUI:initFxNode() self.fxNode = self.uiMap["battle_ui.battle_root.batttle_fx_node"] end function BattleUI:getFxNode() return self.fxNode end function BattleUI:initHpNode() self.hpProgressLeft = self.uiMap["battle_ui.top_node.bg_l.atk_slider_green"]:getComponent(GConst.TYPEOF_UNITY_CLASS.BF_SLIDER) self.hpProgressRight = self.uiMap["battle_ui.top_node.bg_r.def_slider_red"]:getComponent(GConst.TYPEOF_UNITY_CLASS.BF_SLIDER) self.hpProgressLeft.value = 1 self.hpProgressRight.value = 1 self.hpProgressYellowLeft = self.uiMap["battle_ui.top_node.bg_l.atk_slider_yellow"]:getComponent(GConst.TYPEOF_UNITY_CLASS.BF_SLIDER) self.hpProgressYellowRight = self.uiMap["battle_ui.top_node.bg_r.def_slider_yellow"]:getComponent(GConst.TYPEOF_UNITY_CLASS.BF_SLIDER) self.hpProgressYellowLeft.value = 1 self.hpProgressYellowRight.value = 1 self.hpTextLeft = self.uiMap["battle_ui.top_node.atk_hp"] self.hpTextRight = self.uiMap["battle_ui.top_node.def_hp"] self.hpPercentLeft = 1 self.hpPercentRight = 1 end function BattleUI:setIsPauseHpProgress(value) if self.isPauseHpProgress == value then return end self.isPauseHpProgress = value if not value then local timeLeft = math.abs(self.hpProgressYellowLeft.value - self.hpPercentLeft) if timeLeft > 0.01 then local delayTime = math.abs(self.hpProgressLeft.value - self.hpPercentLeft)*2 if delayTime > 0.05 then if self.hpProgressYellowLeftSid then self:unscheduleGlobal(self.hpProgressYellowLeftSid) end self.hpProgressYellowLeftSid = self:performWithDelayGlobal(function() self:playHpProgressYellowLeftTween(timeLeft) end, delayTime) else self:playHpProgressYellowLeftTween(timeLeft) end else if self.hpProgressYellowLeftTween then self.hpProgressYellowLeftTween:Pause() end self.hpProgressYellowLeft.value = self.hpPercentLeft end local timeRight = math.abs(self.hpProgressYellowRight.value - self.hpPercentRight) if timeRight > 0.01 then local delayTime = math.abs(self.hpProgressRight.value - self.hpPercentRight)*2 if delayTime > 0.05 then if self.hpProgressYellowRightSid then self:unscheduleGlobal(self.hpProgressYellowRightSid) end self.hpProgressYellowRightSid = self:performWithDelayGlobal(function() self:playHpProgressYellowRightTween(timeRight) end, delayTime) else self:playHpProgressYellowRightTween(timeRight) end else if self.hpProgressYellowRightTween then self.hpProgressYellowRightTween:Pause() end self.hpProgressYellowRight.value = self.hpPercentRight end end end function BattleUI:playHpProgressYellowLeftTween(time) if self.hpProgressYellowLeftTween == nil then self.hpProgressYellowLeftTween = GFunc.DOBFSliderValue(self.hpProgressYellowLeft, self.hpPercentLeft, time, false) self.hpProgressYellowLeftTween:SetIntId(GConst.DOTWEEN_IDS.BATTLE) self.hpProgressYellowLeftTween:SetAutoKill(false) else self.hpProgressYellowLeftTween:ChangeEndValue(self.hpPercentLeft, time, true) self.hpProgressYellowLeftTween:Restart() end end function BattleUI:playHpProgressYellowRightTween(time) if self.hpProgressYellowRightTween == nil then self.hpProgressYellowRightTween = GFunc.DOBFSliderValue(self.hpProgressYellowRight, self.hpPercentRight, time, false) self.hpProgressYellowRightTween:SetIntId(GConst.DOTWEEN_IDS.BATTLE) self.hpProgressYellowRightTween:SetAutoKill(false) else self.hpProgressYellowRightTween:ChangeEndValue(self.hpPercentRight, time, true) self.hpProgressYellowRightTween:Restart() end end function BattleUI:refreshAtkHp(num, percent) self.hpTextLeft:setText(GFunc.num2Str(num)) if not self.isPauseHpProgress then if self.hpProgressLeftTween then self.hpProgressLeftTween:Pause() end if self.hpProgressYellowLeftTween then self.hpProgressYellowLeftTween:Pause() end if self.hpProgressYellowLeftSid then self:unscheduleGlobal(self.hpProgressYellowLeftSid) self.hpProgressYellowLeftSid = nil end self.hpProgressLeft.value = percent self.hpProgressYellowLeft.value = percent self.hpPercentLeft = percent return end if self.hpPercentLeft == percent then return end self.hpPercentLeft = percent local time = math.abs(self.hpProgressLeft.value - percent)*2 if self.hpProgressLeftTween == nil then self.hpProgressLeftTween = GFunc.DOBFSliderValue(self.hpProgressLeft, percent, time, false) self.hpProgressLeftTween:SetIntId(GConst.DOTWEEN_IDS.BATTLE) self.hpProgressLeftTween:SetAutoKill(false) else self.hpProgressLeftTween:ChangeEndValue(percent, time, true) self.hpProgressLeftTween:Restart() end end function BattleUI:refreshDefHp(num, percent) self.hpTextRight:setText(GFunc.num2Str(num)) if not self.isPauseHpProgress then if self.hpProgressRightTween then self.hpProgressRightTween:Pause() end if self.hpProgressYellowRightTween then self.hpProgressYellowRightTween:Pause() end if self.hpProgressYellowRightSid then self:unscheduleGlobal(self.hpProgressYellowRightSid) self.hpProgressYellowRightSid = nil end self.hpProgressRight.value = percent self.hpProgressYellowRight.value = percent self.hpPercentRight = percent return end if self.hpPercentRight == percent then return end self.hpPercentRight = percent local time = math.abs(self.hpProgressRight.value - percent)*2 if self.hpProgressRightTween == nil then self.hpProgressRightTween = GFunc.DOBFSliderValue(self.hpProgressRight, percent, time, false) self.hpProgressRightTween:SetIntId(GConst.DOTWEEN_IDS.BATTLE) self.hpProgressRightTween:SetAutoKill(false) else self.hpProgressRightTween:ChangeEndValue(percent, time, true) self.hpProgressRightTween:Restart() end end function BattleUI:refreshSkill(elementMap, showSfx) if not self.skillNodeCells then return end for elementType, skillEntity in pairs(DataManager.BattleData:getSkillEntities()) do if not self.skillNodeCells[elementType] then return end self.skillNodeCells[elementType]:refresh(skillEntity, elementMap, showSfx) end end -- shakeType: 奇数是水平震动 偶数是垂直震动 function BattleUI:shakeScreen(shakeType, duration) self.battleRoot:setLocalPosition(0, 0, 0) if self.shakeTween == nil then local length = ConfigManager:getConfig("const")["shake_level_" .. math.ceil(shakeType / 2)].value if shakeType % 2 == 0 then CacheVector2.x = 0 CacheVector2.y = length self.shakeTween = self.battleRoot:getTransform():DOShakeAnchorPos(duration, CacheVector2, 100, 90, false, false) else CacheVector2.x = length CacheVector2.y = 0 self.shakeTween = self.battleRoot:getTransform():DOShakeAnchorPos(duration, CacheVector2, 100, 90, false, false) end self.shakeTween:SetIntId(GConst.DOTWEEN_IDS.BATTLE) self.shakeTween:SetAutoKill(false) self.shakeType = shakeType self.shakeDuration = duration elseif self.shakeType == shakeType and self.shakeDuration == duration then self.shakeTween:Restart() else self.shakeTween:Kill() local length = ConfigManager:getConfig("const")["shake_level_" .. math.ceil(shakeType / 2)].value if shakeType % 2 == 0 then CacheVector2.x = 0 CacheVector2.y = length self.shakeTween = self.battleRoot:getTransform():DOShakeAnchorPos(duration, CacheVector2, 100, 90, false, false) else CacheVector2.x = length CacheVector2.y = 0 self.shakeTween = self.battleRoot:getTransform():DOShakeAnchorPos(duration, CacheVector2, 100, 90, false, false) end self.shakeTween:SetIntId(GConst.DOTWEEN_IDS.BATTLE) self.shakeTween:SetAutoKill(false) self.shakeType = shakeType self.shakeDuration = duration end self.shakeTween.timeScale = DataManager.BattleData:getTimeScale() end function BattleUI:initGridCell() if self.root.gridCells then self.gridCells = self.root.gridCells self.gridInitOver = true end if self.gridCells and self.gridInitOver then self:onInitGridCellOver() return end self.gridCells = {} self.cellLoadRemianCount = GConst.BattleConst.ROW_COUNT * GConst.BattleConst.COLUMN_COUNT for r = 1, GConst.BattleConst.ROW_COUNT do for c = 1, GConst.BattleConst.COLUMN_COUNT do CellManager:loadCellAsync(GRID_CELL_PATH, GRID_CELL, self.gridNode, function(cell) local posId = ModuleManager.BattleManager:getPosId(r, c) self.gridCells[posId] = cell cell:getBaseObject():setAnchoredPositionX(DEFAULT_X) -- 初始化时放到屏幕外 self.cellLoadRemianCount = self.cellLoadRemianCount - 1 if self.cellLoadRemianCount <= 0 then self.gridInitOver = true self:onInitGridCellOver() self.root.gridCells = self.gridCells end end) end end end function BattleUI:onInitGridCellOver() for posId, cell in pairs(self.gridCells) do local entity = DataManager.BattleData:getGridEntity(posId) if entity then cell:hideAni() cell:setOrder(self:getUIOrder()) cell:refresh(entity) cell:addTouchListener(function(eventType) if self.battleController then self.battleController:onTouchEvent(eventType, entity:getPosId()) end end) cell:unBindAll() cell:bind(entity, "isDirty", function() cell:refresh(entity, self.curElementType) end) local pos = entity:getPos() cell:getBaseObject():setAnchoredPosition(pos.x, pos.y) entity:setCell(cell) end end ---- 检查引导 ModuleManager.TutorialManager:checkFuncTutorial(GConst.TutorialConst.START_TUTORIAL) end function BattleUI:switchBoard(downCallback, callback, isFirst) if self.switchBoardSeq then self.switchBoardSeq:Kill() self.switchBoardSeq = nil end if isFirst then if downCallback then downCallback() end if callback then callback() end self.boardNode:setAnchoredPositionY(BOARD_POS_UP.y) return end self.switchBoardSeq = self.root:createBindTweenSequence() self.switchBoardSeq:Append(self.boardNode:getTransform():DOAnchorPos(BOARD_POS_DOWN, 0.5)) self.switchBoardSeq:AppendCallback(function() if downCallback then downCallback() end end) self.switchBoardSeq:Append(self.boardNode:getTransform():DOAnchorPos(BOARD_POS_UP, 0.5)) self.switchBoardSeq:AppendCallback(function() if callback then callback() end end) end function BattleUI:setController(controller) self.battleController = controller end function BattleUI:showBoardMask(elementType, skillPosId) if not self.gridCells then return end if self.curElementType == elementType and self.skillPosId == skillPosId then return end self.curElementType = elementType self.skillPosId = skillPosId self:refreshBoard() end function BattleUI:refreshBoard() local entities = DataManager.BattleData:getGridEnties() for posId, entity in pairs(entities) do if entity and entity:getCell() then entity:getCell():refresh(entity, self.curElementType, self.skillPosId) end end end function BattleUI:eliminationAni(aniSequence, effectGridMap, callback) self:showMask(true) if not aniSequence then if callback then callback() end return end self.boardMask:getTransform():SetAsLastSibling() if self.eliminationAniSeq then self.eliminationAniSeq:Kill() self.eliminationAniSeq = nil end self.eliminationAniSeq = self.root:createBindTweenSequence() self.eliminationAniSeq:AppendCallback(function() if self.boardMask2D then self.boardMask2D.enabled = false end end) if not self.posIdMap then self.posIdMap = {} end local breakSfxNameIndexMap = {} for index, info in ipairs(aniSequence) do if not self.posIdMap[info.posId] then local pos = ModuleManager.BattleManager:getPosInfo(info.posId) self.posIdMap[info.posId] = true local entity = DataManager.BattleData:getGridEntity(info.posId) local time = info.timeIdx if entity and entity:getCell() then entity:getCell():refresh(entity) if info.callback then self.eliminationAniSeq:InsertCallback(time, function() if info.callback then info.callback() end end) end if info.breakSfxName then breakSfxNameIndexMap[info.breakSfxName] = (breakSfxNameIndexMap[info.breakSfxName] or 0) + 1 local breakIndex = breakSfxNameIndexMap[info.breakSfxName] self.eliminationAniSeq:InsertCallback(time, function() self:getSfxGridBreak(info.breakSfxName, breakIndex, function(obj) local pos = ModuleManager.BattleManager:getPosInfo(info.posId) obj:setLocalScale(38, 38, 38) obj:setLocalPosition(pos.x, pos.y, 0) obj:play() end) end) end if info.isIdle then if entity:getSkillId() then entity:getCell():hideSkillSfx() end local baseObject = entity:getCell():getBaseObject() baseObject:getTransform():SetAsLastSibling() local anitime = 0 if info.aniPosList then local posList = {} local count = 0 for _, posId in ipairs(info.aniPosList) do table.insert(posList, ModuleManager.BattleManager:getPosInfo(posId)) count = count + 1 end anitime = count * GConst.BattleConst.GRID_BREAK_EFFECT_INTERVAL self.eliminationAniSeq:Insert(time, baseObject:getTransform():DOLocalPath(posList, anitime):SetEase(CS.DG.Tweening.Ease.Linear)) else if info.noAni then baseObject:setAnchoredPositionX(DEFAULT_X) else if info.rangeList then self.eliminationAniSeq:InsertCallback(time, function() self:playSkillLineSfx(info.posId, info.rangeList, info.randomPosList) end) end self.eliminationAniSeq:Insert(time, baseObject:getTransform():DOScale(1.3, 0.1)) self.eliminationAniSeq:InsertCallback(time + 0.2, function() self:getSfxSmoke(index, function(obj) obj:setAnchoredPosition(pos.x, pos.y) obj:play() end) end) local targetPos = self:getElementSkillPos(entity:getElementType()) if info.breakFlyToCharacter then targetPos = self.battleController.atkTeam:getMainUnit():getBaseObject():getTransform().position local sPoint = UIManager:getUICameraComponent():WorldToScreenPoint(targetPos) targetPos = CS.BF.Utils.RectTransformScreenPointToLocalPointInRectangle(self.boardNode:getTransform(), sPoint.x, sPoint.y, UIManager:getUICameraComponent()) end self.eliminationAniSeq:Insert(time + 0.2, baseObject:getTransform():DOAnchorPos(targetPos, 0.3)) self.eliminationAniSeq:Insert(time + 0.2, baseObject:getTransform():DOScale(0.5, 0.3)) anitime = 0.5 end end if info.overCallback then self.eliminationAniSeq:InsertCallback(time + anitime, function() if info.noAni then baseObject:setAnchoredPositionX(DEFAULT_X) end info.overCallback() end) end end end end end for posId, _ in pairs(effectGridMap) do local entity = DataManager.BattleData:getGridEntity(posId) local baseObject = entity:getCell():getBaseObject() baseObject:getTransform():SetAsLastSibling() end self.eliminationAniSeq:AppendCallback(function() for posId, _ in pairs(self.posIdMap) do local entity = DataManager.BattleData:getGridEntity(posId) if entity and entity:getCell() then entity:getCell():hideAni() end end self.posIdMap = {} if self.boardMask2D then self.boardMask2D.enabled = true end if callback then callback() end self:refreshSkill() end) end function BattleUI:generateSkillAni(map, callback) if table.nums(map) <= 0 then if callback then callback() end return end self:hideGenerateSkillGridCells() if self.generateSkillAniSeq then self.generateSkillAniSeq:Kill() self.generateSkillAniSeq = nil end self.generateSkillAniSeq = self.root:createBindTweenSequence() local count = 0 for elementType, info in pairs(map) do local entity = self.generateSkillGridEntities[elementType] if entity and entity:getCell() then count = count + 1 entity:setSkilId(info.skillId) local cell = entity:getCell() cell:refresh(entity) self.generateSkillAniSeq:AppendCallback(function() local pos = self:getElementSkillPos(elementType) cell:getBaseObject():setAnchoredPosition(pos.x, pos.y) end) local pos = ModuleManager.BattleManager:getPosInfo(info.posId) self.generateSkillAniSeq:Append(cell:getBaseObject():getTransform():DOAnchorPos(pos, 0.5)) if self.generateSkillSfxs and self.generateSkillSfxs[count] then self.generateSkillSfxs[count]:setAnchoredPosition(pos.x, pos.y) self.generateSkillAniSeq:AppendCallback(function() self.generateSkillSfxs[count]:setActive(true) self.generateSkillSfxs[count]:play() end) end end end self.generateSkillAniSeq:AppendCallback(function() if callback then callback() end self:hideGenerateSkillGridCells() end) end function BattleUI:hideGenerateSkillGridCells() if not self.generateSkillGridEntities then local uiMap = self.root:genAllChildren() self.generateSkillGridEntities = {} for name, elementType in pairs(GConst.BattleConst.ELEMENT_TYPE) do local obj = uiMap["battle_ui.bg_2.ani_node.grid_cell_" .. elementType] if obj then local cell = CellManager:addCellComp(obj, GRID_CELL) local entity = DataManager.BattleData:getNewGridEntity() entity:setCell(cell) self.generateSkillGridEntities[elementType] = entity end end end for _, entity in pairs(self.generateSkillGridEntities) do if entity:getCell() then entity:getCell():getBaseObject():setAnchoredPositionX(DEFAULT_X) end end end function BattleUI:showMonsterSkillAni(map, monsterPos, callback) if table.nums(map) <= 0 then if callback then callback() end return end self:hideMonsterSkillGridCells() if self.monsterSkillAniSeq then self.monsterSkillAniSeq:Kill() self.monsterSkillAniSeq = nil end local sPoint = UIManager:getUICameraComponent():WorldToScreenPoint(monsterPos) monsterPos = CS.BF.Utils.RectTransformScreenPointToLocalPointInRectangle(self.boardNode:getTransform(), sPoint.x, sPoint.y, UIManager:getUICameraComponent()) self.monsterSkillAniSeq = self.root:createBindTweenSequence() local count = 1 for posId, info in pairs(map) do local entity = self.monsterSkillGridEntities[count] if entity and entity:getCell() then entity:setGridType(info.gridType) entity:setElementType(GConst.BattleConst.ELEMENT_TYPE.EMPTY) count = count + 1 local cell = entity:getCell() cell:refresh(entity) cell:getBaseObject():setAnchoredPosition(monsterPos.x, monsterPos.y) cell:getBaseObject():setLocalScale(0.3, 0.3, 0.3) local pos = ModuleManager.BattleManager:getPosInfo(posId) if count == 1 then self.monsterSkillAniSeq:Append(cell:getBaseObject():getTransform():DOAnchorPos(pos, 0.3)) else self.monsterSkillAniSeq:Join(cell:getBaseObject():getTransform():DOAnchorPos(pos, 0.3)) end self.monsterSkillAniSeq:Join(cell:getBaseObject():getTransform():DOScale(1, 0.3)) end end self.monsterSkillAniSeq:AppendCallback(function() if callback then callback() end self:hideMonsterSkillGridCells() end) end function BattleUI:hideMonsterSkillGridCells() if not self.monsterSkillGridEntities then local uiMap = self.root:genAllChildren() self.monsterSkillGridEntities = {} for name, elementType in pairs(GConst.BattleConst.ELEMENT_TYPE) do local obj = uiMap["battle_ui.bg_2.ani_node.grid_cell_m" .. elementType] if obj then local cell = CellManager:addCellComp(obj, GRID_CELL) local entity = DataManager.BattleData:getNewGridEntity() entity:setCell(cell) self.monsterSkillGridEntities[elementType] = entity end end end for _, entity in pairs(self.monsterSkillGridEntities) do if entity:getCell() then entity:getCell():getBaseObject():setAnchoredPositionX(DEFAULT_X) end end end function BattleUI:initGenerateSkillEffect() if not self.generateSkillSfxs then local uiMap = self.root:genAllChildren() self.generateSkillSfxs = {} self.generateSkillSfxs[1] = uiMap["battle_ui.bg_2.ani_node.sfx_piece_skill_b01_1"] self.generateSkillSfxs[2] = uiMap["battle_ui.bg_2.ani_node.sfx_piece_skill_b01_2"] self.generateSkillSfxs[3] = uiMap["battle_ui.bg_2.ani_node.sfx_piece_skill_b01_3"] self.generateSkillSfxs[4] = uiMap["battle_ui.bg_2.ani_node.sfx_piece_skill_b01_4"] self.generateSkillSfxs[5] = uiMap["battle_ui.bg_2.ani_node.sfx_piece_skill_b01_5"] end for _, obj in pairs(self.generateSkillSfxs) do obj:setActive(true) obj:getComponent(GConst.TYPEOF_UNITY_CLASS.BF_EFFECT_HELPER):SetSortingOrder(self:getUIOrder(), GConst.UI_EFFECT_ORDER.LEVEL1) obj:setActive(false) end end function BattleUI:gotOneSkillAni(skillId, elementType, callback, startPos) if not skillId or not self.skillSelectCell then if callback then callback() end return end self.skillSelectCell:refresh(skillId) self.skillSelectCell:getBaseObject():setAnchoredPosition(startPos.x, startPos.y) self.skillSelectCell:getBaseObject():setVisible(true) if self.gotOneSkillAniSeq then self.gotOneSkillAniSeq:Kill() self.gotOneSkillAniSeq = nil end self.gotOneSkillAniSeq = self.root:createBindTweenSequence() local pos = self:getElementSkillPos(elementType) self.gotOneSkillAniSeq:Append(self.skillSelectCell:getBaseObject():getTransform():DOAnchorPos(pos, 0.7)) self.gotOneSkillAniSeq:Join(self.skillSelectCell:getBaseObject():getTransform():DOScale(0.76, 0.7)) self.gotOneSkillAniSeq:AppendCallback(function() self.skillSelectCell:getBaseObject():setAnchoredPositionX(DEFAULT_X) if callback then callback() end end) end function BattleUI:initSkillSelectCells() if not self.skillSelectCell then local uiMap = self.root:genAllChildren() self.skillSelectCell = CellManager:addCellComp(uiMap["battle_ui.bg_2.ani_node.skill_select_cell"], SELECT_SKILL_CELL) self.skillSelectCell:getBaseObject():setAnchoredPositionX(DEFAULT_X) end end function BattleUI:shuffleBoard(changeInfo, callback) if self.shuffleBoardSeq then self.shuffleBoardSeq:Kill() self.shuffleBoardSeq = nil end self.shuffleBoardSeq = self.root:createBindTweenSequence() for posId, tartgetPos in pairs(changeInfo) do local entity = DataManager.BattleData:getGridEntity(posId) local cell = entity:getCell() local posId = entity:getPosId() if cell then local pos = ModuleManager.BattleManager:getPosInfo(posId) self.shuffleBoardSeq:Insert(0, cell:getBaseObject():getTransform():DOAnchorPos(pos, 1)) end end self.shuffleBoardSeq:AppendCallback(function() if callback then callback() end end) end function BattleUI:removeGridOutOfScreen(posIdList) for _, posId in ipairs(posIdList) do local entity = DataManager.BattleData:getGridEntity(posId) local cell = entity:getCell() cell:getBaseObject():setAnchoredPositionX(DEFAULT_X) end end function BattleUI:fallGrid(listInfo, isRoundBeginCheck, callback) if isRoundBeginCheck then self:showMask(false) else self.boardMask:getTransform():SetAsLastSibling() end self.fallAniCount = 0 for posId, info in pairs(listInfo) do local entity = DataManager.BattleData:getGridEntity(posId) local cell = entity:getCell() if cell then self.fallAniCount = self.fallAniCount + 1 if cell.fallSeq then cell.fallSeq:Kill() cell.fallSeq = nil end local baseObject = cell:getBaseObject() cell.fallSeq = baseObject:createBindTweenSequence() baseObject:setAnchoredPosition(info[1].x, info[1].y) local count = #info local time = GConst.BattleConst.ONE_STEP_TIME * count cell.fallSeq:Append(baseObject:getTransform():DOLocalPath(info, time):SetEase(CS.DG.Tweening.Ease.InQuad)) cell.fallSeq:AppendCallback(function() self.fallAniCount = self.fallAniCount - 1 if self.fallAniCount == 0 then if callback then callback() end end end) cell.fallSeq:InsertCallback(time + math.random() * 0.1 - 0.2, function() cell:showAni() end) end end if self.fallAniCount == 0 and callback then callback() end end function BattleUI:cacheSkillAni(skillInfo, isPop, callback) local skillInfoCount = #skillInfo if skillInfoCount <= 0 then if callback then callback() end return end self:disableUITouch() if not self.root.skillAniGridEntities then self.root.skillAniGridEntities = {} end for _, entity in ipairs(self.root.skillAniGridEntities) do local cell = entity:getCell() if cell then cell:getBaseObject():setAnchoredPositionX(DEFAULT_X) -- 放到屏幕外 end end local gridEntityCount = #self.root.skillAniGridEntities if gridEntityCount < skillInfoCount then for i = gridEntityCount, skillInfoCount do CellManager:loadCellAsync(GRID_CELL_PATH, GRID_CELL, self.boardCacheNode, function(cell) cell:getBaseObject():setAnchoredPositionX(DEFAULT_X) -- 初始化时放到屏幕外 local entity = DataManager.BattleData:getNewGridEntity() entity:setCell(cell) cell:hideAni() table.insert(self.root.skillAniGridEntities, entity) if i == skillInfoCount then if isPop then self:doCachePopAni(skillInfo, callback) else self:doCacheAni(skillInfo, callback) end end end) end else if isPop then self:doCachePopAni(skillInfo, callback) else self:doCacheAni(skillInfo, callback) end end end function BattleUI:doCacheAni(skillInfo, callback) if self.cacheSkillAniSeq then self.cacheSkillAniSeq:Kill() self.cacheSkillAniSeq = nil end if not self.root.skillAniGridEntities then if callback then callback() end return end self.boardCacheNode:setVisible(true) local w, h = GFunc.getUIExpandScreenSize() local w = w / 2 + 100 self.cacheSkillAniSeq = self.root:createBindTweenSequence() self.cacheSkillAniSeq:AppendCallback(function() self.boardCacheBox:setAnchoredPositionX(- w) end) for index, info in ipairs(skillInfo) do local entity = self.root.skillAniGridEntities[index] if entity then entity:setSkilId(info.skillId) local pos = ModuleManager.BattleManager:getPosInfo(info.posId) local cell = entity:getCell() if cell then cell:refresh(entity) local obj = cell:getBaseObject() self.cacheSkillAniSeq:InsertCallback(0.5 * (index - 1), function() obj:setAnchoredPosition(pos.x, pos.y) local gridEntity = DataManager.BattleData:getGridEntity(info.posId) if gridEntity and gridEntity:getCell() then gridEntity:getCell():getBaseObject():setAnchoredPositionX(DEFAULT_X) -- 放到屏幕外 end end) self.cacheSkillAniSeq:Insert(0.5 * (index - 1) + 0.02, obj:getTransform():DOAnchorPos(CACHE_SKILL_POS_2, 0.7)) end end end self.cacheSkillAniSeq:Append(self.boardCacheBox:getTransform():DOAnchorPosX(0, 0.5)) for index, info in ipairs(skillInfo) do local entity = self.root.skillAniGridEntities[index] if entity then local cell = entity:getCell() if cell then local obj = cell:getBaseObject() if index == 1 then self.cacheSkillAniSeq:Append(obj:getTransform():DOAnchorPos(CACHE_SKILL_POS_1, 0.3)) else self.cacheSkillAniSeq:Join(obj:getTransform():DOAnchorPos(CACHE_SKILL_POS_1, 0.3)) end end end end self.cacheSkillAniSeq:AppendCallback(function() for index, entity in ipairs(self.root.skillAniGridEntities) do if entity and entity:getCell() then entity:getCell():getBaseObject():setAnchoredPositionX(DEFAULT_X) end end end) self.cacheSkillAniSeq:Append(self.boardCacheBox:getTransform():DOAnchorPosX(w, 0.5)) self.cacheSkillAniSeq:AppendCallback(function() self.boardCacheNode:setVisible(false) self:enableUITouch() if callback then callback() end end) end function BattleUI:doCachePopAni(skillInfo, callback) if self.cacheSkillAniSeq then self.cacheSkillAniSeq:Kill() self.cacheSkillAniSeq = nil end if not self.root.skillAniGridEntities then if callback then callback() end return end self.boardCacheNode:setVisible(true) local w, h = GFunc.getUIExpandScreenSize() local w = w / 2 + 100 self.cacheSkillAniSeq = self.root:createBindTweenSequence() self.cacheSkillAniSeq:AppendCallback(function() self.boardCacheBox:setAnchoredPositionX(- w) end) self.cacheSkillAniSeq:Append(self.boardCacheBox:getTransform():DOAnchorPosX(0, 0.5)) for index, info in ipairs(skillInfo) do local entity = self.root.skillAniGridEntities[index] if entity then entity:setSkilId(info.skillId) local pos = ModuleManager.BattleManager:getPosInfo(info.posId) local cell = entity:getCell() if cell then cell:refresh(entity) local obj = cell:getBaseObject() self.cacheSkillAniSeq:InsertCallback(0, function() obj:setAnchoredPositionX(DEFAULT_X) end) self.cacheSkillAniSeq:InsertCallback(0.5 + 0.5 * (index - 1), function() obj:setAnchoredPosition(CACHE_SKILL_POS_1.x, CACHE_SKILL_POS_1. y) end) self.cacheSkillAniSeq:Insert(0.5 + 0.5 * (index - 1) + 0.02, obj:getTransform():DOAnchorPos(CACHE_SKILL_POS_2, 0.3)) end end end self.cacheSkillAniSeq:Append(self.boardCacheBox:getTransform():DOAnchorPosX(w, 0.5)) for index, info in ipairs(skillInfo) do local entity = self.root.skillAniGridEntities[index] if entity then local pos = ModuleManager.BattleManager:getPosInfo(info.posId) local cell = entity:getCell() if cell then local obj = cell:getBaseObject() if index == 1 then self.cacheSkillAniSeq:Append(obj:getTransform():DOAnchorPos(pos, 0.7)) else self.cacheSkillAniSeq:Join(obj:getTransform():DOAnchorPos(pos, 0.7)) end end end end self.cacheSkillAniSeq:AppendCallback(function() for index, info in ipairs(skillInfo) do if self.battleController then self.battleController:setGridSkillId(info.posId, info.skillId) end end self.boardCacheNode:setVisible(false) self:enableUITouch() if callback then callback() end end) end function BattleUI:showMask(show) if not self.boardMask then return end self.boardMask:setVisible(show) end function BattleUI:getElementSkillPos(elementType) if not self.skillPoss then self.skillPoss = {} end if not self.skillPoss[elementType] then local cell = self.skillNodeCells[elementType] if not cell then self.skillPoss[elementType] = BF.Vector2(0, 0) else local targetPos = cell:getBaseObject():getTransform().position local sPoint = UIManager:getUICameraComponent():WorldToScreenPoint(targetPos) targetPos = CS.BF.Utils.RectTransformScreenPointToLocalPointInRectangle(self.boardNode:getTransform(), sPoint.x, sPoint.y, UIManager:getUICameraComponent()) self.skillPoss[elementType] = targetPos end end return self.skillPoss[elementType] end function BattleUI:refreshLv() local uiMap = self.root:genAllChildren() if not self.lvSlider then self.lvSlider = uiMap["battle_ui.bg_2.lv_node.slider"]:getComponent(GConst.TYPEOF_UNITY_CLASS.BF_SLIDER) self.lvDesc = uiMap["battle_ui.bg_2.lv_node.icon.lv_desc"] end local curExp = DataManager.BattleData:getBattleExp() local curNeedExp = DataManager.BattleData:getBattleNeedExp() self.lvSlider.value = curExp / curNeedExp local lv = DataManager.BattleData:getBattleLv() self.lvDesc:setText(lv) local sfx = uiMap["battle_ui.bg_2.lv_node.icon.vfx_ui_battle_progress_light_b01"] if not self.lastLv then sfx:setActive(true) sfx:getComponent(GConst.TYPEOF_UNITY_CLASS.BF_EFFECT_HELPER):SetSortingOrder(self:getUIOrder(), GConst.UI_EFFECT_ORDER.LEVEL1) sfx:setActive(false) elseif self.lastLv ~= lv then sfx:setActive(true) sfx:play() end self.lastLv = lv end function BattleUI:refreshWave(wave) local uiMap = self.root:genAllChildren() local icon = uiMap["battle_ui.top_node.wave_icon"] local desc = uiMap["battle_ui.top_node.wave_desc"] desc:setText(wave) GFunc.centerImgAndTx(icon, desc, 10) end function BattleUI:getSfxLine(index, func) self.hidingAllSfxLine = false if not self.root.lineSfxObjs then self.root.lineSfxObjs = {} end if self.root.lineSfxObjs[index] then if self.root.lineSfxObjs[index].obj and func then local obj = self.root.lineSfxObjs[index].obj obj:setActive(true) func(obj) end else self.root.lineSfxObjs[index] = { isLoaded = true } EffectManager:loadUIEffectAsync(GConst.BattleConst.LINE_SFX, self, self.gridNode, 11, function(obj) self.root.lineSfxObjs[index].obj = obj if self.hidingAllSfxLine then obj:setActive(false) else if func then func(obj) end end end) end end function BattleUI:hideAllSfxLine() self.hidingAllSfxLine = true if not self.root.lineSfxObjs then return end for inde, info in pairs(self.root.lineSfxObjs) do if info.obj then info.obj:setActive(false) end end end function BattleUI:getSfxGridBreak(breakSfxPath, index, func) if not breakSfxPath then return end self.hidingAllSfxGridBreak = false if not self.root.gridBreakSfxObjs then self.root.gridBreakSfxObjs = {} end if not self.root.gridBreakSfxObjs[breakSfxPath] then self.root.gridBreakSfxObjs[breakSfxPath] = {} end if self.root.gridBreakSfxObjs[breakSfxPath][index] then if self.root.gridBreakSfxObjs[breakSfxPath][index].obj and func then local obj = self.root.gridBreakSfxObjs[breakSfxPath][index].obj obj:setActive(true) func(obj) end else self.root.gridBreakSfxObjs[breakSfxPath][index] = { isLoaded = true } EffectManager:loadUIEffectAsync(breakSfxPath, self, self.gridNode, GConst.UI_EFFECT_ORDER.LEVEL1, function(obj) self.root.gridBreakSfxObjs[breakSfxPath][index].obj = obj if self.hidingAllSfxGridBreak then obj:setActive(false) else if func then func(obj) end end end) end end function BattleUI:hideAllSfxGridBreak() self.hidingAllSfxLine = false if not self.root.gridBreakSfxObjs then return end for breakSfxPath, map in pairs(self.root.gridBreakSfxObjs) do for index, info in pairs(map) do if info.obj then info.obj:setActive(false) end end end end function BattleUI:getSfxSmoke(index, func) self.hidingAllSfxSmoke = false if not self.root.smokeSfxObjs then self.root.smokeSfxObjs = {} end if self.root.smokeSfxObjs[index] then if self.root.smokeSfxObjs[index].obj and func then local obj = self.root.smokeSfxObjs[index].obj obj:setActive(true) func(obj) end else self.root.smokeSfxObjs[index] = { isLoaded = true } EffectManager:loadUIEffectAsync(GConst.BattleConst.LINK_SMOKE, self, self.gridNode, 11, function(obj) self.root.smokeSfxObjs[index].obj = obj obj:setLocalScale(1.5, 1.5, 1.5) if self.hidingAllSfxSmoke then obj:setActive(false) else if func then func(obj) end end end) end end function BattleUI:hideAllSfxSmoke() self.hidingAllSfxSmoke = true if not self.root.smokeSfxObjs then return end for inde, info in pairs(self.root.smokeSfxObjs) do if info.obj then info.obj:setActive(false) end end end function BattleUI:initSkillLineSfx() local uiMap = self.root:genAllChildren() if not self.skillLineSfxs then self.skillLineSfxs = {} self.skillLineSfxs[13] = uiMap["battle_ui.bg_2.board_node.grid_node.sfx_skill_b01_2_1h"] self.skillLineSfxs[11] = uiMap["battle_ui.bg_2.board_node.grid_node.sfx_skill_b01_2_1v"] self.skillLineSfxs[15] = uiMap["battle_ui.bg_2.board_node.grid_node.sfx_skill_b01_2_1l"] self.skillLineSfxs[17] = uiMap["battle_ui.bg_2.board_node.grid_node.sfx_skill_b01_2_1r"] self.skillLineSfxs[23] = uiMap["battle_ui.bg_2.board_node.grid_node.sfx_skill_b01_1_2h"] self.skillLineSfxs[21] = uiMap["battle_ui.bg_2.board_node.grid_node.sfx_skill_b01_1_2v"] self.skillLineSfxs[25] = uiMap["battle_ui.bg_2.board_node.grid_node.sfx_skill_b01_1_2l"] self.skillLineSfxs[27] = uiMap["battle_ui.bg_2.board_node.grid_node.sfx_skill_b01_1_2r"] self.skillLineSfxs[33] = uiMap["battle_ui.bg_2.board_node.grid_node.sfx_skill_b01_3h"] self.skillLineSfxs[31] = uiMap["battle_ui.bg_2.board_node.grid_node.sfx_skill_b01_3v"] self.skillLineSfxs[35] = uiMap["battle_ui.bg_2.board_node.grid_node.sfx_skill_b01_3l"] self.skillLineSfxs[37] = uiMap["battle_ui.bg_2.board_node.grid_node.sfx_skill_b01_3r"] end if not self.skillLightSfxs then self.skillLightSfxs = {} self.skillLightSfxs.point = uiMap["battle_ui.bg_2.board_node.grid_node.sfx_skill_b03"] self.skillLightSfxs[11] = uiMap["battle_ui.bg_2.board_node.grid_node.sfx_skill_b04_1"] self.skillLightSfxs[12] = uiMap["battle_ui.bg_2.board_node.grid_node.sfx_skill_b04_2"] self.skillLightSfxs[13] = uiMap["battle_ui.bg_2.board_node.grid_node.sfx_skill_b04_3"] self.skillLightSfxs[14] = uiMap["battle_ui.bg_2.board_node.grid_node.sfx_skill_b04_4"] self.skillLightSfxs[15] = uiMap["battle_ui.bg_2.board_node.grid_node.sfx_skill_b04_5"] self.skillLightSfxs[21] = uiMap["battle_ui.bg_2.board_node.grid_node.sfx_skill_b05_1"] self.skillLightSfxs[22] = uiMap["battle_ui.bg_2.board_node.grid_node.sfx_skill_b05_2"] self.skillLightSfxs[23] = uiMap["battle_ui.bg_2.board_node.grid_node.sfx_skill_b05_3"] self.skillLightSfxs[24] = uiMap["battle_ui.bg_2.board_node.grid_node.sfx_skill_b05_4"] self.skillLightSfxs[25] = uiMap["battle_ui.bg_2.board_node.grid_node.sfx_skill_b05_5"] end for _, obj in pairs(self.skillLineSfxs) do obj:setActive(true) obj:getComponent(GConst.TYPEOF_UNITY_CLASS.BF_EFFECT_HELPER):SetSortingOrder(self:getUIOrder(), GConst.UI_EFFECT_ORDER.LEVEL2) obj:setActive(false) end for _, obj in pairs(self.skillLightSfxs) do obj:setActive(true) obj:getComponent(GConst.TYPEOF_UNITY_CLASS.BF_EFFECT_HELPER):SetSortingOrder(self:getUIOrder(), GConst.UI_EFFECT_ORDER.LEVEL2) obj:setActive(false) end end function BattleUI:playSkillLineSfx(posId, boradRangeList, randomPosList) if not boradRangeList or not boradRangeList[1] or not self.skillLineSfxs then return end local directionAndRange = {} for _, info in ipairs(boradRangeList) do if info.type == GConst.BattleConst.BOARD_RANGE_TYPE.RANDOM then directionAndRange[GConst.BattleConst.BOARD_RANGE_TYPE.RANDOM] = info.range elseif info.type == GConst.BattleConst.BOARD_RANGE_TYPE.UP or info.type == GConst.BattleConst.BOARD_RANGE_TYPE.DOWN then directionAndRange[GConst.BattleConst.BOARD_RANGE_TYPE.UP] = info.range elseif info.type == GConst.BattleConst.BOARD_RANGE_TYPE.LEFT or info.type == GConst.BattleConst.BOARD_RANGE_TYPE.RIGHT then directionAndRange[GConst.BattleConst.BOARD_RANGE_TYPE.LEFT] = info.range elseif info.type == GConst.BattleConst.BOARD_RANGE_TYPE.LEFT_UP or info.type == GConst.BattleConst.BOARD_RANGE_TYPE.LEFT_DOWN then directionAndRange[GConst.BattleConst.BOARD_RANGE_TYPE.LEFT_UP] = info.range elseif info.type == GConst.BattleConst.BOARD_RANGE_TYPE.RIGHT_UP or info.type == GConst.BattleConst.BOARD_RANGE_TYPE.RIGHT_DOWN then directionAndRange[GConst.BattleConst.BOARD_RANGE_TYPE.RIGHT_UP] = info.range end end local pos = ModuleManager.BattleManager:getPosInfo(posId) for dir, range in pairs(directionAndRange) do local index = range * 10 + dir local obj = self.skillLineSfxs[index] if obj then obj:setAnchoredPosition(pos.x, pos.y) obj:setActive(true) obj:play() end end if randomPosList then local count = math.min(#randomPosList, 5) -- 特效最多5个 self.skillLightSfxs.point:setAnchoredPosition(pos.x, pos.y) self.skillLightSfxs.point:setActive(true) self.skillLightSfxs.point:play() for i = 1, count do local tartgetPos = randomPosList[i] tartgetPos = ModuleManager.BattleManager:getPosInfo(tartgetPos) local obj = self.skillLightSfxs[20 + i] if obj then obj:setAnchoredPosition(tartgetPos.x, tartgetPos.y) obj:setActive(true) obj:play() end obj = self.skillLightSfxs[10 + i] local yOffset = tartgetPos.y - pos.y local xOffset = tartgetPos.x - pos.x local height = math.sqrt(xOffset * xOffset + yOffset * yOffset) if obj then obj:setAnchoredPosition(pos.x, pos.y) obj:setLocalScaleX(0.3 * height / 94) obj:setEulerAngles(0, 0, - math.deg(math.atan(xOffset, yOffset)) + 90) obj:setActive(true) obj:play() end end end end function BattleUI:playChangeElementSfx(posId, index) if not self.root.changeElementSfxs then self.root.changeElementSfxs = {} end local pos = ModuleManager.BattleManager:getPosInfo(posId) local info = self.root.changeElementSfxs[index] if info then local obj = info.obj if obj then obj:setAnchoredPosition(pos.x, pos.y) obj:setActive(true) obj:play() end else self.root.changeElementSfxs[index] = { isLoaded = true } EffectManager:loadUIEffectAsync(GConst.BattleConst.CHANGE_ELEMENT_SFX, self, self.gridNode, GConst.UI_EFFECT_ORDER.LEVEL2, function(obj) self.root.changeElementSfxs[index].obj = obj obj:setAnchoredPosition(pos.x, pos.y) obj:play() end) end end function BattleUI:initTutorialNode() local uiMap = self.root:genAllChildren() self.tutorialNode = uiMap["battle_ui.tutorial_node"] self.tutorialFinger = uiMap["battle_ui.tutorial_node.board_node.finger"] self:showTutorialFinger() end function BattleUI:initUISfxs() if self.root.gridBreakSfxObjs then for breakSfxPath, map in pairs(self.root.gridBreakSfxObjs) do for index, info in pairs(map) do if info.obj then info.obj:setActive(true) info.obj:getComponent(GConst.TYPEOF_UNITY_CLASS.BF_EFFECT_HELPER):SetSortingOrder(self:getUIOrder(), GConst.UI_EFFECT_ORDER.LEVEL1) info.obj:setActive(false) end end end end if self.root.lineSfxObjs then for index, info in pairs(self.root.lineSfxObjs) do if info.obj then info.obj:setActive(true) info.obj:getComponent(GConst.TYPEOF_UNITY_CLASS.BF_EFFECT_HELPER):SetSortingOrder(self:getUIOrder(), 11) info.obj:setActive(false) end end end if self.root.smokeSfxObjs then for index, info in pairs(self.root.smokeSfxObjs) do if info.obj then info.obj:setActive(true) info.obj:getComponent(GConst.TYPEOF_UNITY_CLASS.BF_EFFECT_HELPER):SetSortingOrder(self:getUIOrder(), 11) info.obj:setActive(false) end end end if self.root.changeElementSfxs then for index, info in pairs(self.root.changeElementSfxs) do if info.obj then info.obj:setActive(true) info.obj:getComponent(GConst.TYPEOF_UNITY_CLASS.BF_EFFECT_HELPER):SetSortingOrder(self:getUIOrder(), GConst.UI_EFFECT_ORDER.LEVEL2) info.obj:setActive(false) end end end end function BattleUI:showTutorialFinger(posIdList) if self.showTutorialFingerSeq then self.showTutorialFingerSeq:Kill() self.showTutorialFingerSeq = nil end if not self.tutorialFinger then return end local show = false if posIdList and posIdList[1] then show = true end self.tutorialNode:setVisible(show) if not show then return end self.showTutorialFingerSeq = self.root:createBindTweenSequence() local path = {} local count = 0 for index, posId in ipairs(posIdList) do local curPos = ModuleManager.BattleManager:getPosInfo(posId) if index == 1 then self.tutorialFinger:setAnchoredPosition(curPos.x, curPos.y) else table.insert(path, curPos) count = count + 1 end end self.showTutorialFingerSeq:Append(self.tutorialFinger:getTransform():DOLocalPath(path, count * 0.7):SetEase(CS.DG.Tweening.Ease.Linear)) for index, posId in ipairs(posIdList) do local time = (index - 1.4) * 0.7 if time < 0 then time = 0 end self.showTutorialFingerSeq:InsertCallback(time, function() local eventType if index == 1 then eventType = GConst.ELIMINATION_TOUCH_EVENT.DOWN else eventType = GConst.ELIMINATION_TOUCH_EVENT.ENTER end self.battleController:onTouchEvent(eventType, posId, true) end) end self.showTutorialFingerSeq:AppendCallback(function() self.battleController:clearGridSequence() end) self.showTutorialFingerSeq:SetLoops(-1) end function BattleUI:initSelectSkillNode() if not self.selectSkillComp then local uiMap = self.root:genAllChildren() local obj = uiMap["battle_ui.bg_2.battle_select_skill_comp"] obj:initPrefabHelper() obj:genAllChildren() self.selectSkillComp = obj:addLuaComponent(BATTLE_SELECT_SKILL_COMP) self.selectSkillComp:hide() end end function BattleUI:showSelectSkillComp(skillList, isCommon) if not self.selectSkillComp then return end self.selectSkillComp:refresh(skillList, isCommon) end function BattleUI:hideAllBoardSfxs() if self.generateSkillSfxs then for _, obj in pairs(self.generateSkillSfxs) do obj:setActive(false) end end if self.skillLineSfxs then for _, obj in pairs(self.skillLineSfxs) do obj:setActive(false) end end if self.skillLightSfxs then for _, obj in pairs(self.skillLightSfxs) do obj:setActive(false) end end if self.root.gridBreakSfxObjs then for breakSfxPath, map in pairs(self.root.gridBreakSfxObjs) do for index, info in pairs(map) do if info.obj then info.obj:setActive(false) end end end end if self.root.lineSfxObjs then for index, info in pairs(self.root.lineSfxObjs) do if info.obj then info.obj:setActive(false) end end end if self.root.smokeSfxObjs then for index, info in pairs(self.root.smokeSfxObjs) do if info.obj then info.obj:setActive(false) end end end end function BattleUI:initCommonSkillDescTips() local uiMap = self.root:genAllChildren() self.skillDescTipsNode = uiMap["battle_ui.bg_2.lv_node.skill_desc_tips"] self.skillDescTips = uiMap["battle_ui.bg_2.lv_node.skill_desc_tips.desc"] self.skillDescTipsNode:setVisible(false) end function BattleUI:showCommonSkillTips(skillId) -- 需要合并显示 local rogueCfg = ConfigManager:getConfig("skill_rogue") local curCfg = rogueCfg[skillId] if not curCfg or curCfg.universal ~= 1 then return end local value = 0 local selectSkillMap = DataManager.BattleData:getSelectSkillMap() if selectSkillMap[skillId] then value = selectSkillMap[skillId].value end if curCfg.toast_mark then for id, info in pairs(rogueCfg) do if selectSkillMap[id] and id ~= skillId and info.toast_mark == curCfg.toast_mark then value = value + selectSkillMap[id].value end end end if self.showCommonSkillTipsSid then self:unscheduleGlobal(self.showCommonSkillTipsSid) self.showCommonSkillTipsSid = nil end self.skillDescTipsNode:setVisible(true) self.skillDescTips:setText(ModuleManager.HeroManager:getSkillRogueDesc(skillId, value)) self.showCommonSkillTipsSid = self:performWithDelayGlobal(function() self.skillDescTipsNode:setVisible(false) end, 1.5) end function BattleUI:initBossEnterAni() local uiMap = self.root:genAllChildren() self.bossEnterNode = uiMap["battle_ui.bg_2.boss_enter_node"] self.bossEnterImg = uiMap["battle_ui.bg_2.boss_enter_node.img"] self.bossName = uiMap["battle_ui.bg_2.boss_enter_node.boss_name"] self.bossEnterNodeCanvasGroup = self.bossEnterNode:getComponent(GConst.TYPEOF_UNITY_CLASS.CANVAS_GROUP) self.bossEnterNode:setVisible(false) end function BattleUI:showBossEnterAni(bornTime, bossName, monsterComp, callback) if not self.bossEnterNode then if callback then callback() end return end self.bossEnterNode:setVisible(true) self.bossEnterImg:setVisible(false) self.bossName:setText(GConst.EMPTY_STRING) self.bossEnterNodeCanvasGroup.alpha = 0 monsterComp:getBaseObject():setLocalPosition(DEFAULT_X, 0, 0) if self.bossEnterAniSeq then self.bossEnterAniSeq:Kill() self.bossEnterAniSeq = nil end self.bossEnterAniSeq = self.root:createBindTweenSequence() self.bossEnterAniSeq:Append(self.bossEnterNodeCanvasGroup:DOFade(1, 0.2)) self.bossEnterAniSeq:AppendCallback(function() self.bossEnterImg:setVisible(true) monsterComp:initPosition() monsterComp:getBaseObject():setParent(self.maxLayerNode, false) if callback then callback() end end) self.bossEnterAniSeq:AppendInterval(bornTime) self.bossEnterAniSeq:AppendCallback(function() self.bossName:setText(bossName) end) self.bossEnterAniSeq:AppendInterval(0.5) self.bossEnterAniSeq:Append(self.bossEnterNodeCanvasGroup:DOFade(0, 0.2)) self.bossEnterAniSeq:AppendCallback(function() monsterComp:getBaseObject():setParent(self:getBattleNode(), false) self.bossEnterNode:setVisible(false) end) end function BattleUI:clear() if self.alreadyClear then return end self.alreadyClear = true if self.battleNode then self.battleNode:removeAllChildren() end if self.fxNode then self.fxNode:removeAllChildren() end if self.battleNumberNode then self.battleNumberNode:removeAllChildren() end if self.hpProgressYellowLeftSid then self:unscheduleGlobal(self.hpProgressYellowLeftSid) self.hpProgressYellowLeftSid = nil end if self.hpProgressYellowRightSid then self:unscheduleGlobal(self.hpProgressYellowRightSid) self.hpProgressYellowRightSid = nil end if self.hpProgressLeftTween then self.hpProgressLeftTween:Kill() self.hpProgressLeftTween = nil end if self.hpProgressYellowLeftTween then self.hpProgressYellowLeftTween:Kill() self.hpProgressYellowLeftTween = nil end if self.hpProgressRightTween then self.hpProgressRightTween:Kill() self.hpProgressRightTween = nil end if self.hpProgressYellowRightTween then self.hpProgressYellowRightTween:Kill() self.hpProgressYellowRightTween = nil end if self.bgMoveTween then self.bgMoveTween:Kill() self.bgMoveTween = nil end if self.shakeTween then self.shakeTween:Kill() self.shakeTween = nil end if self.showTutorialFingerSeq then self.showTutorialFingerSeq:Kill() self.showTutorialFingerSeq = nil end if self.switchBoardSeq then self.switchBoardSeq:Kill() self.switchBoardSeq = nil end if self.eliminationAniSeq then self.eliminationAniSeq:Kill() self.eliminationAniSeq = nil end if self.generateSkillAniSeq then self.generateSkillAniSeq:Kill() self.generateSkillAniSeq = nil end if self.gotOneSkillAniSeq then self.gotOneSkillAniSeq:Kill() self.gotOneSkillAniSeq = nil end if self.shuffleBoardSeq then self.shuffleBoardSeq:Kill() self.shuffleBoardSeq = nil end if self.gridCells then for _, cell in pairs(self.gridCells) do if cell.fallSeq then cell.fallSeq:Kill() cell.fallSeq = nil end end end if self.cacheSkillAniSeq then self.cacheSkillAniSeq:Kill() self.cacheSkillAniSeq = nil end if self.monsterSkillAniSeq then self.monsterSkillAniSeq:Kill() self.monsterSkillAniSeq = nil end if self.showCommonSkillTipsSid then self:unscheduleGlobal(self.showCommonSkillTipsSid) self.showCommonSkillTipsSid = nil end if self.autoCloseBuffSid then self:unscheduleGlobal(self.autoCloseBuffSid) self.autoCloseBuffSid = nil end if self.bossEnterAniSeq then self.bossEnterAniSeq:Kill() self.bossEnterAniSeq = nil end end return BattleUI