From 215c258dadeaa042fcfadd4b3497f9f15f88b6b4 Mon Sep 17 00:00:00 2001 From: puxuan <413323644@qq.com> Date: Mon, 22 Sep 2025 14:56:34 +0800 Subject: [PATCH] =?UTF-8?q?=E4=B8=BB=E7=95=8C=E9=9D=A2=E8=8B=B1=E9=9B=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lua/app/ui/main_city/component/main_comp.lua | 391 ++----------------- 1 file changed, 42 insertions(+), 349 deletions(-) diff --git a/lua/app/ui/main_city/component/main_comp.lua b/lua/app/ui/main_city/component/main_comp.lua index 73667019..9cee2a11 100644 --- a/lua/app/ui/main_city/component/main_comp.lua +++ b/lua/app/ui/main_city/component/main_comp.lua @@ -7,43 +7,8 @@ local HERO_SPINE_ASSET_PATH = "assets/arts/spines/characters/%s/%s_skeletondata. local CHAPTER_PATH = "assets/prefabs/ui/chapter/%s.prefab" local CHAPTER_PAGE = 5 -function MainComp:onOpen() - self.startMonsterAction = true - if self.bossNode then - self.bossNode:setAnchoredPositionX(0) - end - -- if self.bossShadow then - -- self.bossShadow:setAnchoredPositionX(0) - -- end - if self.dialogueNode then - self.dialogueNode:setAnchoredPositionX(0) - end -end - function MainComp:onClose() - if self.chapterMoveSeq then - self.chapterMoveSeq:Kill() - self.chapterMoveSeq = nil - end - if self.chapterMonsterGenerateSeq then - self.chapterMonsterGenerateSeq:Kill() - self.chapterMonsterGenerateSeq = nil - end self.currChapterId = nil - self.isTopTurn = nil - self.startMonsterAction = false - GFunc.killDOTween(GConst.DOTWEEN_IDS.CHAPTER_MONSTER) - self.monsterSpineTopPool = {} - self.monsterSpineDownPool = {} - self.monsterSpineTopList = {} - self.monsterSpineDownList = {} - -- self.monsterShadowPool = {} - self.monsterSmokePool = {} - self.monsterNodeTop:removeAllChildren() - self.monsterNodeDown:removeAllChildren() - -- self.shadowNode:removeAllChildren() - self.smokeNodeTop:removeAllChildren() - self.smokeNodeDown:removeAllChildren() end function MainComp:init() @@ -58,22 +23,6 @@ function MainComp:init() self.dailyChallengeBtn = uiMap["main_comp.daily_challenge_btn"] self.chapterBg = uiMap["main_comp.bg"] - -- self.chapterBg:setAnchoredPositionX(-720) - self.smokeNodeTop = uiMap["main_comp.smoke_node_1"] - self.monsterNodeTop = uiMap["main_comp.monster_node_1"] - self.bossNode = uiMap["main_comp.boss_node"] - self.bossNode:setActive(false) - self.bossSpine = uiMap["main_comp.boss_node.boss"] - self.smokeNodeDown = uiMap["main_comp.smoke_node_2"] - self.monsterNodeDown = uiMap["main_comp.monster_node_2"] - self.monsterSpineTopPool = {} - self.monsterSpineDownPool = {} - self.monsterSpineTopList = {} - self.monsterSpineDownList = {} - -- self.monsterShadowPool = {} - self.monsterSmokePool = {} - self.startMonsterAction = true - self.fightBtn = uiMap["main_comp.fight_btn"] -- 体力消耗 self.fightCost = uiMap["main_comp.fight_btn.cost"] @@ -89,6 +38,20 @@ function MainComp:init() self.leftBtn = uiMap["main_comp.left_btn"] self.rightBtn = uiMap["main_comp.right_btn"] + self.heroSpineList = {} + self.heroNodeList = {} + for i = 1, 5 do + self.heroNodeList[i] = uiMap["main_comp.formation.hero_" .. i] + self.heroNodeList[i]:addClickListener(function() + local heroId = self.curFormation[i] + if heroId then + local hero = DataManager.HeroData:getHeroById(heroId) + if hero then + ModuleManager.HeroManager:showHeroDetailUI(heroId, nil, nil, GConst.BattleConst.FORMATION_TYPE.STAGE) + end + end + end) + end self.chapterMiddleBg = uiMap["main_comp.middle_bg"] self.chapterTx = uiMap["main_comp.middle_bg.chapter_tx"] @@ -181,6 +144,7 @@ end function MainComp:refresh() self:refreshChapter() self:refreshRedPoint() + self:refreshHero() end function MainComp:refreshChapter(force) @@ -192,12 +156,9 @@ function MainComp:refreshChapter(force) self.chapterStage = DataManager.ChapterData:getChapterStage(chapterId) self:refreshChapterBg() self:refreshFightBtn() - self:doBossAction() end self.currChapterId = chapterId self:refreshChapterInfo() - -- self:doChapterMove() - -- self:doMonsterAction() self:refreshChapterBtn() self.leftBtn:setActive(ModuleManager:getIsOpen(ModuleManager.MODULE_KEY.IDLE_DROP, true)) @@ -333,304 +294,36 @@ end function MainComp:getSummonBtnPosition() return self.rightBtn:getPosition() end --- region 动画 --- function MainComp:doChapterMove() --- if self.chapterMoveSeq then --- return --- end --- self.chapterBg:setAnchoredPositionX(-720) --- self.chapterMoveSeq = self.chapterBg:createBindTweenSequence() --- local moveTween = self.chapterBg:getTransform():DOAnchorPosX(720, 20):SetEase(CS.DG.Tweening.Ease.Linear) --- self.chapterMoveSeq:Append(moveTween) --- self.chapterMoveSeq:AppendCallback(function() --- self.chapterBg:setAnchoredPositionX(-720) --- end) --- self.chapterMoveSeq:SetLoops(-1) --- end -function MainComp:doBossAction() - if self.currChapterId == nil then - return - end - local chapterInfo = ConfigManager:getConfig("chapter")[self.currChapterId] - if chapterInfo == nil then - return - end - local monsterIdList = chapterInfo.monster - -- monsterIdList = {20001, 10001, 10002} - if monsterIdList == nil then - return - end - self.chapterMonsterShowList = monsterIdList - if self.chapterBossId == nil then -- 还没显示boss模型 - self.chapterBossId = self.chapterMonsterShowList[#self.chapterMonsterShowList] - local chapterBossId = self.chapterBossId - local monsterCfg = ConfigManager:getConfig("monster") - local monsterInfo = monsterCfg[self.chapterBossId] - if monsterInfo then - local modelId = monsterInfo.model_id - local path = string.format(HERO_SPINE_ASSET_PATH, modelId, modelId) - self.bossNode:setActive(false) - local scale = monsterInfo.ui or 1 - self.bossSpine:loadAssetAsync(modelId, function() - if chapterBossId == self.chapterBossId then - self.bossNode:setActive(true) - self.bossSpine:setLocalScale(scale, scale, scale) - self.bossSpine:playAnim("move", true, true, true) - else -- 加载完成后,已经切换到其他boss了 - self:doChangeBossAction() - end - end, path) - end - else - local chapterBossId = self.chapterMonsterShowList[#self.chapterMonsterShowList] - if self.chapterBossId ~= chapterBossId then - self.chapterBossId = chapterBossId - self:doChangeBossAction() - end - end -end - --- 切换boss -function MainComp:doChangeBossAction() - local chapterBossId = self.chapterBossId - local monsterCfg = ConfigManager:getConfig("monster") - local monsterInfo = monsterCfg[self.chapterBossId] - if monsterInfo then - local modelId = monsterInfo.model_id - local path = string.format(HERO_SPINE_ASSET_PATH, modelId, modelId) - self.bossNode:setActive(false) - local scale = monsterInfo.ui or 1 - self.bossSpine:loadAssetAsync(modelId, function() - if chapterBossId == self.chapterBossId then - self.bossNode:setActive(true) - self.bossSpine:setLocalScale(scale, scale, scale) - self.bossSpine:playAnim("move", true, true, true) - else -- 加载完成后,已经切换到其他boss了 - self:doChangeBossAction() +function MainComp:refreshHero() + self.curFormation = DataManager.FormationData:getStageFormation() + for i = 1, 5 do + local heroId = self.curFormation[i] + local hero = DataManager.HeroData:getHeroById(heroId) + if hero and hero:getLv() > 0 then + if self.heroSpineList[i] and self.heroSpineList[i]:getModelId() == hero:getModelId() then + self.heroSpineList[i]:setActive(true) + self.heroSpineList[i]:playAnimation("move", 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("move", true) + spineObject:setLocalScale(0.7, 0.7, 0.7) + self.heroSpineList[i] = spineObject + self.heroSpineList[i]:setLocalPosition(0, -60, 0) + end) end - end, path) + else + if self.heroSpineList[i] then + self.heroSpineList[i]:setActive(false) + end + end end end --- function MainComp:doMonsterAction() --- if self.chapterMonsterGenerateSeq then --- return --- end --- self.chapterMonsterGenerateSeq = DOTweenManager:createSeqWithIntId() --- local interval = GFunc.getConstValue("chapter_idel_monster_x") / 1000 --- interval = 2 --- self.chapterMonsterGenerateSeq:AppendCallback(function() --- self:generateChapterMonsters() --- end) --- self.chapterMonsterGenerateSeq:AppendInterval(interval) --- self.chapterMonsterGenerateSeq:SetLoops(-1) --- end - --- function MainComp:generateChapterMonsters() --- local monsterId --- if #self.chapterMonsterShowList <= 2 then --- monsterId = self.chapterMonsterShowList[2] --- else --- monsterId = self.chapterMonsterShowList[math.random(2, #self.chapterMonsterShowList)] --- end --- if monsterId == nil then --- return --- end --- local monsterCfg = ConfigManager:getConfig("monster_base") --- local monsterInfo = monsterCfg[monsterId] --- if monsterInfo == nil then --- return --- end --- if self.isTopTurn == nil then --- self.isTopTurn = math.random(1, 100) > 50 --- end --- local modelId = monsterInfo.model_id --- local pool --- local list --- local parent --- local posY --- if self.isTopTurn then -- 刷上面 --- pool = self.monsterSpineTopPool[modelId] --- list = self.monsterSpineTopList --- parent = self.monsterNodeTop --- posY = math.random(1, 300) --- else -- 刷下面 --- pool = self.monsterSpineDownPool[modelId] --- list = self.monsterSpineDownList --- parent = self.monsterNodeDown --- posY = -math.random(1, 240) --- end --- self.isTopTurn = not self.isTopTurn --- if pool and #pool > 0 then --- local spine = table.remove(pool) --- table.insert(list, spine) --- spine:setActive(true) --- self:doMonsterMove(modelId, spine, posY, monsterInfo, not self.isTopTurn) --- else --- SpineManager:loadUIHeroSpineWidgetAsync(modelId, parent, function(spine) --- if not self.startMonsterAction then --- spine:destroy() --- return --- end --- table.insert(list, spine) --- local scale = monsterInfo.ui or 1 --- spine:setLocalScale(-scale, scale, scale) --- self:doMonsterMove(modelId, spine, posY, monsterInfo, not self.isTopTurn) --- end) --- end --- end - --- function MainComp:doMonsterMove(modelId, spine, posY, monsterInfo, isTopTurn) --- spine:playAnim("move", true, true, true) --- local posX = GConst.UI_SCREEN_WIDTH / 2 + 100 --- local targetPosX = -GConst.UI_SCREEN_WIDTH / 2 - 300 --- spine:setAnchoredPosition(posX, posY) --- local seq = DOTweenManager:createSeqWithIntId(GConst.DOTWEEN_IDS.CHAPTER_MONSTER) --- if self.chapterMonsterSpeed == nil then --- -- self.chapterMonsterSpeed = GFunc.getConstValue("chapter_idel_monstermove") --- self.chapterMonsterSpeed = 150 --- end --- local distance = posX - targetPosX --- local moveTime = distance / self.chapterMonsterSpeed --- local moveTween = spine:getTransform():DOAnchorPosX(targetPosX, moveTime):SetEase(CS.DG.Tweening.Ease.Linear) --- seq:Append(moveTween) --- end - --- function MainComp:enterChapterBattle() --- -- boss等一会再跑 --- local bossWaitTime = GFunc.getConstValue("chapter_fight_bosswait") / 1000 --- local bossSeq = DOTweenManager:createSeqWithIntId(GConst.DOTWEEN_IDS.CHAPTER_MONSTER) --- bossSeq:AppendInterval(bossWaitTime) --- local bossSpeed = GFunc.getConstValue("chapter_fight_bossmove") --- local distance = GConst.UI_SCREEN_WIDTH/2 + 100 --- local moveTime = distance / bossSpeed --- local targetPosX = -GConst.UI_SCREEN_WIDTH / 2 - 300 --- local moveTween = self.bossNode:getTransform():DOAnchorPosX(targetPosX, moveTime):SetEase(CS.DG.Tweening.Ease.Linear) --- bossSeq:Append(moveTween) --- local moveTween2 = self.dialogueNode:getTransform():DOAnchorPosX(targetPosX, moveTime):SetEase(CS.DG.Tweening.Ease.Linear) --- bossSeq:Join(moveTween2) --- -- local moveTween3 = self.bossShadow:getTransform():DOAnchorPosX(targetPosX, moveTime):SetEase(CS.DG.Tweening.Ease.Linear) --- -- bossSeq:Join(moveTween3) - - --- -- 出来一批小怪从右边跑向左边 --- local monsterCount = GFunc.getConstIntValue("chapter_fight_monster_num") --- self.chapterFightMonsterCount = monsterCount --- local wave = 5 --- local monsterCountPerWave = math.ceil(monsterCount / wave) --- -- 分批处理 --- local monsterSeq = DOTweenManager:createSeqWithIntId(GConst.DOTWEEN_IDS.CHAPTER_MONSTER) --- for i = 1, wave do --- monsterSeq:AppendCallback(function () --- if monsterCountPerWave > monsterCount then --- monsterCountPerWave = monsterCount --- end --- monsterCount = monsterCount - monsterCountPerWave --- for j = 1, monsterCountPerWave do --- self:generateChapterFightMonsters() --- end --- end) --- monsterSeq:AppendInterval(0.03) --- end --- return GFunc.getConstValue("chapter_fight_wait") / 1000 --- end - --- function MainComp:generateChapterFightMonsters() --- local monsterId --- if #self.chapterMonsterShowList <= 2 then --- monsterId = self.chapterMonsterShowList[2] --- else --- monsterId = self.chapterMonsterShowList[math.random(2, #self.chapterMonsterShowList)] --- end --- if monsterId == nil then --- return --- end --- local monsterCfg = ConfigManager:getConfig("monster_base") --- local monsterInfo = monsterCfg[monsterId] --- if monsterInfo == nil then --- return --- end --- local modelId = monsterInfo.model_id --- local pool --- local list --- local parent --- local posY --- if self.isTopTurn then -- 刷上面 --- pool = self.monsterSpineTopPool[modelId] --- list = self.monsterSpineTopList --- parent = self.monsterNodeTop --- posY = math.random(1, 300) --- else -- 刷下面 --- pool = self.monsterSpineDownPool[modelId] --- list = self.monsterSpineDownList --- parent = self.monsterNodeDown --- posY = -math.random(1, 240) --- end --- self.isTopTurn = not self.isTopTurn --- if pool and #pool > 0 then --- local spine = table.remove(pool) --- table.insert(list, spine) --- spine:setActive(true) --- self:doMonsterFightMove(modelId, spine, posY, monsterInfo, not self.isTopTurn) --- else --- SpineManager:loadUIHeroSpineWidgetAsync(modelId, parent, function(spine) --- if not self.startMonsterAction then --- spine:destroy() --- return --- end --- table.insert(list, spine) --- local scale = monsterInfo.ui or 1 --- spine:setLocalScale(-scale, scale, scale) --- self:doMonsterFightMove(modelId, spine, posY, monsterInfo, not self.isTopTurn) --- end) --- end --- end - --- function MainComp:doMonsterFightMove(modelId, spine, posY, monsterInfo, isTopTurn) --- spine:playAnim("move", true, true, true) --- local posX = GConst.UI_SCREEN_WIDTH / 2 + math.random(100, math.floor(GConst.UI_SCREEN_WIDTH*2/3)) --- spine:setAnchoredPosition(posX, posY) --- local seq = DOTweenManager:createSeqWithIntId(GConst.DOTWEEN_IDS.CHAPTER_MONSTER) --- if self.chapterMonsterFightSpeed == nil then --- -- self.chapterMonsterFightSpeed = GFunc.getConstValue("chapter_fight_monstermove") --- self.chapterMonsterFightSpeed = 880 --- end --- local distance = posX + GConst.UI_SCREEN_WIDTH/2 + 100 --- local moveTime = distance / self.chapterMonsterFightSpeed --- local targetPosX = -GConst.UI_SCREEN_WIDTH / 2 - 100 --- local moveTween = spine:getTransform():DOAnchorPosX(targetPosX, moveTime):SetEase(CS.DG.Tweening.Ease.Linear) --- seq:Append(moveTween) - --- if self.chapterFightMonsterCount then --- self.chapterFightMonsterCount = self.chapterFightMonsterCount - 1 --- if self.chapterFightMonsterCount == 0 then -- 最后一个怪物生成完毕后,重新排一下序 --- self:sortChapterFightMonstersOrder() --- self:sortChapterFightMonstersOrder() --- self:sortChapterFightMonstersOrder() --- self:sortChapterFightMonstersOrder() --- end --- end --- end - --- function MainComp:sortChapterFightMonstersOrder() --- self:sortChildrenOrder(self.monsterNodeTop) --- self:sortChildrenOrder(self.monsterNodeDown) --- end - --- function MainComp:sortChildrenOrder(parent) --- local children = parent:getChildList() --- if children and #children > 0 then --- table.sort(children, function(a, b) --- return a:getAnchoredPositionY() > b:getAnchoredPositionY() --- end) - --- for i = #children, 1, -1 do --- children[i]:getTransform():SetSiblingIndex(i - 1) --- end --- end --- end - --- endregion - return MainComp \ No newline at end of file