feat: 新增英雄合并配置并优化出生时物理组件禁用逻辑
- 在 MissionHeroComp 中添加 merge_need_count 和 merge_max_lv 配置项,用于控制英雄合并所需数量和最大等级 - 修改英雄合并逻辑,根据配置动态判断合并条件和所需数量 - 优化 Hero 实体出生时的组件禁用逻辑,增加对 RigidBody2D 组件的禁用
This commit is contained in:
@@ -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 { oops } from "../../../../extensions/oops-plugin-framework/assets/core/Oops";
|
||||||
import { ecs } from "../../../../extensions/oops-plugin-framework/assets/libs/ecs/ECS";
|
import { ecs } from "../../../../extensions/oops-plugin-framework/assets/libs/ecs/ECS";
|
||||||
import { smc } from "../common/SingletonModuleComp";
|
import { smc } from "../common/SingletonModuleComp";
|
||||||
@@ -163,7 +163,10 @@ export class Hero extends ecs.Entity {
|
|||||||
const collider = node.getComponent(BoxCollider2D);
|
const collider = node.getComponent(BoxCollider2D);
|
||||||
if (collider) {
|
if (collider) {
|
||||||
collider.enabled = false;
|
collider.enabled = false;
|
||||||
collider.apply();
|
}
|
||||||
|
const body = node.getComponent(RigidBody2D);
|
||||||
|
if (body) {
|
||||||
|
body.enabled = false;
|
||||||
}
|
}
|
||||||
const currentPos = node.getPosition();
|
const currentPos = node.getPosition();
|
||||||
const targetPos = v3(birthPos.x, birthPos.y, 0);
|
const targetPos = v3(birthPos.x, birthPos.y, 0);
|
||||||
|
|||||||
@@ -21,6 +21,8 @@ export class MissionHeroCompComp extends CCComp {
|
|||||||
Friend_is_dead:boolean=false
|
Friend_is_dead:boolean=false
|
||||||
current_hero_uuid:number=0
|
current_hero_uuid:number=0
|
||||||
current_hero_num:number=-1
|
current_hero_num:number=-1
|
||||||
|
merge_need_count:number=3
|
||||||
|
merge_max_lv:number=3
|
||||||
is_merging:boolean=false
|
is_merging:boolean=false
|
||||||
heros:any=[]
|
heros:any=[]
|
||||||
onLoad(){
|
onLoad(){
|
||||||
@@ -62,9 +64,11 @@ export class MissionHeroCompComp extends CCComp {
|
|||||||
const uuid = Number(args?.uuid ?? 1001);
|
const uuid = Number(args?.uuid ?? 1001);
|
||||||
const hero_lv = Math.max(1, Number(args?.hero_lv ?? 1));
|
const hero_lv = Math.max(1, Number(args?.hero_lv ?? 1));
|
||||||
this.addHero(uuid, hero_lv);
|
this.addHero(uuid, hero_lv);
|
||||||
|
if (!this.canMergeLevel(hero_lv)) return;
|
||||||
|
const needCount = this.getMergeNeedCount();
|
||||||
const aliveHeroes = this.getAliveHeroes();
|
const aliveHeroes = this.getAliveHeroes();
|
||||||
const mergeHeroes = this.pickMergeHeroes(aliveHeroes, uuid, hero_lv, 3);
|
const mergeHeroes = this.pickMergeHeroes(aliveHeroes, uuid, hero_lv, needCount);
|
||||||
if (mergeHeroes.length === 3) {
|
if (mergeHeroes.length === needCount) {
|
||||||
this.is_merging = true;
|
this.is_merging = true;
|
||||||
try {
|
try {
|
||||||
const mergedLv = await this.mergeGroupHeroes(mergeHeroes, uuid, hero_lv);
|
const mergedLv = await this.mergeGroupHeroes(mergeHeroes, uuid, hero_lv);
|
||||||
@@ -135,6 +139,14 @@ export class MissionHeroCompComp extends CCComp {
|
|||||||
return count;
|
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<void> {
|
private mergeDestroyAtBirth(mergeHeroes: Hero[], spawnPos: Vec3): Promise<void> {
|
||||||
return new Promise((resolve) => {
|
return new Promise((resolve) => {
|
||||||
let doneCount = 0;
|
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);
|
const spawnPos:Vec3 = v3(landingPos.x, landingPos.y + MissionHeroCompComp.HERO_DROP_HEIGHT, 0);
|
||||||
await this.mergeDestroyAtBirth(mergeHeroes, spawnPos);
|
await this.mergeDestroyAtBirth(mergeHeroes, spawnPos);
|
||||||
await this.playMergeBoomFx(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) {
|
private async tryChainMerge(uuid: number, startLv: number) {
|
||||||
let checkLv = Math.max(1, startLv);
|
let checkLv = Math.max(1, startLv);
|
||||||
|
const needCount = this.getMergeNeedCount();
|
||||||
let guard = 0;
|
let guard = 0;
|
||||||
while (guard < 20) {
|
while (guard < 20) {
|
||||||
guard += 1;
|
guard += 1;
|
||||||
const aliveHeroes = this.getAliveHeroes();
|
if (!this.canMergeLevel(checkLv)) {
|
||||||
const sameCount = this.countMergeHeroes(aliveHeroes, uuid, checkLv);
|
|
||||||
if (sameCount < 3) {
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
const mergeHeroes = this.pickMergeHeroes(aliveHeroes, uuid, checkLv, 3);
|
const aliveHeroes = this.getAliveHeroes();
|
||||||
if (mergeHeroes.length < 3) {
|
const sameCount = this.countMergeHeroes(aliveHeroes, uuid, checkLv);
|
||||||
|
if (sameCount < needCount) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
const mergeHeroes = this.pickMergeHeroes(aliveHeroes, uuid, checkLv, needCount);
|
||||||
|
if (mergeHeroes.length < needCount) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
checkLv = await this.mergeGroupHeroes(mergeHeroes, uuid, checkLv);
|
checkLv = await this.mergeGroupHeroes(mergeHeroes, uuid, checkLv);
|
||||||
|
|||||||
Reference in New Issue
Block a user