import { _decorator, v3, Vec3 } from "cc"; import { ecs } from "../../../../extensions/oops-plugin-framework/assets/libs/ecs/ECS"; import { CCComp } from "../../../../extensions/oops-plugin-framework/assets/module/common/CCComp"; import { Monster } from "../hero/Mon"; import { BoxSet } from "../common/config/BoxSet"; import { HeroSet, MonSet } from "../common/config/heroSet"; import { FightSet, Missions, MonNum, WaveConfig, getInfiniteWaveConfig, getMonsterLevel } from "../common/config/Mission"; import { RandomManager } from "db://oops-framework/core/common/random/RandomManager"; import { Timer } from "db://oops-framework/core/common/timer/Timer"; import { smc } from "../common/SingletonModuleComp"; import { GameEvent } from "../common/config/GameEvent"; import { oops } from "db://oops-framework/core/Oops"; const { ccclass, property } = _decorator; /** 视图层对象 */ @ccclass('MissionMonCompComp') @ecs.register('MissionMonComp', false) export class MissionMonCompComp extends CCComp { timer:Timer=new Timer(1) // 添加刷怪队列 - 增加level字段 private monsterQueue: Array<{uuid: number, position: number, isBoss: boolean, level: number}> = []; private isSpawning: boolean = false;// 是否正在生成怪物 private spawnInterval: number = 0.5; // 每个怪物生成间隔时间 private spawnTimer: number = 0; // 生成计时器 private is_fight:boolean = false; onLoad(){ this.on(GameEvent.FightStart,this.to_fight,this) } /** 视图层逻辑代码分离演示 */ start() { // var entity = this.ent as ecs.Entity; // ecs.Entity 可转为当前模块的具体实体对象 // this.on(ModuleEvent.Cmd, this.onHandler, this); // this.test_call() } protected update(dt: number): void { if(!smc.mission.play||smc.mission.pause) return if(this.is_fight) { if(this.timer.update(dt)){ this.do_mon_wave() } } // 处理刷怪队列 if (this.monsterQueue.length > 0 && !this.isSpawning) { this.spawnTimer += dt; if (this.spawnTimer >= this.spawnInterval) { this.spawnNextMonster(); this.spawnTimer = 0; } } } to_fight(){ console.log("[MissionMonComp]:to_fight") this.is_fight=true this.do_mon_wave() this.timer=new Timer(FightSet.MON_WAVE_TIME) } test_call(){ this.addToSpawnQueue(5202, 0, true, 1); } do_mon_wave(){ oops.message.dispatchEvent(GameEvent.WaveUpdate) console.log("[MissionMonComp]:怪物登场,当前波次 :",smc.vmdata.mission_data.current_wave) // 使用新的波次配置系统 const currentWave = smc.vmdata.mission_data.current_wave; const waveConfig = this.getWaveConfig(currentWave); console.log(`[MissionMonComp]:第${currentWave}波配置:`, waveConfig.description); console.log(`[MissionMonComp]:总HP: ${waveConfig.totalHp}, 总AP: ${waveConfig.totalAp}`); // 根据波次配置生成怪物 this.generateMonstersFromConfig(waveConfig); } // 获取波次配置 private getWaveConfig(waveNumber: number) { if (waveNumber <= 15) { return WaveConfig[waveNumber]; } else { return getInfiniteWaveConfig(waveNumber); } } // 根据配置生成怪物 private generateMonstersFromConfig(waveConfig: any) { const { monsters } = waveConfig; const currentWave = smc.vmdata.mission_data.current_wave; const monsterLevel = getMonsterLevel(currentWave); monsters.forEach((monsterGroup: any) => { const { uuid, count, type } = monsterGroup; // 为每个怪物组生成指定数量的怪物 for (let i = 0; i < count; i++) { // 随机选择位置 (0-9) this.addToSpawnQueue(uuid, i, false, monsterLevel); } }); console.log(`[MissionMonComp]:本波次将生成 ${monsters.reduce((total: number, group: any) => total + group.count, 0)} 只怪物,等级: ${monsterLevel}`); } // 新增:添加到刷怪队列 - 增加level参数 private addToSpawnQueue(uuid: number, position: number, isBoss: boolean = false, level: number = 1) { this.monsterQueue.push({ uuid: uuid, position: position, isBoss: isBoss, level: level }); } // 新增:从队列中生成下一个怪物 - 传递level参数 private spawnNextMonster() { if (this.monsterQueue.length === 0) return; const monsterData = this.monsterQueue.shift(); if (monsterData) { this.addMonster(monsterData.uuid, monsterData.position, monsterData.isBoss, false, monsterData.level); } } private addMonster(uuid:number=1001,i:number=0,is_boss:boolean=false,is_call:boolean=false,lv:number=1) { let mon = ecs.getEntity(Monster); let scale = -1 let pos:Vec3 = v3(MonSet[i].pos); mon.load(pos,scale,uuid,is_boss,is_call,lv); } /** 视图对象通过 ecs.Entity.remove(ModuleViewComp) 删除组件是触发组件处理自定义释放逻辑 */ reset() { // this.node.destroy(); } }