c1_lua/lua/app/ui/battle/battle_ui_pvp.lua
2025-11-11 17:55:19 +08:00

432 lines
20 KiB
Lua

local BattleBaseUI = require "app/ui/battle/battle_base_ui"
local BattleUIPVP = class("BattleUIPVP", BattleBaseUI)
local DEFAULT_X = 10000
local ALPHA_COLOR = BF.Color(1, 1, 1, 0)
local BLACK_ALPHA_COLOR = BF.Color(0, 0, 0, 0)
local TIPS_BG = {"battle_bg_6", "battle_bg_14"}
local ELIMINATION_TOUCH_EVENT = GConst.ELIMINATION_TOUCH_EVENT
---------------------------------必须重写的方法----------------------------------
function BattleUIPVP:initBaseInfo()
local uiMap = self.root:genAllChildren()
self.uiMap = uiMap
self.gridNode = uiMap["battle_ui_pvp.board_root_node.board_node_atk.grid_node"]
self.boardNode = uiMap["battle_ui_pvp.board_root_node"]
self.boardCenterNode = uiMap["battle_ui_pvp.board_root_node.board_center_node"]
self.boardNode:setAnchoredPositionX(DEFAULT_X)
self.boardNode:setVisible(true)
self.boardMask2D = self.gridNode:getComponent(GConst.TYPEOF_UNITY_CLASS.UI_RECT_MASK_2D)
self.boardMask = uiMap["battle_ui_pvp.board_root_node.board_mask"]
self.boardMask:setVisible(false)
self.boardCacheNode = uiMap["battle_ui_pvp.board_root_node.board_cache_node"]
self.boardCacheNode:setVisible(false)
self.boardCacheBox = uiMap["battle_ui_pvp.board_root_node.board_cache_node.skill_box"]
self.boardCacheBox:setAnchoredPositionX(DEFAULT_X)
self.battleRoot = uiMap["battle_ui_pvp.battle_root"]
self.maxLayerNode = uiMap["battle_ui_pvp.battle_root.battle_node.max_layer_show_node"]
self.aniNode = uiMap["battle_ui_pvp.board_root_node.ani_node"]
self.touchMask = uiMap["battle_ui_pvp.board_root_node.touch_mask"]
self.atkBoardImg = self.uiMap["battle_ui_pvp.board_root_node.board_center_node.board_node_atk.board_atk"]
self.defBoardImg = self.uiMap["battle_ui_pvp.board_root_node.board_center_node.board_node_atk.board_def"]
self.atkBoard = self.uiMap["battle_ui_pvp.board_root_node.board_center_node.board_node_atk.grid_node.board_atk"]
self.defBoard = self.uiMap["battle_ui_pvp.board_root_node.board_center_node.board_node_atk.grid_node.board_def"]
self.boardRootNodeMask = self.uiMap["battle_ui_pvp.board_root_node.mask"]
self.atkBoardImg:setAnchoredPositionX(0)
self.defBoardImg:setAnchoredPositionX(0)
self.actionTipsMask = uiMap["battle_ui_pvp.board_root_node.action_tips_mask"]
self.actionTipsImg = uiMap["battle_ui_pvp.board_root_node.action_tips_mask.img"]
self.actionTipsDesc = uiMap["battle_ui_pvp.board_root_node.action_tips_mask.img.desc"]
self.gridEdgeNode = uiMap["battle_ui_pvp.board_root_node.board_center_node.board_node_atk.grid_edge_node"]
self.gridEdgeCacheCell = uiMap["battle_ui_pvp.cache_node.grid_edge_cell"]
end
function BattleUIPVP:initBg()
self.bg = self.uiMap["battle_ui_pvp.battle_root.bg"]
-- self.bg:setLocalScale(0, 0, 0)
-- local width = self.bg:fastGetSizeDelta()
-- self.bg:setAnchoredPositionX(width/4)
end
function BattleUIPVP:initSkill()
local uiMap = self.root:genAllChildren()
local atkNode = uiMap["battle_ui_pvp.bottom_node.skill_node"]
local defNode = uiMap["battle_ui_pvp.top_node.skill_node"]
local atkCellPrefix = "battle_ui_pvp.bottom_node.skill_node.skill_node_cell_"
local defCellPrefix = "battle_ui_pvp.top_node.skill_node.skill_node_cell_"
self:_initSkill(atkNode, atkCellPrefix, defNode, defCellPrefix)
end
function BattleUIPVP:initBuff()
local atkBuffPrefix = "battle_ui_pvp.bottom_node.buff.tiny_buff_cell_"
local defBuffPrefix = "battle_ui_pvp.top_node.buff.tiny_buff_cell_"
local battleBuffTipsRoot = self.uiMap["battle_ui_pvp.battle_buff_tips"]
local battleBuffTipsMask = self.uiMap["battle_ui_pvp.battle_buff_tips.mask"]
local battleBuffTipsBg = self.uiMap["battle_ui_pvp.battle_buff_tips.bg"]
local battleBuffTipsBuff = self.uiMap["battle_ui_pvp.battle_buff_tips.bg.buff"]
self:_initBuff(atkBuffPrefix, defBuffPrefix, battleBuffTipsRoot, battleBuffTipsMask, battleBuffTipsBg, battleBuffTipsBuff)
end
function BattleUIPVP:initBattlefield()
self.battleNode = self.uiMap["battle_ui_pvp.battle_root.battle_node"]
end
function BattleUIPVP:initNumberNode()
self.battleNumberNode = self.uiMap["battle_ui_pvp.battle_root.battle_number_node"]
self.battleNumberRed = self.uiMap["battle_ui_pvp.cache_node.battle_number_red"]
self.battleNumberGreen = self.uiMap["battle_ui_pvp.cache_node.battle_number_green"]
self.battleNumberBlue = self.uiMap["battle_ui_pvp.cache_node.battle_number_blue"]
self.battleNumberWhite = self.uiMap["battle_ui_pvp.cache_node.battle_number_white"]
self.battleNumberSpecial = self.uiMap["battle_ui_pvp.cache_node.battle_number_special"]
end
function BattleUIPVP:initComboNode()
self.comboNode = self.uiMap["battle_ui_pvp.battle_root.combo"]
self.comboBg = self.uiMap["battle_ui_pvp.battle_root.combo.bg"]
self.comboBg1 = self.uiMap["battle_ui_pvp.battle_root.combo.bg.bg_1"]
self.comboTx1 = self.uiMap["battle_ui_pvp.battle_root.combo.number.text.text_1"]
self.comboTx2 = self.uiMap["battle_ui_pvp.battle_root.combo.number.text.text_2"]
self.comboFx1 = self.uiMap["battle_ui_pvp.battle_root.combo.bg.vfx_ui_hit_b01"]
self.comboFx2 = self.uiMap["battle_ui_pvp.battle_root.combo.bg.vfx_ui_hit_b02"]
self.comboFx3 = self.uiMap["battle_ui_pvp.battle_root.combo.bg.vfx_ui_hit_b03"]
self:_initComboNode()
end
function BattleUIPVP:initHpNode()
self.hpProgressLeft = self.uiMap["battle_ui_pvp.bottom_node.hp_node.hp_progress"]:getComponent(GConst.TYPEOF_UNITY_CLASS.BF_SLIDER)
self.hpProgressRight = self.uiMap["battle_ui_pvp.top_node.hp_node.hp_progress"]:getComponent(GConst.TYPEOF_UNITY_CLASS.BF_SLIDER)
self.hpTextLeft = self.uiMap["battle_ui_pvp.bottom_node.hp_node.hp"]
self.hpTextRight = self.uiMap["battle_ui_pvp.top_node.hp_node.hp"]
self.hpProgressYellowLeft = self.uiMap["battle_ui_pvp.bottom_node.hp_node.hp_progress_yellow"]:getComponent(GConst.TYPEOF_UNITY_CLASS.BF_SLIDER)
self.hpProgressYellowRight = self.uiMap["battle_ui_pvp.top_node.hp_node.hp_progress_yellow"]:getComponent(GConst.TYPEOF_UNITY_CLASS.BF_SLIDER)
self:_initHpNode()
end
function BattleUIPVP:initFxNode()
self.fxNode = self.uiMap["battle_ui_pvp.battle_root.batttle_fx_node"]
end
function BattleUIPVP:hideGenerateSkillGridCells()
local generateSkillCellPrefix = "battle_ui_pvp.board_root_node.ani_node.grid_cell_"
self:_hideGenerateSkillGridCells(generateSkillCellPrefix)
end
function BattleUIPVP:initSkillLineSfx()
if not self.skillLineSfxs then
self.skillLineSfxs = {}
self.skillLineSfxs[13] = self.uiMap["battle_ui_pvp.board_root_node.ani_node.sfx_skill_b01_2_1h"]
self.skillLineSfxs[11] = self.uiMap["battle_ui_pvp.board_root_node.ani_node.sfx_skill_b01_2_1v"]
self.skillLineSfxs[15] = self.uiMap["battle_ui_pvp.board_root_node.ani_node.sfx_skill_b01_2_1l"]
self.skillLineSfxs[17] = self.uiMap["battle_ui_pvp.board_root_node.ani_node.sfx_skill_b01_2_1r"]
self.skillLineSfxs[23] = self.uiMap["battle_ui_pvp.board_root_node.ani_node.sfx_skill_b01_1_2h"]
self.skillLineSfxs[21] = self.uiMap["battle_ui_pvp.board_root_node.ani_node.sfx_skill_b01_1_2v"]
self.skillLineSfxs[25] = self.uiMap["battle_ui_pvp.board_root_node.ani_node.sfx_skill_b01_1_2l"]
self.skillLineSfxs[27] = self.uiMap["battle_ui_pvp.board_root_node.ani_node.sfx_skill_b01_1_2r"]
self.skillLineSfxs[33] = self.uiMap["battle_ui_pvp.board_root_node.ani_node.sfx_skill_b01_3h"]
self.skillLineSfxs[31] = self.uiMap["battle_ui_pvp.board_root_node.ani_node.sfx_skill_b01_3v"]
self.skillLineSfxs[35] = self.uiMap["battle_ui_pvp.board_root_node.ani_node.sfx_skill_b01_3l"]
self.skillLineSfxs[37] = self.uiMap["battle_ui_pvp.board_root_node.ani_node.sfx_skill_b01_3r"]
end
if not self.root.skillLightSfxs then
self.root.skillLightSfxs = {
point = {
isLoaded = true,
obj = self.uiMap["battle_ui_pvp.board_root_node.ani_node.sfx_skill_b03"],
}
}
end
self:_initSkillLineSfx()
end
function BattleUIPVP:initGenerateSkillEffect()
local generateSkillEffecPrefix = "battle_ui_pvp.board_root_node.ani_node.sfx_piece_skill_b01_"
self:_initGenerateSkillEffect(generateSkillEffecPrefix)
end
function BattleUIPVP:initCounterAttack()
self.counterAttackNode = self.uiMap["battle_ui_pvp.battle_root.counter_attack"]
self.counterTx = self.uiMap["battle_ui_pvp.battle_root.counter_attack.text_number"]
self.counterTxbgComp = self.uiMap["battle_ui_pvp.battle_root.counter_attack.bg"]
self.counterTxTmp = self.counterTx:getComponent(GConst.TYPEOF_UNITY_CLASS.UI_TEXT_MESH_PRO)
self.counterAttackNode:setVisible(false)
end
function BattleUIPVP:initTouchCancel()
local uiMap = self.root:genAllChildren()
local touchCancelNode = uiMap["battle_ui_pvp.board_root_node.board_center_node.touch_cancel_node"]
touchCancelNode:setVisible(false)
touchCancelNode:getComponent(GConst.TYPEOF_UNITY_CLASS.BF_ELIMINATION_TOUCH_EVENT):AddTouchEventListener(function(eventType)
if eventType == ELIMINATION_TOUCH_EVENT.ENTER then -- 取消链接
self.battleController:clearGridSequence()
AudioManager:playEffect(AudioManager.EFFECT_ID.LINK_CANCEL)
end
end)
-- local w, h = GFunc.getUIExpandScreenSize()
-- local addW = h - CS.BF.GameConst.DESIGN_RESOLUTION_HEIGHT
-- touchCancelNode:setSizeDeltaY(509 + addW)
local allImg = uiMap["battle_ui_pvp.board_root_node.board_center_node.touch_cancel_node.all_img"]
allImg:setVisible(false)
uiMap["battle_ui_pvp.board_root_node.board_center_node.touch_cancel_node.all_img.tips_desc"]:setText(I18N:getGlobalText(I18N.GlobalConst.BATTLE_DESC_13))
end
function BattleUIPVP:showTouchCancel()
if self.battleController.curActionSide ~= GConst.BattleConst.SIDE_ATK then
return
end
local uiMap = self.root:genAllChildren()
local touchCancelNode = uiMap["battle_ui_pvp.board_root_node.board_center_node.touch_cancel_node"]
touchCancelNode:setVisible(true)
-- 判断是否显示提示框
local allImg = uiMap["battle_ui_pvp.board_root_node.board_center_node.touch_cancel_node.all_img"]
allImg:setVisible(true)
end
function BattleUIPVP:hideTouchCancel()
local uiMap = self.root:genAllChildren()
local touchCancelNode = uiMap["battle_ui_pvp.board_root_node.board_center_node.touch_cancel_node"]
touchCancelNode:setVisible(false)
end
--------------------------------end必须重写的方法--------------------------------
function BattleUIPVP:getBGMId()
if self.battleController then
if self.battleController.battleType == GConst.BattleConst.BATTLE_TYPE.ACT_PVP then
return AudioManager.BGM_ID.ACT_PVP_FIGHT
end
end
return AudioManager.BGM_ID.BATTLE
end
function BattleUIPVP:getPrefabPath()
return "assets/prefabs/ui/battle/battle_ui_pvp.prefab"
end
function BattleUIPVP:_display()
BattleBaseUI._display(self)
self:refreshAvatar()
---- 适配
local w, h = GFunc.getUIExpandScreenSize()
local scale = math.min(1, h / 1280 * 0.84)
self.boardCenterNode:setVisible(true, scale)
end
function BattleUIPVP:_addListeners()
local uiMap = self.root:genAllChildren()
uiMap["battle_ui_pvp.top_node.close_btn"]:addClickListener(function()
ModuleManager.BattleManager:showPauseUI(self.battleController.battleType, self.battleController)
end)
end
function BattleUIPVP:refreshAvatar()
-- 等数据
local defInfo = self.battleController:getControllerParams().defInfo
if not defInfo then
return
end
if not self.atkPlayerHeadCell then
self.atkPlayerHeadCell = CellManager:addCellComp(self.uiMap["battle_ui_pvp.bottom_node.player_head_cell"], GConst.TYPEOF_LUA_CLASS.PLAYER_HEAD_CELL)
self.defPlayerHeadCell = CellManager:addCellComp(self.uiMap["battle_ui_pvp.top_node.player_head_cell"], GConst.TYPEOF_LUA_CLASS.PLAYER_HEAD_CELL)
end
self.atkPlayerHeadCell:refresh()
self.defPlayerHeadCell:refresh(defInfo.avatar, defInfo.avatar_frame)
end
function BattleUIPVP:loadBg(bgName)
self.bg:setLocalScale(1, 1, 1)
end
function BattleUIPVP:initChapterBg()
end
function BattleUIPVP:showLeftBuffTips(buffList, autoClose)
local addY = self:showBuffTips(buffList, autoClose)
self.battleBuffTipsBg:setAnchoredPosition(-175, -1050 + addY)
end
function BattleUIPVP:showRightBuffTips(buffList, autoClose)
self:showBuffTips(buffList, autoClose)
self.battleBuffTipsBg:setAnchoredPosition(175, -200)
end
function BattleUIPVP:refreshWave(wave, iconAtlas, iconName)
local uiMap = self.root:genAllChildren()
local icon = uiMap["battle_ui_pvp.bottom_node.round_icon"]
local desc = uiMap["battle_ui_pvp.bottom_node.round_text"]
desc:setText(wave .. "/" .. self.battleController:getMaxRoundCount())
-- GFunc.centerImgAndTx(icon, desc, 10)
iconAtlas = iconAtlas or GConst.ATLAS_PATH.BATTLE
iconName = iconName or "battle_dec_4"
icon:setSprite(iconAtlas, iconName)
end
function BattleUIPVP:setGenerateSkillSfxsParent(posId, obj)
local isAtkAction = self.battleController.curActionSide == GConst.BattleConst.SIDE_ATK
if isAtkAction then
obj:setParent(self.atkBoard, true)
else
obj:setParent(self.defBoard, true)
end
end
function BattleUIPVP:dealBoardMaskOnShowAni(isOver)
local targetX = isOver and 0 or DEFAULT_X
self.boardMask:setAnchoredPositionX(targetX)
end
function BattleUIPVP:enterShowBoardAni(callback, skipInterval)
self:showMask(false)
local isAtkAction = self.battleController.curActionSide == GConst.BattleConst.SIDE_ATK
if self.touchMask then
self.touchMask:setVisible(not isAtkAction)
end
self:clearEnterShowBoardSeq()
local w, h = GFunc.getUIExpandScreenSize()
self.enterShowBoardSeq = self.root:createBindTweenSequence()
self.enterShowBoardSeq:AppendCallback(function()
local str
local sprite
if isAtkAction then
str = I18N:getGlobalText(I18N.GlobalConst.ARENA_BATTLE_DESC_1)
sprite = TIPS_BG[1]
else
str = I18N:getGlobalText(I18N.GlobalConst.ARENA_BATTLE_DESC_2)
sprite = TIPS_BG[2]
end
self.actionTipsImg:setSprite(GConst.ATLAS_PATH.BATTLE, sprite)
self.actionTipsImg:setAnchoredPositionX(-w - 360)
self.actionTipsDesc:setText(str)
self.actionTipsMask:getComponent(GConst.TYPEOF_UNITY_CLASS.UI_IMAGE).color = BLACK_ALPHA_COLOR
self.boardNode:setVisible(true)
self.boardNode:setAnchoredPositionX(0)
end)
if not skipInterval then
self.enterShowBoardSeq:AppendInterval(0.5)
end
self.enterShowBoardSeq:AppendCallback(function()
for posId, entity in pairs(self.battleController.battleData:getGridEnties()) do
if entity:getCell() then
local inCurRange = self.battleController:getPosIdInCurActionBoardRowRange(posId)
local parent
if isAtkAction then
parent = inCurRange and self.atkBoard or self.defBoard
else
parent = inCurRange and self.defBoard or self.atkBoard
end
if parent then
entity:getCell():getBaseObject():setParent(parent, true)
end
end
end
for posId, info in pairs(self.battleController.battleData:getGridEdgeEntities()) do
for direction, entity in pairs(info) do
if entity:getCell() then
local inCurRange = self.battleController:getPosIdInCurActionBoardRowRange(posId)
local parent
if isAtkAction then
parent = inCurRange and self.atkBoard or self.defBoard
else
parent = inCurRange and self.defBoard or self.atkBoard
end
if parent then
entity:getCell():getBaseObject():setParent(parent, true)
end
end
end
end
end)
self.enterShowBoardSeq:Join(self.defBoardImg:getTransform():DOAnchorPosX(0, 0.5))
self.enterShowBoardSeq:Join(self.atkBoardImg:getTransform():DOAnchorPosX(0, 0.5))
self.enterShowBoardSeq:Join(self.boardRootNodeMask:getComponent(GConst.TYPEOF_UNITY_CLASS.UI_IMAGE):DOFade(0.9, 0.5))
self.enterShowBoardSeq:Append(self.actionTipsMask:getComponent(GConst.TYPEOF_UNITY_CLASS.UI_IMAGE):DOFade(0.9, 0.5))
self.enterShowBoardSeq:Join(self.actionTipsImg:getTransform():DOAnchorPosX(0, 0.3))
self.enterShowBoardSeq:AppendInterval(0.5)
self.enterShowBoardSeq:Append(self.actionTipsImg:getTransform():DOAnchorPosX(w + 360, 0.3))
self.enterShowBoardSeq:AppendCallback(function()
self.actionTipsMask:getComponent(GConst.TYPEOF_UNITY_CLASS.UI_IMAGE).color = BLACK_ALPHA_COLOR
for posId, entity in pairs(self.battleController.battleData:getGridEnties()) do
if entity:getCell() then
entity:getCell():getBaseObject():setParent(self.gridNode, true)
end
end
for posId, info in pairs(self.battleController.battleData:getGridEdgeEntities()) do
for direction, entity in pairs(info) do
if entity:getCell() then
entity:getCell():getBaseObject():setParent(self.gridEdgeNode, true)
end
end
end
if callback then
callback()
end
end)
end
function BattleUIPVP:enterHideBoardAni(callback)
self:dealBoardMaskOnShowAni()
self:clearEnterShowBoardSeq()
local w, h = GFunc.getUIExpandScreenSize()
self.enterShowBoardSeq = self.root:createBindTweenSequence()
self.enterShowBoardSeq:AppendCallback(function()
self.actionTipsMask:getComponent(GConst.TYPEOF_UNITY_CLASS.UI_IMAGE).color = BLACK_ALPHA_COLOR
self.actionTipsImg:setAnchoredPositionX(-w - 360)
end)
self.enterShowBoardSeq:AppendInterval(0.5)
self.enterShowBoardSeq:AppendCallback(function()
local isAtkAction = self.battleController.curActionSide == GConst.BattleConst.SIDE_ATK
for posId, entity in pairs(self.battleController.battleData:getGridEnties()) do
if entity:getCell() then
local inCurRange = self.battleController:getPosIdInCurActionBoardRowRange(posId)
local parent
if isAtkAction then
parent = inCurRange and self.atkBoard or self.defBoard
else
parent = inCurRange and self.defBoard or self.atkBoard
end
if parent then
entity:getCell():getBaseObject():setParent(parent, true)
end
end
end
for posId, info in pairs(self.battleController.battleData:getGridEdgeEntities()) do
for direction, entity in pairs(info) do
if entity:getCell() then
local inCurRange = self.battleController:getPosIdInCurActionBoardRowRange(posId)
local parent
if isAtkAction then
parent = inCurRange and self.atkBoard or self.defBoard
else
parent = inCurRange and self.defBoard or self.atkBoard
end
if parent then
entity:getCell():getBaseObject():setParent(parent, true)
end
end
end
end
end)
self.enterShowBoardSeq:Join(self.defBoardImg:getTransform():DOAnchorPosX(w + 360, 0.5))
self.enterShowBoardSeq:Join(self.atkBoardImg:getTransform():DOAnchorPosX(-(w + 360), 0.5))
self.enterShowBoardSeq:Join(self.boardRootNodeMask:getComponent(GConst.TYPEOF_UNITY_CLASS.UI_IMAGE):DOFade(0, 0.5))
self.enterShowBoardSeq:AppendCallback(function()
self:dealBoardMaskOnShowAni(true)
self.boardNode:setVisible(false)
if callback then
callback()
end
end)
end
return BattleUIPVP