---@class MainCityUI : BaseUI local MainCityUI = class("MainCityUI", BaseUI) local BF_UI_HELPER = GConst.TYPEOF_UNITY_CLASS.BF_UI_HELPER local HERO_MAIN_COMP = "app/ui/hero/hero_main_comp" -- 主角组件 local SECT_MAIN_COMP = "" -- TODO 门派组件 local TRAIN_MAIN_COMP = "app/ui/train/train_main_comp" -- 修炼组件 local DUNGEON_MAIN_COMP = "app/ui/dungeon/dungeon_main_comp" -- 试炼组件 local SHOP_MAIN_COMP = "app/ui/shop/shop_main_comp" -- 商店组件 local MINE_MAIN_COMP = "app/ui/mining/mining_main_comp" --地下城(挖矿)组件 local BOTTOM_BTN_CELL = "app/ui/main_city/cell/bottom_btn_cell" local BOTTOM_BTN_CELL_COUNT = 5 local CHAPTER_SLIDER_COMP = "app/ui/main_city/component/chapter_slider_comp" local TUTORIAL_TASK_COMP = "app/ui/main_city/component/tutorial_task_comp" local DELAY_RESUME_TIME = 0.5 local SIDE_BAR_DEFAULT_CELL_WIDTH = 80 local SIDE_BAR_DEFAULT_CELL_WIDTH_SPACE = 10 local SIDE_BAR_DEFAULT_CELL_HEIGHT = 80 local SIDE_BAR_DEFAULT_CELL_HEIGHT_SPACE = 32 local SIDE_BAR_COMP_TYPE = { STRENGTH = 1001, -- 强化 MONTHLY_CARD = 1011, -- 月卡 SPEED_UP = 1021, -- 加速 BOUNTY = 1031, -- 战令 TASK = 2001, -- 任务 HANDBOOK = 2011, -- 图鉴 ACTIVITY = 2021, -- 活动 } local SIDE_BAR_PREFAB_PATH = { -- 左边 [SIDE_BAR_COMP_TYPE.STRENGTH] = "assets/prefabs/ui/main_city/cell/side_bar_base_cell.prefab", [SIDE_BAR_COMP_TYPE.MONTHLY_CARD] = "assets/prefabs/ui/main_city/cell/side_bar_base_cell.prefab", [SIDE_BAR_COMP_TYPE.SPEED_UP] = "assets/prefabs/ui/main_city/cell/side_bar_base_cell.prefab", [SIDE_BAR_COMP_TYPE.BOUNTY] = "assets/prefabs/ui/main_city/cell/side_bar_base_cell.prefab", -- 右边 [SIDE_BAR_COMP_TYPE.TASK] = "assets/prefabs/ui/main_city/cell/side_bar_base_cell.prefab", [SIDE_BAR_COMP_TYPE.HANDBOOK] = "assets/prefabs/ui/main_city/cell/side_bar_base_cell.prefab", [SIDE_BAR_COMP_TYPE.ACTIVITY] = "assets/prefabs/ui/main_city/cell/side_bar_base_cell.prefab", } local SIDE_BAR_COMP_PATH = { -- 左边 [SIDE_BAR_COMP_TYPE.STRENGTH] = "app/ui/main_city/cell/side_bar_strength_cell", [SIDE_BAR_COMP_TYPE.MONTHLY_CARD] = "app/ui/main_city/cell/side_bar_monthly_card_cell", [SIDE_BAR_COMP_TYPE.SPEED_UP] = "app/ui/main_city/cell/side_bar_speed_up_cell", [SIDE_BAR_COMP_TYPE.BOUNTY] = "app/ui/main_city/cell/side_bar_bounty_cell", -- 右边 [SIDE_BAR_COMP_TYPE.TASK] = "app/ui/main_city/cell/side_bar_task_cell", [SIDE_BAR_COMP_TYPE.HANDBOOK] = "app/ui/main_city/cell/side_bar_handbook_cell", [SIDE_BAR_COMP_TYPE.ACTIVITY] = "app/ui/main_city/cell/side_bar_activity_cell", } local SIDE_BAR_NAME = { [SIDE_BAR_COMP_TYPE.STRENGTH] = "strength_cell", [SIDE_BAR_COMP_TYPE.MONTHLY_CARD] = "monthly_card_cell", [SIDE_BAR_COMP_TYPE.SPEED_UP] = "speed_up_cell", [SIDE_BAR_COMP_TYPE.BOUNTY] = "bounty_cell", [SIDE_BAR_COMP_TYPE.TASK] = "task_cell", [SIDE_BAR_COMP_TYPE.HANDBOOK] = "handbook_cell", [SIDE_BAR_COMP_TYPE.ACTIVITY] = "activity_cell", } local BLACK_FADE_TIME = 0.25 local SAVE_POWER_MODE_TIME = 60 function MainCityUI:getUIType() return UIManager.UI_TYPE.MAIN end function MainCityUI:currencyParams() self.targetIndex = self.targetIndex or 0 local params = {} local hidAddImg = false params.showType = GConst.CURRENCY_TYPE.HORIZONTAL if self.battleType == ModuleManager.BattleManager.BATTLE_TYPE.STAGE then if self.targetIndex == 0 then -- 默认状态 params.itemIds = { GConst.ItemConst.ITEM_ID_GOLD, GConst.ItemConst.ITEM_ID_GEM, } elseif self.targetIndex == GConst.MainCityConst.BOTTOM_PAGE.HERO then -- 主角 params.itemIds = { GConst.ItemConst.ITEM_ID_GOLD, GConst.ItemConst.ITEM_ID_GEM, } elseif self.targetIndex == GConst.MainCityConst.BOTTOM_PAGE.SECT then -- 门派 params.itemIds = { GConst.ItemConst.ITEM_ID_GOLD, GConst.ItemConst.ITEM_ID_GEM, } elseif self.targetIndex == GConst.MainCityConst.BOTTOM_PAGE.TRAIN then -- 强化 params.itemIds = { GConst.ItemConst.ITEM_ID_GOLD, GConst.ItemConst.ITEM_ID_GEM, } elseif self.targetIndex == GConst.MainCityConst.BOTTOM_PAGE.DUNGEON then -- 地下城 params.itemIds = { GConst.ItemConst.ITEM_ID_GOLD, GConst.ItemConst.ITEM_ID_GEM, } elseif self.targetIndex == GConst.MainCityConst.BOTTOM_PAGE.SHOP then -- 商店 params.itemIds = { GConst.ItemConst.ITEM_ID_GOLD, GConst.ItemConst.ITEM_ID_GEM, } end else hidAddImg = true if self.battleType == ModuleManager.BattleManager.BATTLE_TYPE.DUNGEON_GOLD then params.itemIds = { GConst.ItemConst.ITEM_ID_GOLD, } elseif self.battleType == ModuleManager.BattleManager.BATTLE_TYPE.DUNGEON_GEM then params.itemIds = { GConst.ItemConst.ITEM_ID_GEM, } else params.itemIds = GConst.EMPTY_TABLE end end return params, true, hidAddImg end function MainCityUI:updateCurrentBattleType(battleType) if self.battleType ~= battleType then self.battleType = battleType self:updateCurrencyBar() end end function MainCityUI:getPrefabPath() return "assets/prefabs/ui/main_city/main_ui.prefab" end function MainCityUI:ctor(params) self.isFirstEnter = params and params.isFirstEnter self.targetIndex = params and params.targetIndex or 0 self.battleType = params and params.battleType or ModuleManager.BattleManager.BATTLE_TYPE.STAGE self.savePowerModeTime = SAVE_POWER_MODE_TIME end function MainCityUI:onReshow() if self.mineComp then self.mineComp:checkRedPoint() end end function MainCityUI:onLoadRootComplete() if self:isClosed() then return end self.uiMap = self.root:genAllChildren() self:_display() self:_addListeners() self:_bind() self:updateTime() self:scheduleGlobal(function() self:updateTime() end, 1) self:hideBlackUI() DataManager.HeroData:getMainHeroEntity():getPassiveSkillIds() end function MainCityUI:_display() self:refreshRoleInfo() -- 刷新左上角角色信息 self:initBattleNode() -- 初始化战斗节点 self:initComp() -- 初始化页签界面 self:initBottom() -- 初始化底部页签 self:refreshBottom(nil, false) -- 刷新底部页签 self:refreshChapterSlider() -- 刷新章节滑动条 self:refreshPower() -- 检查弹窗 self:checkMainPop() end function MainCityUI:_addListeners() self:addEventListener(EventManager.CUSTOM_EVENT.MAIN_UI_CHECK_POP, function() self:checkMainPop() end) self:addEventListener(EventManager.CUSTOM_EVENT.CURRENCY_BAR_FLY_OVER, function(params) if self.battleType == ModuleManager.BattleManager.BATTLE_TYPE.STAGE then DataManager.ChapterData:addStageCoinToBagWhenFlyOver() -- 关卡怪物金币入包 elseif self.battleType == ModuleManager.BattleManager.BATTLE_TYPE.DUNGEON_GOLD then UIManager:refreshCurrencyAddTx(GConst.ItemConst.ITEM_ID_GOLD, DataManager.DungeonData:getCacheDungeonDropBigNum()) elseif self.battleType == ModuleManager.BattleManager.BATTLE_TYPE.DUNGEON_GEM then UIManager:refreshCurrencyAddTx(GConst.ItemConst.ITEM_ID_GEM, DataManager.DungeonData:getCacheDungeonDropBigNum()) end end) self:addEventListener(EventManager.CUSTOM_EVENT.TUTORIAL_TASK_REWARD, function(rewards) if rewards and self.tutorialTaskComp then GFunc.showCurrencyFlyAction(rewards, self.tutorialTaskComp:getBaseObject():getTransform().position) end end) self:addEventListener(EventManager.CUSTOM_EVENT.CURRENCY_BAR_FLY, function(params) local pos = params.pos local imgNum = params.imgNum local itemIds = params.itemIds if self.targetIndex == 0 and self:isTopUI() then if itemIds and #itemIds > 0 then local allPos = {} for i = 1, imgNum do local posX, posY = GFunc.randomPos(i, {x = pos.x, y = pos.y}) allPos[i] = {x = posX, y = posY} end local flyPos = {} for _, id in ipairs(itemIds) do flyPos[id] = allPos end UIManager:showCurrencyAction(flyPos) end else EventManager:dispatchEvent(EventManager.CUSTOM_EVENT.CURRENCY_BAR_FLY_OVER) end end) self:addEventListener(EventManager.CUSTOM_EVENT.BATTLE_SHOW_CHAPTER_BLACK_UI, function(params) self:showBlackUI(params.desc, params.time, params.isShowFail) end) self:addEventListener(EventManager.CUSTOM_EVENT.BATTLE_SHOW_TOAST, function(params) if self.targetIndex == 0 and self:isTopUI() then GFunc.showToast(params) end end) self:addEventListener(EventManager.CUSTOM_EVENT.ATK_TRAIN_TUTORIAL_OVER, function() if self.trainComp then self.trainComp:clearTrainStatus() end end) self:addEventListener(EventManager.CUSTOM_EVENT.TUTORIAL_TASK_STOP, function() self:checkTutorialTaskMask() end) self:addEventListener(EventManager.CUSTOM_EVENT.GET_ANY_KEY_DOWN, function() self:resetSavePowerTime() end) end function MainCityUI:_bind() self:addEventListener(EventManager.CUSTOM_EVENT.CHANGE_MAIN_CITY_PAGE, function(params) params = params or {} local oldPage = self.targetIndex local page = params.page or self.targetIndex if page == GConst.MainCityConst.BOTTOM_PAGE.SHOP then self.showStoreIdx = params.storeIdx self.storeOffsetY = params.storeOffsetY end self:refreshBottom(page, true) if page == GConst.MainCityConst.BOTTOM_PAGE.SHOP then self.shopComp:refresh(self, self.showStoreIdx) end end) self:bind(DataManager.ChapterData, "isDirty", function(binder, value) self:refreshChapterSlider() end) self:bind(DataManager.TutorialTaskData, "isDirty", function() self:_refreshChapterTask() self:checkTutorialTaskMask() self:refreshBottomIconOnly() if self.targetIndex == GConst.MainCityConst.BOTTOM_PAGE.TRAIN and self.trainComp then self.trainComp:refreshTutorialTask() end end, true) self:bind(DataManager.DungeonData, "isDirty", function(binder, value) self.dungeonComp:refresh() end) self:bind(DataManager.BagData.ItemData, "dirty", function(binder, value) self.dungeonComp:refresh() self.mineComp:refresh() end) self:bind(DataManager.ShopData, "isDirty", function(binder, value) self.shopComp:refresh() end) self:bind(DataManager.HeroData:getMainHeroEntity(), "powerDirty", function(binder, value) self:refreshPower() end) self:bind(DataManager.PlayerData, "level", function(binder, value) self:refreshBottomIconOnly() end) self:bind(DataManager.ChapterData, "historyChapterId", function(binder, value) self:refreshBottomIconOnly() end) DataManager:registerCrossDayFunc("crossDay", function() DataManager:resetSignInInfo() DataManager.SummonData:resetDailyAdTimes() -- 检查弹窗 self:checkMainPop() end) end function MainCityUI:initBattleNode() self.battleNode = self.uiMap["main_ui.battle_node"] end function MainCityUI:getBattleNode() return self.battleNode end function MainCityUI:onSetUIOrder() if self.subComps then for index, comp in pairs(self.subComps) do local order = self._baseRootCanvas.sortingOrder local uiHelper = comp:getGameObject():GetComponent(BF_UI_HELPER) if uiHelper then uiHelper:SetSortingOrder(order + 1) end end end end -- 左上角头像与角色信息 function MainCityUI:refreshRoleInfo() if not self.avatarCell then self.avatarCell = CellManager:addCellComp(self.uiMap["main_ui.role_node.avatar_cell"], GConst.TYPEOF_LUA_CLASS.AVATAR_CELL) end self.avatarCell:refresh() self.avatarCell:addClickListener(function() ModuleManager.GameSettingManager:showSettingUI() end) self:refreshPower() end -- 初始化底部页签栏 function MainCityUI:initBottom() if not self.bottomBtnCells then self.bottomBtnCells = {} for i = 1, BOTTOM_BTN_CELL_COUNT do table.insert(self.bottomBtnCells, CellManager:addCellComp(self.uiMap["main_ui.bottom_node.bottom_btn_cell_" .. i], BOTTOM_BTN_CELL)) end end for i = 1, BOTTOM_BTN_CELL_COUNT do local icon = GConst.MainCityConst.BOTTOM_ICON[i] local closeIcon = GConst.MainCityConst.BOTTOM_CLOSE_ICON[i] local isOpen if i == GConst.MainCityConst.BOTTOM_PAGE.DUNGEON then isOpen = ModuleManager:getIsOpen(ModuleManager.MODULE_KEY.DUNGEON_GOLD, true) or ModuleManager:getIsOpen(ModuleManager.MODULE_KEY.DUNGEON_DIAMOND, true) or ModuleManager:getIsOpen(ModuleManager.MODULE_KEY.DUNGEON_RUNE, true) or ModuleManager:getIsOpen(ModuleManager.MODULE_KEY.ARENA, true) elseif i == GConst.MainCityConst.BOTTOM_PAGE.SHOP then isOpen = ModuleManager:getIsOpen(ModuleManager.MODULE_KEY.SHOP, true) or ModuleManager:getIsOpen(ModuleManager.MODULE_KEY.SUMMON_WEAPON, true) end self.bottomBtnCells[i]:refresh(i, false, icon, closeIcon, isOpen) self.bottomBtnCells[i]:addClickListener(function() local isOpen if i == GConst.MainCityConst.BOTTOM_PAGE.DUNGEON then isOpen = ModuleManager:getIsOpen(ModuleManager.MODULE_KEY.DUNGEON_GOLD, true) if not isOpen then isOpen = ModuleManager:getIsOpen(ModuleManager.MODULE_KEY.DUNGEON_DIAMOND, true) if not isOpen then isOpen = ModuleManager:getIsOpen(ModuleManager.MODULE_KEY.DUNGEON_RUNE, true) if not isOpen then isOpen = ModuleManager:getIsOpen(ModuleManager.MODULE_KEY.ARENA, true) end end end if not isOpen then -- 弹toast local notShowToast = ModuleManager:getIsOpen(ModuleManager.MODULE_KEY.DUNGEON_GOLD, false) if notShowToast then notShowToast = ModuleManager:getIsOpen(ModuleManager.MODULE_KEY.DUNGEON_DIAMOND, false) if notShowToast then notShowToast = ModuleManager:getIsOpen(ModuleManager.MODULE_KEY.DUNGEON_RUNE, false) if notShowToast then notShowToast = ModuleManager:getIsOpen(ModuleManager.MODULE_KEY.ARENA, false) end end end end elseif i == GConst.MainCityConst.BOTTOM_PAGE.SHOP then isOpen = ModuleManager:getIsOpen(ModuleManager.MODULE_KEY.SHOP, true) if not isOpen then isOpen = ModuleManager:getIsOpen(ModuleManager.MODULE_KEY.SUMMON_WEAPON, true) end if not isOpen then -- 弹toast local notShowToast = ModuleManager:getIsOpen(ModuleManager.MODULE_KEY.SHOP, false) if notShowToast then notShowToast = ModuleManager:getIsOpen(ModuleManager.MODULE_KEY.SUMMON_WEAPON, false) end end else isOpen = ModuleManager:getIsOpen(GConst.MainCityConst.BOTTOM_MODULE_KEY[i], false) end if isOpen then self:refreshBottom(i, true) end end) end self.tutorialTaskFinger = self.uiMap["main_ui.bottom_node.tutorial_finger"] end -- 刷新底部页签栏 function MainCityUI:refreshBottom(targetIndex, playAnim) targetIndex = targetIndex or 0 -- 如果点击一样的 则是关闭效果 if self.targetIndex == targetIndex then targetIndex = 0 end local oldIndex = self.targetIndex self.targetIndex = targetIndex if playAnim then -- 动画 TODOJ for i = 1, BOTTOM_BTN_CELL_COUNT do local icon = GConst.MainCityConst.BOTTOM_ICON[i] local closeIcon = GConst.MainCityConst.BOTTOM_CLOSE_ICON[i] local isOpen if i == GConst.MainCityConst.BOTTOM_PAGE.DUNGEON then isOpen = ModuleManager:getIsOpen(ModuleManager.MODULE_KEY.DUNGEON_GOLD, true) or ModuleManager:getIsOpen(ModuleManager.MODULE_KEY.DUNGEON_DIAMOND, true) or ModuleManager:getIsOpen(ModuleManager.MODULE_KEY.DUNGEON_RUNE, true) or ModuleManager:getIsOpen(ModuleManager.MODULE_KEY.ARENA, true) elseif i == GConst.MainCityConst.BOTTOM_PAGE.SHOP then isOpen = ModuleManager:getIsOpen(ModuleManager.MODULE_KEY.SHOP, true) or ModuleManager:getIsOpen(ModuleManager.MODULE_KEY.SUMMON_WEAPON, true) else isOpen = ModuleManager:getIsOpen(GConst.MainCityConst.BOTTOM_MODULE_KEY[i], true) end self.bottomBtnCells[i]:refresh(i, targetIndex == i, icon, closeIcon, isOpen) end else for i = 1, BOTTOM_BTN_CELL_COUNT do local icon = GConst.MainCityConst.BOTTOM_ICON[i] local closeIcon = GConst.MainCityConst.BOTTOM_CLOSE_ICON[i] local isOpen if i == GConst.MainCityConst.BOTTOM_PAGE.DUNGEON then isOpen = ModuleManager:getIsOpen(ModuleManager.MODULE_KEY.DUNGEON_GOLD, true) or ModuleManager:getIsOpen(ModuleManager.MODULE_KEY.DUNGEON_DIAMOND, true) or ModuleManager:getIsOpen(ModuleManager.MODULE_KEY.DUNGEON_RUNE, true) or ModuleManager:getIsOpen(ModuleManager.MODULE_KEY.ARENA, true) elseif i == GConst.MainCityConst.BOTTOM_PAGE.SHOP then isOpen = ModuleManager:getIsOpen(ModuleManager.MODULE_KEY.SHOP, true) or ModuleManager:getIsOpen(ModuleManager.MODULE_KEY.SUMMON_WEAPON, true) else isOpen = ModuleManager:getIsOpen(GConst.MainCityConst.BOTTOM_MODULE_KEY[i], true) end self.bottomBtnCells[i]:refresh(i, targetIndex == i, icon, closeIcon, isOpen) end end -- 展示页签内容 if self.targetIndex == 0 or self.subComps[self.targetIndex] then self:switchComp(self.targetIndex, oldIndex) end self:refreshBottomRedPoint() self:checkTutorialTaskMask() -- 战斗开启与暂停 if self.battleType == ModuleManager.BattleManager.BATTLE_TYPE.STAGE and oldIndex ~= self.targetIndex then if self.targetIndex == 0 then if self.resumeBattleId then SchedulerManager:unscheduleGlobal(self.resumeBattleId) end self.resumeBattleId = self:performWithDelayGlobal(function() self.resumeBattleId = nil if self.battleType == ModuleManager.BattleManager.BATTLE_TYPE.STAGE and oldIndex ~= self.targetIndex then ModuleManager.BattleManager:resumeFight() end end, DELAY_RESUME_TIME) else if not DataManager.BattleData:getIsAutoFight() or self.targetIndex == GConst.MainCityConst.BOTTOM_PAGE.TRAIN then ModuleManager.BattleManager:pauseFight() end end end end function MainCityUI:refreshBottomIconOnly() for i = 1, BOTTOM_BTN_CELL_COUNT do local icon = GConst.MainCityConst.BOTTOM_ICON[i] local closeIcon = GConst.MainCityConst.BOTTOM_CLOSE_ICON[i] local isOpen if 1 == GConst.MainCityConst.BOTTOM_PAGE.DUNGEON then isOpen = ModuleManager:getIsOpen(ModuleManager.MODULE_KEY.DUNGEON_GOLD, true) or ModuleManager:getIsOpen(ModuleManager.MODULE_KEY.DUNGEON_DIAMOND, true) or ModuleManager:getIsOpen(ModuleManager.MODULE_KEY.DUNGEON_RUNE, true) or ModuleManager:getIsOpen(ModuleManager.MODULE_KEY.ARENA, true) elseif i == GConst.MainCityConst.BOTTOM_PAGE.SHOP then isOpen = ModuleManager:getIsOpen(ModuleManager.MODULE_KEY.SHOP, true) or ModuleManager:getIsOpen(ModuleManager.MODULE_KEY.SUMMON_WEAPON, true) else isOpen = ModuleManager:getIsOpen(GConst.MainCityConst.BOTTOM_MODULE_KEY[i], true) end self.bottomBtnCells[i]:refresh(i, self.targetIndex == i, icon, closeIcon, isOpen) end end -- 初始化页签界面 function MainCityUI:initComp() if not self.subComps then local uiMap = self.root:genAllChildren() self.subComps = {} -- 主角 local heroComp = uiMap["main_ui.sub_ui_node.hero_main_comp"] heroComp:initPrefabHelper() heroComp:genAllChildren() self.subComps[1] = heroComp:addLuaComponent(HERO_MAIN_COMP) self.heroComp = self.subComps[1] -- 试炼副本 local dungeonComp = uiMap["main_ui.sub_ui_node.dungeon_main_comp"] dungeonComp:initPrefabHelper() dungeonComp:genAllChildren() self.subComps[2] = dungeonComp:addLuaComponent(DUNGEON_MAIN_COMP) self.dungeonComp = self.subComps[2] self.dungeonComp:setParentUI(self) -- 强化 local trainComp = uiMap["main_ui.sub_ui_node.train_main_comp"] trainComp:initPrefabHelper() trainComp:genAllChildren() self.subComps[3] = trainComp:addLuaComponent(TRAIN_MAIN_COMP) self.trainComp = self.subComps[3] -- 地下城 local mineComp = uiMap["main_ui.sub_ui_node.mine_main_comp"] mineComp:initPrefabHelper() mineComp:genAllChildren() self.subComps[4] = mineComp:addLuaComponent(MINE_MAIN_COMP) self.mineComp = self.subComps[4] self.mineComp:setParentUI(self) -- 商城 local shopComp = uiMap["main_ui.sub_ui_node.shop_main_comp"] shopComp:initPrefabHelper() shopComp:genAllChildren() self.subComps[5] = shopComp:addLuaComponent(SHOP_MAIN_COMP) self.shopComp = self.subComps[5] self.shopComp:setParentUI(self) self:onSetUIOrder() end end -- 切换展示对应页签 function MainCityUI:switchComp(index, oldIndex) index = index or self.targetIndex for i, comp in pairs(self.subComps) do -- 页签被隐藏时调用 if oldIndex and comp.onHide and i ~= index and oldIndex == GConst.MainCityConst.BOTTOM_PAGE.TRAIN then comp:onHide() end comp:getBaseObject():setActive(i == index) if i == index then comp:refresh(self) self:updateTime() end end self:updateCurrencyBar() self:checkMainPop() end -- 定时器 function MainCityUI:updateTime() self:refreshSubComps() self:refreshLeftNode() self:refreshRightNode() self:refreshBottomRedPoint() self:updateSavePowerModeTime() DataManager.BlessingData:addTimeCount() end -- 定时刷新子页签内容 function MainCityUI:refreshSubComps() -- TODO self.shopComp:updateTime() end -- 定时刷新左部分界面 function MainCityUI:refreshLeftNode() self:_refreshLeftSideBar() end -- 定时刷新左侧边栏 function MainCityUI:_refreshLeftSideBar() local leftNum = 0 local offsetY = - SIDE_BAR_DEFAULT_CELL_HEIGHT / 2 local x = 0 local y = 0 local rp = false -- 总红点 local leftSideBarNode = self.uiMap["main_ui.left_node.side_bar_bg"] -- 祝福 ******************************************************************************************** local isOpen = ModuleManager:getIsOpen(ModuleManager.MODULE_KEY.BLESSING, true) if isOpen then offsetY, leftNum, x, y = self:_getSideBtnPos(leftNum, offsetY) end local isShake = false local isRed = false -- TODO 红点逻辑 rp = rp or (isOpen and isRed) local forceDisVisible = false local isAdPoint = DataManager.BlessingData:showVideoPoint() self:_refreshSideBar(SIDE_BAR_COMP_TYPE.STRENGTH, isOpen, isShake, isRed, isAdPoint, leftSideBarNode, x, y, forceDisVisible, function() ModuleManager.BlessingManager:showBlessingMainUI() end) -- 挂机 ******************************************************************************************** isOpen = ModuleManager:getIsOpen(ModuleManager.MODULE_KEY.IDLE, true) and ModuleManager.IdleManager:canGetIdleDrop() if isOpen then offsetY, leftNum, x, y = self:_getSideBtnPos(leftNum, offsetY) end isShake = true isRed = false -- TODO 红点逻辑 rp = rp or (isOpen and isRed) forceDisVisible = false local isAdPoint = false self:_refreshSideBar(SIDE_BAR_COMP_TYPE.MONTHLY_CARD, isOpen, isShake, isRed, isAdPoint, leftSideBarNode, x, y, forceDisVisible, function() ModuleManager.IdleManager:onBaseGetDrop() end) -- 加速 ******************************************************************************************** isOpen = DataManager.AccelerationData:getIsOpen() if isOpen then offsetY, leftNum, x, y = self:_getSideBtnPos(leftNum, offsetY) end isShake = false isRed = false rp = rp or (isOpen and isRed) forceDisVisible = false local isAdPoint = false self:_refreshSideBar(SIDE_BAR_COMP_TYPE.SPEED_UP, isOpen, isShake, isRed, isAdPoint, leftSideBarNode, x, y, forceDisVisible, function() ModuleManager.BattleManager:showBattleSpeedUpUI() end) -- 战令/基金 ******************************************************************************************** isOpen = ModuleManager.BountyManager:isOpen() if isOpen then offsetY, leftNum, x, y = self:_getSideBtnPos(leftNum, offsetY) end isShake = false isRed = ModuleManager.BountyManager:showRp() rp = rp or (isOpen and isRed) forceDisVisible = false local isAdPoint = false self:_refreshSideBar(SIDE_BAR_COMP_TYPE.BOUNTY, isOpen, isShake, isRed, isAdPoint, leftSideBarNode, x, y, forceDisVisible, function() ModuleManager.ActivityManager:showHallUI(ModuleManager.BountyManager:getAllActList()) end) -- 处理总红点 -- TODOJ end -- 定时刷新章节进度 function MainCityUI:refreshChapterSlider() local sliderObj = self.uiMap["main_ui.chapter_slider_node.chapter_slider_comp"] if not self.chapterSliderComp then sliderObj:initPrefabHelper() sliderObj:genAllChildren() self.chapterSliderComp = sliderObj:addLuaComponent(CHAPTER_SLIDER_COMP) end self.chapterSliderComp:refresh() -- boss章节隐藏 if DataManager.ChapterData:checkIsFirstRewardChapter(DataManager.ChapterData:getCurChapterId() + 1) then sliderObj:setVisible(false) else sliderObj:setVisible(true) end end -- 定时刷新右部分界面 function MainCityUI:refreshRightNode() self:_refreshEmailBtn() self:_refreshChapterTask() self:_refreshRightSideBar() end -- 定时刷新邮件 function MainCityUI:_refreshEmailBtn() local emailBtn = self.uiMap["main_ui.right_node.email_btn"] emailBtn:addClickListener(function() ModuleManager.MailManager:showUI() end) local mailIsOpen = DataManager.MailData:getIsOpen() if self.mailIsOpen ~= mailIsOpen then emailBtn:setActive(mailIsOpen) self.mailIsOpen = mailIsOpen end local isRed, isAdRp = DataManager.MailData:getRedPoint() if isRed then local iconName if isAdRp then iconName = GFunc.getAdSprite() end emailBtn:addRedPoint(23, 14, 0.6, iconName, nil, true) else emailBtn:removeRedPoint() end end -- 定时刷新任务 function MainCityUI:_refreshChapterTask() if not self.tutorialTaskComp then local taskObj = self.uiMap["main_ui.right_node.tutorial_task_comp"] taskObj:initPrefabHelper() taskObj:genAllChildren() self.tutorialTaskComp = self.uiMap["main_ui.right_node.tutorial_task_comp"]:addLuaComponent(TUTORIAL_TASK_COMP) end local over = DataManager.TutorialTaskData:getTaskCollect() self.tutorialTaskComp:getBaseObject():setVisible(not over) if not over then self.tutorialTaskComp:refresh() end end -- 定时刷新右侧边栏 function MainCityUI:_refreshRightSideBar() local rightNum = 0 local offsetY = - SIDE_BAR_DEFAULT_CELL_HEIGHT / 2 local x = 0 local y = 0 local rp = false local rightSideBarNode = self.uiMap["main_ui.right_node.side_bar_bg"] -- 任务 ***************************************************************************************************** local isOpen = true -- TODO 开启逻辑 if isOpen then offsetY, rightNum, x, y = self:_getSideBtnPos(rightNum, offsetY) end local isShake = false local isRed = DataManager.DailyTaskData:showRedPoint() rp = rp or (isOpen and isRed) local forceDisVisible = false local isAdPoint = DataManager.DailyTaskData:showAdPoint() self:_refreshSideBar(SIDE_BAR_COMP_TYPE.TASK, isOpen, isShake, isRed, isAdPoint, rightSideBarNode, x, y, forceDisVisible, function() ModuleManager.DailyTaskManager:showUI() end) -- 图鉴 ***************************************************************************************************** isOpen = ModuleManager:getIsOpen(ModuleManager.MODULE_KEY.COLLECTION, true) if isOpen then offsetY, rightNum, x, y = self:_getSideBtnPos(rightNum, offsetY) end isShake = false isRed = DataManager.CollectionData:showRedPoint() rp = rp or (isOpen and isRed) forceDisVisible = false local isAdPoint = false self:_refreshSideBar(SIDE_BAR_COMP_TYPE.HANDBOOK, isOpen, isShake, isRed, isAdPoint, rightSideBarNode, x, y, forceDisVisible, function() -- 打开图鉴界面 ModuleManager.CollectionManager:showCollectionUI() end) -- 活动 ***************************************************************************************************** isOpen = DataManager.SevenDayData:getIsOpen() if isOpen then offsetY, rightNum, x, y = self:_getSideBtnPos(rightNum, offsetY) end isShake = false -- isRed = ModuleManager.ActivityManager:showRp() isRed = DataManager.SevenDayData:getRp() rp = rp or (isOpen and isRed) forceDisVisible = false local isAdPoint = false self:_refreshSideBar(SIDE_BAR_COMP_TYPE.ACTIVITY, isOpen, isShake, isRed, isAdPoint, rightSideBarNode, x, y, forceDisVisible, function() -- ModuleManager.ActivityManager:showHallUI() ModuleManager.SevenDayManager:showUI() end) -- 处理总红点 -- TODOJ end -- 定时刷新底部红点 function MainCityUI:refreshBottomRedPoint() -- 英雄 if DataManager.HeroData:showHeroRedPoint() and self.targetIndex ~= GConst.MainCityConst.BOTTOM_PAGE.HERO then self.bottomBtnCells[GConst.MainCityConst.BOTTOM_PAGE.HERO].baseObject:addRedPoint(40, 40, 0.7) else self.bottomBtnCells[GConst.MainCityConst.BOTTOM_PAGE.HERO].baseObject:removeRedPoint() end -- 修炼 if DataManager.ChapterData:showTrainRedPoint() and self.targetIndex ~= GConst.MainCityConst.BOTTOM_PAGE.TRAIN then self.bottomBtnCells[GConst.MainCityConst.BOTTOM_PAGE.TRAIN].baseObject:addRedPoint(40, 40, 0.7) else self.bottomBtnCells[GConst.MainCityConst.BOTTOM_PAGE.TRAIN].baseObject:removeRedPoint() end -- 挖矿 if DataManager.ResearchData:showRedPoint() and self.targetIndex ~= GConst.MainCityConst.BOTTOM_PAGE.DUNGEON then self.bottomBtnCells[GConst.MainCityConst.BOTTOM_PAGE.DUNGEON].baseObject:addRedPoint(40, 40, 0.7) else self.bottomBtnCells[GConst.MainCityConst.BOTTOM_PAGE.DUNGEON].baseObject:removeRedPoint() end -- 商城显示广告图标 if DataManager.ShopData:showAdImg() and self.targetIndex ~= GConst.MainCityConst.BOTTOM_PAGE.SHOP then local skip = DataManager.MallActData:skipAd() local iconName = skip and "common_ad_4" or "common_ad_3" self.bottomBtnCells[GConst.MainCityConst.BOTTOM_PAGE.SHOP].baseObject:addRedPoint(40, 40, 0.7, iconName, nil, true) else -- 商城 if DataManager.ShopData:showRedPoint() and self.targetIndex ~= GConst.MainCityConst.BOTTOM_PAGE.SHOP then self.bottomBtnCells[GConst.MainCityConst.BOTTOM_PAGE.SHOP].baseObject:addRedPoint(40, 40, 0.7, nil, nil, true) else self.bottomBtnCells[GConst.MainCityConst.BOTTOM_PAGE.SHOP].baseObject:removeRedPoint() end end if self.tutorialTaskFinger then if DataManager.TutorialTaskData:showFinger() and (self.targetIndex == nil or self.targetIndex == 0) then self.tutorialTaskFinger:setVisible(true) self.tutorialTaskFinger:getComponent(GConst.TYPEOF_UNITY_CLASS.ANIMATOR):Play(50306902) else self.tutorialTaskFinger:setVisible(false) end end end -- 检测弹窗 function MainCityUI:checkMainPop() local topUI = UIManager:getTopUIObj() if topUI:getUIIndex() ~= self:getUIIndex() then return end -- 签到弹窗 local signIsOpen = ModuleManager.SignInManager:getIsSignInOpen() if signIsOpen and self.battleType == ModuleManager.BattleManager.BATTLE_TYPE.STAGE then local signCount, canSignIn, hasSigned = DataManager:getSignInfo() if signCount < 7 and (not hasSigned) and canSignIn then ModuleManager.SignInManager:showSignMainUI() return end end self:checkTutorial() end -- 动态获取侧边栏按钮 function MainCityUI:_refreshSideBar(type, isOpen, isShake, isRed, isAdPoint, parent, x, y, forceDisVisible, clickCallback) if not self.sideBarCells then self.sideBarCells = {} end if not self.sideBarCells[type] then if not self.loadingSideBarCells then self.loadingSideBarCells = {} end if not self.loadingSideBarCells[type] then -- 未加载中,加载对应模块侧边栏按钮 self.loadingSideBarCells[type] = true CellManager:loadCellAsync(SIDE_BAR_PREFAB_PATH[type], SIDE_BAR_COMP_PATH[type], parent, function(cell) self.loadingSideBarCells[type] = false -- 如果已经加载了 则销毁新生成的 if self.sideBarCells[type] then self.sideBarCells[type]:refresh(self, isOpen, isShake, isRed, isAdPoint, x, y, forceDisVisible, clickCallback) cell.baseObject:destroy() return end cell.baseObject:getGameObject().name = SIDE_BAR_NAME[type] self.sideBarCells[type] = cell self.sideBarCells[type]:refresh(self, isOpen, isShake, isRed, isAdPoint, x, y, forceDisVisible, clickCallback) end) end else self.sideBarCells[type]:refresh(self, isOpen, isShake, isRed, isAdPoint, x, y, forceDisVisible, clickCallback) end end -- 获取侧边栏按钮相对位置 function MainCityUI:_getSideBtnPos(btnNum, offsetY, isRight) local x = 0 local y = offsetY local maxColumnNum = self:_getMaxColumnNum() btnNum = btnNum + 1 if btnNum < maxColumnNum then offsetY = offsetY - (SIDE_BAR_DEFAULT_CELL_HEIGHT + SIDE_BAR_DEFAULT_CELL_HEIGHT_SPACE) else local num = btnNum - maxColumnNum if num > 0 then if not isRight then x = SIDE_BAR_DEFAULT_CELL_WIDTH + SIDE_BAR_DEFAULT_CELL_WIDTH_SPACE else x = - (SIDE_BAR_DEFAULT_CELL_WIDTH + SIDE_BAR_DEFAULT_CELL_WIDTH_SPACE) end end offsetY = -(SIDE_BAR_DEFAULT_CELL_HEIGHT / 2) - num * (SIDE_BAR_DEFAULT_CELL_HEIGHT + SIDE_BAR_DEFAULT_CELL_HEIGHT_SPACE) end return offsetY, btnNum, x, y end -- 侧边栏按钮可支持数量 function MainCityUI:_getMaxColumnNum() if not self.maxColumnNum then local screenOffsetY = GFunc.calculateFitSizeY() self.maxColumnNum = 5 + screenOffsetY // (SIDE_BAR_DEFAULT_CELL_HEIGHT + SIDE_BAR_DEFAULT_CELL_HEIGHT_SPACE) end return self.maxColumnNum end function MainCityUI:checkTutorial() if self.targetIndex == nil or self.targetIndex == 0 then ModuleManager.TutorialManager:checkAndPlayForceTutorial() end end -- 提供给战斗使用 隐藏除战斗外的UI function MainCityUI:hideMainUIExceptBattle() if self.chapterSliderComp then self.chapterSliderComp.baseObject:setVisible(false) end local leftNode = self.uiMap["main_ui.left_node"] leftNode:setVisible(false) local rightNode = self.uiMap["main_ui.right_node"] rightNode:setVisible(false) local bottomNode = self.uiMap["main_ui.bottom_node"] bottomNode:setVisible(false) self:refreshBottom(nil, true) end function MainCityUI:showMainUIExceptBattle() if self.chapterSliderComp then self.chapterSliderComp.baseObject:setVisible(true) end local leftNode = self.uiMap["main_ui.left_node"] leftNode:setVisible(true) local rightNode = self.uiMap["main_ui.right_node"] rightNode:setVisible(true) local bottomNode = self.uiMap["main_ui.bottom_node"] bottomNode:setVisible(true) end function MainCityUI:refreshPower() local hero = DataManager.HeroData:getMainHeroEntity() if hero then local powerTx = self.uiMap["main_ui.role_node.power_node.power_tx"] powerTx:setText(BigNumOpt.bigNum2Str4Power(hero:getPower())) end end function MainCityUI:showBlackUI(desc, time, isShowFail) -- 自动关闭 if self.scheduleId then self:unscheduleGlobal(self.scheduleId) end self.scheduleId = self:performWithDelayGlobal(function() self.scheduleId = nil self:hideBlackUI() EventManager:dispatchEvent(EventManager.CUSTOM_EVENT.BATTLE_CLOSE_CHAPTER_BLACK_UI) end, time) -- 表现 local descTx = self.uiMap["main_ui.black_node.black_bg.desc_tx"] descTx:setText(nil) local mask = self.uiMap["main_ui.black_node.black_bg"] mask:setVisible(true) local canvasGroup = mask:getComponent(GConst.TYPEOF_UNITY_CLASS.CANVAS_GROUP) canvasGroup.alpha = 0 local sequence = mask:createBindTweenSequence() local fadeTween = canvasGroup:DOFade(1, BLACK_FADE_TIME) sequence:Append(fadeTween) sequence:OnComplete(function() descTx:setText(desc) if not isShowFail then Game:garbageCollect() end end) end function MainCityUI:hideBlackUI() local mask = self.uiMap["main_ui.black_node.black_bg"] mask:setVisible(false) end function MainCityUI:updateSavePowerModeTime() local isOpen = ModuleManager:getIsOpen(ModuleManager.MODULE_KEY.POWER_SAVE_MODE, true) local topUI = UIManager:getTopUIObj() if isOpen and ModuleManager.GameSettingManager:getSavePowerMode() == 1 and topUI:getUIIndex() == self:getUIIndex() and self.battleType == ModuleManager.BattleManager.BATTLE_TYPE.STAGE then self.savePowerModeTime = self.savePowerModeTime - 1 if self.savePowerModeTime < 0 then ModuleManager.GameSettingManager:showSavePowerUI() self:resetSavePowerTime() end end end function MainCityUI:resetSavePowerTime() self.savePowerModeTime = SAVE_POWER_MODE_TIME end ---- 引导任务强制领取 function MainCityUI:checkTutorialTaskMask() if not self.targetIndex or self.targetIndex == 0 then if DataManager.TutorialTaskData:showMaskFinger() then self:showTutorialTaskNode() else self:hideTutorialTaskNode() end end end function MainCityUI:showTutorialTaskNode() if not self.uiMap then return end self.uiMap["main_ui.tutorial_task_node"]:setVisible(true) if not self.tutorialMaskMat then self.tutorialMaskMat = CS.UnityEngine.Object.Instantiate(RenderManager:getUITutorialMat()) self.tutorialMask = self.uiMap["main_ui.tutorial_task_node.mask"] self.tutorialMask:getComponent(GConst.TYPEOF_UNITY_CLASS.UI_IMAGE).material = self.tutorialMaskMat self.clickArea = self.uiMap["main_ui.tutorial_task_node.click_area"] self.clickArea:addClickListener(function() end) local taskComp = self.uiMap["main_ui.right_node.tutorial_task_comp"] local rectTransform = taskComp:getComponent(GConst.TYPEOF_UNITY_CLASS.RECTTRANSFORM) local rect = rectTransform.rect local anchoredPosition = self:getTargetAnchoredPosition(taskComp) self.tutorialMaskMat:SetVector(self:getCenterPropertyID(), {x = anchoredPosition.x, y = anchoredPosition.y, z = 0, w = 0}) self.tutorialMaskMat:SetFloat(self:getEllipsePropertyID(), 10) self.tutorialMaskMat:SetFloat(self:getRectXPropertyID(), rect.width / 2 + 20) self.tutorialMaskMat:SetFloat(self:getRectYPropertyID(), rect.height / 2 + 20) self.tutorialFingerNode = self.uiMap["main_ui.tutorial_task_node.finger_node"] self.tutorialBlockTouch = self.uiMap["main_ui.tutorial_task_node.block_touch"] self.tutorialBlockTouch:addClickListener(function() self.tutorialFingerNode:getComponent(GConst.TYPEOF_UNITY_CLASS.ANIMATOR):Play("finger_click_prompt", -1, 0) end) self.tutorialClickAreaCS = self.clickArea:getComponent(GConst.TYPEOF_UNITY_CLASS.BF_TUTORIAL_CLICKAREA) self.tutorialClickAreaCS:ClearTargetTransform() self.tutorialClickAreaCS:SetTargetTransform(self.uiMap["main_ui.right_node.tutorial_task_comp.chapter_task_bg"]:getTransform()) end self.tutorialFingerNode:getComponent(GConst.TYPEOF_UNITY_CLASS.ANIMATOR):Play("finger_click_prompt", -1, 0) self.showingTutorialTaskNode = true ModuleManager.BattleManager:pauseFightByTutorial() end function MainCityUI:getTargetAnchoredPosition(targetGo) local rectTransform = targetGo:getComponent(GConst.TYPEOF_UNITY_CLASS.RECTTRANSFORM) local rect = rectTransform.rect local localToWorldMatrix = rectTransform.localToWorldMatrix local tarCornerMid = localToWorldMatrix:MultiplyPoint3x4(BF.Vector3((rect.xMax + rect.x) / 2, (rect.yMax + rect.y) / 2, 0)) local screenPos = UIManager:getUICameraComponent():WorldToScreenPoint(tarCornerMid) local anchoredPosition = CS.BF.Utils.RectTransformScreenPointToLocalPointInRectangle(self.root:getTransform(), screenPos.x, screenPos.y, UIManager:getUICameraComponent()) return anchoredPosition end function MainCityUI:getCenterPropertyID() if not self._tutorialMatCenterId then self._tutorialMatCenterId = CS.UnityEngine.Shader.PropertyToID("_Center") end return self._tutorialMatCenterId end function MainCityUI:getEllipsePropertyID() if not self._tutorialMatEllipseId then self._tutorialMatEllipseId = CS.UnityEngine.Shader.PropertyToID("_Ellipse") end return self._tutorialMatEllipseId end function MainCityUI:getRectXPropertyID() if not self._tutorialMatRectXId then self._tutorialMatRectXId = CS.UnityEngine.Shader.PropertyToID("_Rect_X") end return self._tutorialMatRectXId end function MainCityUI:getRectYPropertyID() if not self._tutorialMatRectYId then self._tutorialMatRectYId = CS.UnityEngine.Shader.PropertyToID("_Rect_Y") end return self._tutorialMatRectYId end function MainCityUI:hideTutorialTaskNode() if not self.uiMap then return end self.uiMap["main_ui.tutorial_task_node"]:setVisible(false) if self.showingTutorialTaskNode then ModuleManager.BattleManager:resumeFightByTutorial() end self.showingTutorialTaskNode = false end ---- end 引导任务强制领取 function MainCityUI:onClose() if self.sideBarCells then for k, cell in pairs(self.sideBarCells) do self.sideBarCells[k] = nil cell.baseObject:destroy() end end if self.loadingSideBarCells then for k, _ in pairs(self.loadingSideBarCells) do self.loadingSideBarCells[k] = false end end DataManager:unregisterCrossDayFunc("crossDay") end return MainCityUI