refactor: 优化战斗流程与英雄死亡处理逻辑
1. 移除HeroAttrsComp中多余的空行 2. 修改英雄死亡处理:直接销毁实体而非移至墓地 3. 调整波次更迭逻辑:直接进入BattleStart而非PrepareStart 4. 简化fight_ready方法:移除死亡英雄复活入场逻辑 5. 调整抽卡面板与卡牌池逻辑:战斗阶段保留抽卡面板且仅刷英雄卡 6. 将enterPreparePhase改为public方法
This commit is contained in:
@@ -320,7 +320,6 @@ export class HeroAttrsComp extends ecs.Comp {
|
|||||||
this.maxSkillDistance = 0;
|
this.maxSkillDistance = 0;
|
||||||
this.minSkillDistance = 0;
|
this.minSkillDistance = 0;
|
||||||
|
|
||||||
|
|
||||||
this.is_dead = false;
|
this.is_dead = false;
|
||||||
this.is_count_dead = false;
|
this.is_count_dead = false;
|
||||||
this.is_atking = false;
|
this.is_atking = false;
|
||||||
|
|||||||
@@ -446,14 +446,13 @@ export class HeroViewComp extends CCComp {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if(this.model.fac === FacSet.HERO){
|
if(this.model.fac === FacSet.HERO){
|
||||||
// 将英雄移到玩家看不到的墓地
|
// 英雄直接销毁,不再进入墓地
|
||||||
this.node.setPosition(v3(-2000, -2000, 0));
|
|
||||||
const collider = this.node.getComponent(Collider2D);
|
const collider = this.node.getComponent(Collider2D);
|
||||||
if (collider) {
|
if (collider) {
|
||||||
collider.enabled = false;
|
collider.enabled = false;
|
||||||
}
|
}
|
||||||
// 隐藏UI
|
|
||||||
this.top_node.active = false;
|
this.top_node.active = false;
|
||||||
|
this.ent.destroy();
|
||||||
} else {
|
} else {
|
||||||
// 🔥 方案B:治理性措施 - 在销毁实体前先禁用碰撞体,从源头减少"尸体"参与碰撞
|
// 🔥 方案B:治理性措施 - 在销毁实体前先禁用碰撞体,从源头减少"尸体"参与碰撞
|
||||||
const collider = this.node.getComponent(Collider2D);
|
const collider = this.node.getComponent(Collider2D);
|
||||||
|
|||||||
@@ -432,13 +432,6 @@ export class MissionCardComp extends CCComp {
|
|||||||
private onUseHeroCard(event: string, args: any) {
|
private onUseHeroCard(event: string, args: any) {
|
||||||
const payload = args ?? event;
|
const payload = args ?? event;
|
||||||
if (!payload) return;
|
if (!payload) return;
|
||||||
|
|
||||||
if (this.isBattlePhase) {
|
|
||||||
payload.cancel = true;
|
|
||||||
payload.reason = "battle_phase";
|
|
||||||
oops.gui.toast("战斗阶段无法召唤英雄");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
const current = this.getAliveHeroCount();
|
const current = this.getAliveHeroCount();
|
||||||
this.syncMissionHeroData(current);
|
this.syncMissionHeroData(current);
|
||||||
@@ -671,16 +664,10 @@ export class MissionCardComp extends CCComp {
|
|||||||
private enterBattlePhase() {
|
private enterBattlePhase() {
|
||||||
if (!this.cards_node || !this.cards_node.isValid) return;
|
if (!this.cards_node || !this.cards_node.isValid) return;
|
||||||
this.initCardsPanelPos();
|
this.initCardsPanelPos();
|
||||||
// 战斗阶段不再隐藏抽卡面板
|
// 战斗阶段抽卡面板不再收起
|
||||||
// Tween.stopAllByTarget(this.cards_node);
|
this.cards_node.active = true;
|
||||||
// tween(this.cards_node)
|
Tween.stopAllByTarget(this.cards_node);
|
||||||
// .to(this.cardsPanelMoveDuration, { scale: this.cardsHideScale })
|
this.cards_node.setScale(this.cardsShowScale);
|
||||||
// .call(() => {
|
|
||||||
// if (this.cards_node && this.cards_node.isValid) {
|
|
||||||
// this.cards_node.active = false;
|
|
||||||
// }
|
|
||||||
// })
|
|
||||||
// .start();
|
|
||||||
|
|
||||||
this.cachedHInfoComps.forEach(comp => {
|
this.cachedHInfoComps.forEach(comp => {
|
||||||
if (comp && comp.isValid) {
|
if (comp && comp.isValid) {
|
||||||
@@ -693,7 +680,8 @@ export class MissionCardComp extends CCComp {
|
|||||||
private buildDrawCards(): CardConfig[] {
|
private buildDrawCards(): CardConfig[] {
|
||||||
let targetType: CardType | CardType[] | undefined = undefined;
|
let targetType: CardType | CardType[] | undefined = undefined;
|
||||||
if (this.isBattlePhase) {
|
if (this.isBattlePhase) {
|
||||||
targetType = CardType.Skill;
|
// 战斗阶段只刷英雄卡牌,不刷其他卡牌
|
||||||
|
targetType = CardType.Hero;
|
||||||
} else {
|
} else {
|
||||||
targetType = [CardType.Hero, CardType.SpecialRefresh];
|
targetType = [CardType.Hero, CardType.SpecialRefresh];
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -520,9 +520,9 @@ export class MissionComp extends CCComp {
|
|||||||
case MissionPhase.BattleEnd:
|
case MissionPhase.BattleEnd:
|
||||||
// BattleEnd 计时结束后,如果是因为全灭或手动调用的 fight_end,进入 Settle
|
// BattleEnd 计时结束后,如果是因为全灭或手动调用的 fight_end,进入 Settle
|
||||||
// 需要注意的是,open_Victory / fight_end 现在只需切换到 BattleEnd 即可,Settle 由这里自动接管
|
// 需要注意的是,open_Victory / fight_end 现在只需切换到 BattleEnd 即可,Settle 由这里自动接管
|
||||||
// 如果游戏正在运行(波次更迭),则自动进入 PrepareStart 阶段
|
// 如果游戏正在运行(波次更迭),直接进入下一波的 BattleStart,不再进入 PrepareStart
|
||||||
if (smc.mission.play && !smc.mission.pause) {
|
if (smc.mission.play && !smc.mission.pause) {
|
||||||
this.changePhase(MissionPhase.PrepareStart);
|
this.changePhase(MissionPhase.BattleStart);
|
||||||
} else {
|
} else {
|
||||||
this.changePhase(MissionPhase.Settle);
|
this.changePhase(MissionPhase.Settle);
|
||||||
|
|
||||||
@@ -566,7 +566,7 @@ export class MissionComp extends CCComp {
|
|||||||
* - 显示开始按钮
|
* - 显示开始按钮
|
||||||
* - 触发英雄战斗结束技能
|
* - 触发英雄战斗结束技能
|
||||||
*/
|
*/
|
||||||
private enterPreparePhase() {
|
enterPreparePhase() {
|
||||||
this.changePhase(MissionPhase.PrepareStart);
|
this.changePhase(MissionPhase.PrepareStart);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -121,24 +121,14 @@ export class MissionHeroCompComp extends CCComp {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/** 战斗准备阶段:重置出战英雄计数,恢复满血重新登场 */
|
/** 战斗准备阶段:重置出战英雄计数,恢复满血 */
|
||||||
fight_ready(){
|
fight_ready(){
|
||||||
const heroes = this.getAllHeroes();
|
const heroes = this.getAllHeroes();
|
||||||
smc.vmdata.mission_data.hero_num = heroes.length;
|
smc.vmdata.mission_data.hero_num = heroes.length;
|
||||||
for (let i = 0; i < heroes.length; i++) {
|
for (let i = 0; i < heroes.length; i++) {
|
||||||
const hero = heroes[i];
|
const hero = heroes[i];
|
||||||
const model = hero.get(HeroAttrsComp);
|
const model = hero.get(HeroAttrsComp);
|
||||||
const view = hero.get(HeroViewComp);
|
if (model) {
|
||||||
if (model && view) {
|
|
||||||
if (model.is_dead) {
|
|
||||||
view.alive();
|
|
||||||
const landingPos = this.pickPositionForHero([hero.eid]);
|
|
||||||
// 不再直接设置位置,而是播放下落入场动画
|
|
||||||
// 计算出出生点(空中)
|
|
||||||
const spawnPos: Vec3 = v3(landingPos.x, landingPos.y + MissionHeroCompComp.HERO_DROP_HEIGHT, 0);
|
|
||||||
view.node.setPosition(spawnPos);
|
|
||||||
hero.playDropAnim(spawnPos, landingPos.y);
|
|
||||||
}
|
|
||||||
model.dirty_hp = true;
|
model.dirty_hp = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user