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.stageFormation, self.allHeroCount, self.unlockCount, function(cell, heroId) self:onClickHero(cell, heroId) end) end) self.heroList = {} local heroCfg = ConfigManager:getConfig("hero") for id, v in pairs(heroCfg) do table.insert(self.heroList, {cfgId = id, sort = id, elementType = v.position}) end 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.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) for index, obj in ipairs(self.heroNodeList) do obj:addClickListener(function() local heroId = self.stageFormation[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 end function HeroComp:refresh() self:clearAdapt() self:adapt() self.stageFormation = DataManager.FormationData:getStageFormation() self:refreshStageFormation() self:refreshScrollRect() end function HeroComp:refreshStageFormation() for i = 1, 5 do local heroId = self.stageFormation[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.stageFormation[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, -52, 0) end) end else self.heroAddImgList[i]:setVisible(true) if self.heroSpineList[i] then self.heroSpineList[i]:setActive(false) end end end end function HeroComp:refreshScrollRect() self:sortHeroList() 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 then self.scrollRect:updateAllCell() else self.scrollRect:clearCells() self.scrollRect:refillCells(cellCount) end end -- 等级>品质>id function HeroComp:sortHeroList() local HeroData = DataManager.HeroData for _, info in ipairs(self.heroList) do local heroEntity = HeroData:getHeroById(info.cfgId) local sort = info.cfgId -- id 预留6位 sort = sort + (10 - info.elementType) * 1000000 -- 位置预留1位 sort = sort + 10000000 * heroEntity:getQlt() -- 品质1位 sort = sort + 100000000 * heroEntity:getLv() -- 预留3位 if heroEntity:isUnlock() then sort = sort + 300000000000 if heroEntity:isActived() then sort = sort + 400000000000 else sort = sort + 300000000000 end elseif DataManager.BagData.ItemData:getItemNumById(heroEntity:getFragmentId()) > 0 then sort = sort + 200000000000 else sort = sort + 100000000000 end info.sort = sort end table.sort(self.heroList, function(a, b) return a.sort > b.sort 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() 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.largeHeroCell:showCheck(self.stageFormation[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 return HeroComp