From ccccf025c5543785c83b65dfcc8388c61a5f3ed7 Mon Sep 17 00:00:00 2001 From: panw Date: Fri, 27 Mar 2026 14:57:07 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=96=B0=E5=A2=9E=E8=8B=B1=E9=9B=84?= =?UTF-8?q?=E5=90=88=E5=B9=B6=E9=85=8D=E7=BD=AE=E5=B9=B6=E4=BC=98=E5=8C=96?= =?UTF-8?q?=E5=87=BA=E7=94=9F=E6=97=B6=E7=89=A9=E7=90=86=E7=BB=84=E4=BB=B6?= =?UTF-8?q?=E7=A6=81=E7=94=A8=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 在 MissionHeroComp 中添加 merge_need_count 和 merge_max_lv 配置项,用于控制英雄合并所需数量和最大等级 - 修改英雄合并逻辑,根据配置动态判断合并条件和所需数量 - 优化 Hero 实体出生时的组件禁用逻辑,增加对 RigidBody2D 组件的禁用 --- assets/script/game/hero/Hero.ts | 7 +++-- assets/script/game/map/MissionHeroComp.ts | 32 +++++++++++++++++------ 2 files changed, 29 insertions(+), 10 deletions(-) diff --git a/assets/script/game/hero/Hero.ts b/assets/script/game/hero/Hero.ts index 69152d8b..45d2d439 100644 --- a/assets/script/game/hero/Hero.ts +++ b/assets/script/game/hero/Hero.ts @@ -1,4 +1,4 @@ -import { instantiate, Node, Prefab, Vec3 ,v3,resources,SpriteFrame,Sprite,SpriteAtlas, BoxCollider2D, tween, Tween} from "cc"; +import { instantiate, Node, Prefab, Vec3 ,v3,resources,SpriteFrame,Sprite,SpriteAtlas, BoxCollider2D, RigidBody2D, tween, Tween} from "cc"; import { oops } from "../../../../extensions/oops-plugin-framework/assets/core/Oops"; import { ecs } from "../../../../extensions/oops-plugin-framework/assets/libs/ecs/ECS"; import { smc } from "../common/SingletonModuleComp"; @@ -163,7 +163,10 @@ export class Hero extends ecs.Entity { const collider = node.getComponent(BoxCollider2D); if (collider) { collider.enabled = false; - collider.apply(); + } + const body = node.getComponent(RigidBody2D); + if (body) { + body.enabled = false; } const currentPos = node.getPosition(); const targetPos = v3(birthPos.x, birthPos.y, 0); diff --git a/assets/script/game/map/MissionHeroComp.ts b/assets/script/game/map/MissionHeroComp.ts index 1e2b59eb..8a29fc51 100644 --- a/assets/script/game/map/MissionHeroComp.ts +++ b/assets/script/game/map/MissionHeroComp.ts @@ -21,6 +21,8 @@ export class MissionHeroCompComp extends CCComp { Friend_is_dead:boolean=false current_hero_uuid:number=0 current_hero_num:number=-1 + merge_need_count:number=3 + merge_max_lv:number=3 is_merging:boolean=false heros:any=[] onLoad(){ @@ -62,9 +64,11 @@ export class MissionHeroCompComp extends CCComp { const uuid = Number(args?.uuid ?? 1001); const hero_lv = Math.max(1, Number(args?.hero_lv ?? 1)); this.addHero(uuid, hero_lv); + if (!this.canMergeLevel(hero_lv)) return; + const needCount = this.getMergeNeedCount(); const aliveHeroes = this.getAliveHeroes(); - const mergeHeroes = this.pickMergeHeroes(aliveHeroes, uuid, hero_lv, 3); - if (mergeHeroes.length === 3) { + const mergeHeroes = this.pickMergeHeroes(aliveHeroes, uuid, hero_lv, needCount); + if (mergeHeroes.length === needCount) { this.is_merging = true; try { const mergedLv = await this.mergeGroupHeroes(mergeHeroes, uuid, hero_lv); @@ -135,6 +139,14 @@ export class MissionHeroCompComp extends CCComp { return count; } + private getMergeNeedCount(): number { + return this.merge_need_count === 2 ? 2 : 3; + } + + private canMergeLevel(hero_lv: number): boolean { + return hero_lv < Math.max(1, this.merge_max_lv); + } + private mergeDestroyAtBirth(mergeHeroes: Hero[], spawnPos: Vec3): Promise { return new Promise((resolve) => { let doneCount = 0; @@ -194,21 +206,25 @@ export class MissionHeroCompComp extends CCComp { const spawnPos:Vec3 = v3(landingPos.x, landingPos.y + MissionHeroCompComp.HERO_DROP_HEIGHT, 0); await this.mergeDestroyAtBirth(mergeHeroes, spawnPos); await this.playMergeBoomFx(spawnPos); - return this.addMergedHero(uuid, hero_lv + 1, sumAp, sumHpMax); + return this.addMergedHero(uuid, Math.min(this.merge_max_lv, hero_lv + 1), sumAp, sumHpMax); } private async tryChainMerge(uuid: number, startLv: number) { let checkLv = Math.max(1, startLv); + const needCount = this.getMergeNeedCount(); let guard = 0; while (guard < 20) { guard += 1; - const aliveHeroes = this.getAliveHeroes(); - const sameCount = this.countMergeHeroes(aliveHeroes, uuid, checkLv); - if (sameCount < 3) { + if (!this.canMergeLevel(checkLv)) { break; } - const mergeHeroes = this.pickMergeHeroes(aliveHeroes, uuid, checkLv, 3); - if (mergeHeroes.length < 3) { + const aliveHeroes = this.getAliveHeroes(); + const sameCount = this.countMergeHeroes(aliveHeroes, uuid, checkLv); + if (sameCount < needCount) { + break; + } + const mergeHeroes = this.pickMergeHeroes(aliveHeroes, uuid, checkLv, needCount); + if (mergeHeroes.length < needCount) { break; } checkLv = await this.mergeGroupHeroes(mergeHeroes, uuid, checkLv);