c1_lua/lua/app/ui/hero/hero_comp.lua
xiekaidong 100e125c19 Merge branch 'dev_20230725' into dungeon
# Conflicts:
#	lua/app/common/bi_report.lua
#	lua/app/common/module_manager.lua
#	lua/app/config/localization/localization_global_const.lua
#	lua/app/config/strings/cn/global.lua
2023-07-20 19:45:54 +08:00

299 lines
11 KiB
Lua

local HeroComp = class("HeroComp", LuaComponent)
local HERO_LIST_CELL = "app/ui/hero/cell/hero_list_cell"
local OUT_SCREEN_X = 10000
function HeroComp:init()
self.uiMap = self:getBaseObject():genAllChildren()
self.scrollRect = self.uiMap["hero_ui.scrollrect"]:addLuaComponent(GConst.TYPEOF_LUA_CLASS.SCROLL_RECT_BASE)
self.scrollRect:addInitCallback(function()
return HERO_LIST_CELL
end)
self.scrollRect:addRefreshCallback(function(index, cell)
cell:refresh(index, self.heroList, self.curFormation, self.allHeroCount, self.unlockCount, function(cell, heroId)
self:onClickHero(cell, heroId)
end)
end)
self.heroList = DataManager.HeroData:getAllHeroesSort()
self.heroNodeList = {
self.uiMap["hero_ui.formation.hero_1"],
self.uiMap["hero_ui.formation.hero_2"],
self.uiMap["hero_ui.formation.hero_3"],
self.uiMap["hero_ui.formation.hero_4"],
self.uiMap["hero_ui.formation.hero_5"],
}
self.heroAddImgList = {
self.uiMap["hero_ui.formation.hero_1.add"],
self.uiMap["hero_ui.formation.hero_2.add"],
self.uiMap["hero_ui.formation.hero_3.add"],
self.uiMap["hero_ui.formation.hero_4.add"],
self.uiMap["hero_ui.formation.hero_5.add"],
}
self.heroBgSpineObj = {
self.uiMap["hero_ui.formation.hero_1.ui_spine_obj"],
self.uiMap["hero_ui.formation.hero_2.ui_spine_obj"],
self.uiMap["hero_ui.formation.hero_3.ui_spine_obj"],
self.uiMap["hero_ui.formation.hero_4.ui_spine_obj"],
self.uiMap["hero_ui.formation.hero_5.ui_spine_obj"],
}
self.heroSpineList = {}
self.largeHeroCell = CellManager:addCellComp(self.uiMap["hero_ui.scrollrect.viewport.content.large_hero_cell"], GConst.TYPEOF_LUA_CLASS.LARGE_HERO_CELL)
self.txTitle = self.uiMap["hero_ui.top_bg.title_bg_img.title_tx"]
self.rimgTopBG = self.uiMap["hero_ui.top_bg"]
self.content = self.uiMap["hero_ui.scrollrect.viewport.content"]
self.largeHeroCell:getBaseObject():setAnchoredPositionX(OUT_SCREEN_X)
self.content:addClickListener(function()
self.largeHeroCell:getBaseObject():setAnchoredPositionX(OUT_SCREEN_X)
end)
self.btnCollection = self.uiMap["hero_ui.btn_collect"]
self.btnCollection:addClickListener(function()
UIManager:showUI("app/ui/collection/collection_ui", GConst.CollectionConst.TYPE.HERO)
end)
self.uiMap["hero_ui.btn_collect.tx_collect"]:setText(I18N:getGlobalText(I18N.GlobalConst.COLLECTION_DESC_10))
for index, obj in ipairs(self.heroNodeList) do
obj:addClickListener(function()
local heroId = self.curFormation[index]
if heroId then
local hero = DataManager.HeroData:getHeroById(heroId)
if hero then
ModuleManager.HeroManager:showHeroDetailUI(heroId)
end
end
end)
if self.heroBgSpineObj[index] then
self.heroBgSpineObj[index]:playAnim("idle", true, false)
end
end
self:bind(DataManager.CollectionData, "dirtyHero", function()
self:refreshCollectEntrance()
end)
self:bind(DataManager.HeroData, "isDirty", function()
self:refreshCollectEntrance()
end)
end
function HeroComp:refresh(battleType)
self.battleType = battleType
self:clearAdapt()
self:adapt()
self:refreshCollectEntrance()
if self.battleType == GConst.BattleConst.FORMATION_TYPE.STAGE then
self:refreshStageFormation()
elseif self.battleType == GConst.BattleConst.FORMATION_TYPE.ARENA_ATTACK then
self:refreshArenaFightFormation()
elseif self.battleType == GConst.BattleConst.FORMATION_TYPE.ARENA_DEFEND then
self:refreshArenaDefendFormation()
elseif self.battleType == GConst.BattleConst.FORMATION_TYPE.DUNGEON_WEAPON then
self:refreshDungeonWeaponFormation()
elseif self.battleType == GConst.BattleConst.FORMATION_TYPE.DUNGEON_ARMOR then
self:refreshDungeonArmorFormation()
end
end
-- 展示主线章节阵容
function HeroComp:refreshStageFormation()
self.txTitle:setText(I18N:getGlobalText(I18N.GlobalConst.MAIN_BTN_2))
self.rimgTopBG:setTexture("assets/arts/textures/background/hero/hero_bg_1.png")
self.curFormation = DataManager.FormationData:getStageFormation()
self.onClickUseFunc = function(id, type)
ModuleManager.FormationManager:upHeroToStageFormation(id, type)
end
self:refreshScrollRect()
end
-- 展示竞技场进攻阵容
function HeroComp:refreshArenaFightFormation()
self.txTitle:setText(I18N:getGlobalText(I18N.GlobalConst.ARENA_DESC_10))
self.rimgTopBG:setTexture("assets/arts/textures/background/arena/arena_bg_2.png")
self.curFormation = DataManager.FormationData:getArenaAttackFormation()
self.onClickUseFunc = function(id, type)
DataManager.FormationData:upHeroToFormation(self.battleType, type, id)
self:refreshArenaFightFormation()
end
self:refreshScrollRect()
end
-- 展示竞技场防守阵容
function HeroComp:refreshArenaDefendFormation()
self.txTitle:setText(I18N:getGlobalText(I18N.GlobalConst.ARENA_DESC_9))
self.rimgTopBG:setTexture("assets/arts/textures/background/arena/arena_bg_2.png")
self.curFormation = DataManager.FormationData:getArenaDefendFormation()
self.onClickUseFunc = function(id, type)
DataManager.FormationData:upHeroToFormation(self.battleType, type, id)
self:refreshArenaDefendFormation()
end
self:refreshScrollRect()
end
-- 展示武器副本
function HeroComp:refreshDungeonWeaponFormation()
self.txTitle:setText(I18N:getGlobalText(I18N.GlobalConst.DUNGEON_WEAPON_DESC_15))
self.rimgTopBG:setTexture("assets/arts/textures/background/hero/hero_bg_1.png")
self.curFormation = DataManager.FormationData:getDungeonWeaponFormation()
self.onClickUseFunc = function(id, type)
DataManager.FormationData:upHeroToFormation(self.battleType, type, id)
self:refreshDungeonWeaponFormation()
end
self:refreshScrollRect()
end
-- 展示支线副本
function HeroComp:refreshDungeonArmorFormation()
self.txTitle:setText(I18N:getGlobalText(I18N.GlobalConst.DUNGEON_ARMOR_DESC_4))
self.rimgTopBG:setTexture("assets/arts/textures/background/hero/hero_bg_1.png")
self.curFormation = DataManager.FormationData:getDungeonArmorFormation()
self.onClickUseFunc = function(id, type)
DataManager.FormationData:upHeroToFormation(self.battleType, type, id)
self:refreshDungeonArmorFormation()
end
self:refreshScrollRect()
end
function HeroComp:refreshScrollRect()
for i = 1, 5 do
local heroId = self.curFormation[i]
local hero = DataManager.HeroData:getHeroById(heroId)
if hero and hero:getLv() > 0 then
self.heroAddImgList[i]:setVisible(false)
if self.heroSpineList[i] and self.heroSpineList[i]:getModelId() == hero:getModelId() then
self.heroSpineList[i]:setActive(true)
self.heroSpineList[i]:playAnimation("idle", true)
else
SpineManager:loadHeroAsync(hero:getModelId(), self.heroNodeList[i], function(spineObject)
if heroId ~= self.curFormation[i] then
return
end
if self.heroSpineList[i] then
self.heroSpineList[i]:destroy()
end
spineObject:playAnimation("idle", true)
spineObject:setLocalScale(0.7, 0.7, 0.7)
self.heroSpineList[i] = spineObject
self.heroSpineList[i]:setLocalPosition(0, -60, 0)
end)
end
else
self.heroAddImgList[i]:setVisible(true)
if self.heroSpineList[i] then
self.heroSpineList[i]:setActive(false)
end
end
end
self.allHeroCount = #self.heroList
self.unlockCount = DataManager.HeroData:getUnlockHeroCount()
local lockCount = self.allHeroCount - self.unlockCount
local cellCount = 0
if self.unlockCount > 0 then
cellCount = cellCount + math.ceil(self.unlockCount / 4)
end
if lockCount > 0 then
cellCount = cellCount + math.ceil(lockCount / 4)
end
local currCount = self.scrollRect:getTotalCount()
if cellCount == currCount and not DataManager.TutorialData:getIsInTutorial() then -- 引导的时候强制重新填充
self.scrollRect:refreshAll()
else
self.scrollRect:clearCells()
self.scrollRect:refillCells(cellCount)
end
end
function HeroComp:onClickHero(cell, heroId)
if not cell or not heroId then
self.largeHeroCell:getBaseObject():setAnchoredPositionX(OUT_SCREEN_X)
return
end
local entity = DataManager.HeroData:getHeroById(heroId)
if entity then
if entity:isActived() and not DataManager.FormationData:heroInFormation(self.battleType, heroId) then
local targetPos = cell:getBaseObject():getTransform().position
local sPoint = UIManager:getUICameraComponent():WorldToScreenPoint(targetPos)
targetPos = CS.BF.Utils.RectTransformScreenPointToLocalPointInRectangle(self.content:getTransform(), sPoint.x, sPoint.y, UIManager:getUICameraComponent())
self.largeHeroCell:getBaseObject():setAnchoredPosition(targetPos.x, targetPos.y)
self.largeHeroCell:getBaseObject():getTransform():SetAsLastSibling()
self.largeHeroCell:refresh(entity, not entity:isActived(), self.onClickUseFunc)
self.largeHeroCell:showCheck(self.curFormation[entity:getMatchType()] == heroId)
else
ModuleManager.HeroManager:showHeroDetailUI(heroId)
self.largeHeroCell:getBaseObject():setAnchoredPositionX(OUT_SCREEN_X)
end
else
self.largeHeroCell:getBaseObject():setAnchoredPositionX(OUT_SCREEN_X)
end
end
function HeroComp:adapt()
local addH = GFunc.calculateFitSizeY()
local uiMap = self:getBaseObject():genAllChildren()
local scrollRect = uiMap["hero_ui.scrollrect"]
local viewport = uiMap["hero_ui.scrollrect.viewport"]
if not self.rectDefaultSize then
self.rectDefaultSize = scrollRect:getSizeDelta()
end
if not self.viewDefaultSize then
self.viewDefaultSize = viewport:getSizeDelta()
end
scrollRect:setSizeDelta(self.rectDefaultSize.x, self.rectDefaultSize.y + addH)
viewport:setSizeDelta(self.viewDefaultSize.x, self.viewDefaultSize.y + addH)
end
function HeroComp:clearAdapt()
local uiMap = self:getBaseObject():genAllChildren()
local scrollRect = uiMap["hero_ui.scrollrect"]
local viewport = uiMap["hero_ui.scrollrect.viewport"]
if not self.rectDefaultSize then
self.rectDefaultSize = scrollRect:getSizeDelta()
end
if not self.viewDefaultSize then
self.viewDefaultSize = viewport:getSizeDelta()
end
scrollRect:setSizeDelta(self.rectDefaultSize.x, self.rectDefaultSize.y)
viewport:setSizeDelta(self.viewDefaultSize.x, self.viewDefaultSize.y)
end
function HeroComp:getHeroCell(heroId)
if not self.scrollRect then
return
end
local targetCell
for index, cell in pairs(self.scrollRect:getListCell()) do
local heroCell = cell:getHeroCellByHeroId(heroId)
if heroCell then
targetCell = heroCell
break
end
end
return targetCell
end
-- 刷新图鉴入口
function HeroComp:refreshCollectEntrance()
if self.battleType == GConst.BattleConst.FORMATION_TYPE.STAGE then
self.btnCollection:setVisible(DataManager.CollectionData:isOpen(GConst.CollectionConst.TYPE.HERO))
if DataManager.CollectionData:hasRedPoint(GConst.CollectionConst.TYPE.HERO) then
self.btnCollection:addRedPoint(25, 30, 0.6)
else
self.btnCollection:removeRedPoint()
end
else
self.btnCollection:setVisible(false)
end
end
return HeroComp