必杀技和卡牌技能 签到 skillconcomp,统一执行

This commit is contained in:
2025-07-14 14:29:51 +08:00
parent 377c287eec
commit 0815d64f3c
7 changed files with 141 additions and 121 deletions

View File

@@ -12,6 +12,7 @@ import { FightConComp } from '../map/FightConComp';
import { MonModelComp } from './MonModelComp';
import { HeroModelComp } from './HeroModelComp';
import { FightSet } from '../common/config/Mission';
import { MasterModelComp } from './MasterModel';
const { ccclass, property } = _decorator;
@ccclass('SkillCon')
@@ -22,6 +23,14 @@ export class SkillConComp extends CCComp {
HeroEntity:any=null;
private _timers: { [key: string]: number } = {};
private _damageQueue: Array<{ timer: number; callback: () => void }> = [];
aoe_queues:any[]=[] // 范围伤害技能执行队列
private aoe_timers: Map<number, number> = new Map(); // 每个技能的独立计时器
private readonly AOE_INTERVAL: number = 0.4; // 执行间隔,单位秒
private skill_id_counter: number = 0; // 技能ID计数器
aoe_target_pos:Vec3=new Vec3(180,0,0)
init(): void {
oops.message.on(GameEvent.FightEnd, this.clear_timer, this);
}
@@ -30,6 +39,8 @@ export class SkillConComp extends CCComp {
this.FIGHTCON=this.node.parent.getComponent(FightConComp)
// console.log(this.HeroView.uuid+"=>"+this.HeroView.hero_name+"=> SkillConComp onLoad")
this.on(GameEvent.CastHeroSkill,this.cast_master_skill,this)
oops.message.on(GameEvent.MaxSkill,this.use_max_skill,this)
}
start() {
// console.log(this.HeroView.uuid+"=>"+this.HeroView.hero_name+"=> SkillConComp start")
@@ -52,6 +63,34 @@ export class SkillConComp extends CCComp {
this.HeroView.friend_count_atk_count()
this.HeroView.at = 0;
}
if (this.aoe_queues.length > 0) {
console.log("[FightConComp]:aoe_queues:",this.aoe_queues)
// 遍历所有必杀技技能,更新它们的计时器
for (let i = this.aoe_queues.length - 1; i >= 0; i--) {
let skill = this.aoe_queues[i];
let timer = this.aoe_timers.get(skill.id) || 0;
timer += dt;
this.aoe_timers.set(skill.id, timer);
// 检查是否到达执行间隔
if (timer >= this.AOE_INTERVAL) {
// 重置计时器
this.aoe_timers.set(skill.id, 0);
// 执行技能
this.aoe_skill_execute(skill);
skill.count--;
// 如果技能执行完毕,从队列中移除
if (skill.count <= 0) {
this.aoe_queues.splice(i, 1);
this.aoe_timers.delete(skill.id);
}
}
}
}
}
cast_master_skill(e:string,uuid:any){
@@ -70,6 +109,20 @@ export class SkillConComp extends CCComp {
}
use_max_skill(e:GameEvent,data:any){
if(!this.HeroView) return
if(!this.HeroView.is_master) return
console.log("[SkillConComp]:use_max_skill:",data)
this.skill_id_counter++;
this.aoe_queues.push({
id: this.skill_id_counter,
s_uuid:data.uuid,
count:SkillSet[data.uuid].maxC,
damage:0})
// 初始化该技能的计时器
this.aoe_timers.set(this.skill_id_counter, 0);
}
private doSkill(config: typeof SkillSet[keyof typeof SkillSet],is_wfuny:boolean=false,dmg:number=0) {
// 添加节点有效性检查
if (!this.node || !this.node.isValid || !this.HeroView || !this.HeroView.node || !this.HeroView.node.isValid) {
@@ -196,6 +249,43 @@ export class SkillConComp extends CCComp {
return pos
}
private aoe_skill_execute(data:any){
let skill=ecs.getEntity<Skill>(Skill)
let master = ecs.query(ecs.allOf(MasterModelComp))
// 检查必要参数
if (!master || master.length === 0) {
console.error("[FightConComp] 未找到主角实体");
return;
}
let masterView = master[0].get(HeroViewComp);
if (!masterView) {
console.error("[FightConComp] 主角视图组件获取失败");
return;
}
let angle=0
let targets = this.pickRandomTarget(data.count)
let target_pos= new Vec3(0,0,0)
if(targets.length==0){
target_pos=this.aoe_target_pos
}else{
target_pos= new Vec3(targets[0].get(HeroViewComp).node.position.x,0,0)
}
let start_pos=new Vec3(-280,50,0)
// console.log("[Skill]:node=>",start_pos)
skill.load(
start_pos,
this.node.parent,
data.s_uuid,
target_pos,
masterView,
angle,
data.damage
);
}
/** 随机选择目标 */
private pickRandomTarget(count: number): ecs.Entity[] {
let entities:any=null
@@ -255,6 +345,9 @@ export class SkillConComp extends CCComp {
}
reset() {
this.clear_timer();
this.aoe_queues = [] // 清空技能队列
this.aoe_timers = new Map(); // 重置计时器
this.skill_id_counter = 0; // 重置技能ID计数器
}
onDestroy() {