import { _decorator ,Vec3,v3} 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 { Timer } from "../../../../extensions/oops-plugin-framework/assets/core/common/timer/Timer"; import { Monster } from "../monster/Monster"; import { BoxSet } from "../common/config/BoxSet"; import { smc } from "../common/SingletonModuleComp"; import { oops } from "../../../../extensions/oops-plugin-framework/assets/core/Oops"; import { MapViewScene } from "./view/MapViewScene"; import { MissionSet,MissionNum,MonsetList } from "../common/config/MissionSet"; import { RandomManager } from "../../../../extensions/oops-plugin-framework/assets/core/common/random/RandomManager"; import { Role } from "../Role/Role"; import { Hero } from "../hero/Hero"; import { HeroModelComp } from "../hero/HeroModelComp"; import { MonsterModelComp } from "../monster/MonsterModelComp"; import { Mon } from "../mon/Mon"; const { ccclass, property } = _decorator; /** 视图层对象 */ @ccclass('MapMonsterComp') @ecs.register('MapMonster', false) export class MapMonsterComp extends CCComp { scene: MapViewScene = null; max_count: number = 99 ; //最大波次 cur_count: number = 1; //波次 boss_count: number = 10; //boss波次间隔 monster_level:number = 1; //怪物池等级 max_monster_level:number = 4; //最高怪物次等级 min_monster_num:number = 1; ///最小每次刷新怪物数量 max_monster_num:number = 1; //最大每次刷新怪物数量 refresh_timer: Timer = new Timer(10); // 刷新怪物定时器 refresh_cd: Timer = new Timer(0.5); mission_up_timer: Timer = new Timer(30); //波次增加 cur_mission:number = 1; //当前关卡方案 mission_list:any = [] setp_timer: Timer = new Timer(0.5); target_timer: Timer = new Timer(0.1); setp_num:number = 1; game_over:boolean = false; onLoad(){ // 监听全局事件 oops.message.on("other_add_monster", this.on_other_add_monster, this); oops.message.on("do_add_hero", this.on_do_add_hero, this); } start() { // this.scene = this.getComponent(MapViewScene); // this.scene.node.active = true // this.scene = this.getComponent(MapViewScene); let num =RandomManager.instance.getRandomByObjectList(MissionNum,1) this.cur_mission = num[0] this.mission_list = MonsetList[this.cur_mission] // console.log("当前关卡方案",this.cur_mission,this.mission_list) this.refresh_timer= new Timer(smc.vm_data.gold.cd*5); this.monster_refresh() this.load_role() } protected update(dt: number): void { if(smc.vm_data.game_over){ return } if(this.setp_timer.update(dt)){ this.monster_refresh() } if (this.refresh_timer.update(dt)) { this.setp_num = 1 } if (this.mission_up_timer.update(dt)) { // 刷新怪物定时器 this.cur_count += 1; } // if(this.target_timer.update(dt)){ // this.target_update() // } // if (this.game_timer.update(dt)) { // smc.vm_data.game.g_time += 1; // } // this.shuaxin(dt) } target_update(){ console.log("map ",smc.t_hero,smc.t_monster) let heros:any = ecs.query(ecs.allOf(HeroModelComp)); let monsters:any =ecs.query(ecs.allOf(MonsterModelComp)); let h_x=-1000 let m_x=1000 let thi=9999 let tmi=9999 for (let i = 0; i < heros.length; i++) { const hero = heros[i]; if(hero.MonsterView.node.position.x > h_x){ h_x = hero.MonsterView.node.position.x thi = i if(smc.t_hero.eid == hero.MonsterView.eid){ break } } } for (let i = 0; i < monsters.length; i++) { const monster = monsters[i]; if(monster.MonsterView.node.position.x < m_x){ m_x = monster.MonsterView.node.position.x tmi = i if(smc.t_monster.eid == monster.MonsterView.eid){ break } } } if(thi==9999){ smc.t_hero={eid:0,pos:v3(0,0,0)} }else{ smc.t_hero = {eid:heros[thi].MonsterView.eid,pos:v3(heros[thi].MonsterView.node.position,heros[thi].MonsterView.node.position.y)} } if(tmi==9999){ smc.t_monster={eid:0,pos:v3(0,0,0)} }else{ smc.t_monster ={eid:monsters[tmi].MonsterView.eid,pos:v3(monsters[tmi].MonsterView.node.position,monsters[tmi].MonsterView.node.position.y)} } } load_role(){ let role = ecs.getEntity(Role); let pos = v3(BoxSet.HERO_START,BoxSet.GAME_LINE) role.load(pos,109) smc.Role=role console.log("加载玩家",role) } private on_do_add_hero(event: string, args: any) { this.addHero(args.uuid) } /** 添加玩家 */ private addHero(uuid:number=1001) { let hero = ecs.getEntity(Hero); let {pos,monster_layer}=this.set_layer(BoxSet.HERO_START) let scale = 1 hero.load(pos,scale,uuid,monster_layer); } monster_refresh(){ if (this.setp_num <= 0){ return } // console.log("当前波数",this.cur_count) // console.log("当前怪物池",this.mission_list[this.monster_level]) let m:any = RandomManager.instance.getRandomByObjectList(this.mission_list[this.monster_level],1) let m1:any = RandomManager.instance.getRandomByObjectList(this.mission_list[this.monster_level],1) let m2:any = RandomManager.instance.getRandomByObjectList(this.mission_list[this.monster_level],1) // console.log("刷怪",m) var scene = smc.map.MapView.scene; let pos:Vec3 = v3(BoxSet.MONSTER_START,BoxSet.GAME_LINE) let pos1:Vec3 = v3(BoxSet.MONSTER_START,BoxSet.GAME_LINE+60) let pos2:Vec3 = v3(BoxSet.MONSTER_START,BoxSet.GAME_LINE-60) let monster_layer = scene.entityLayer!.node! let monster_layer1 = scene.entityLayer1!.node!; let monster_layer2 = scene.entityLayer2!.node!; this.addMonster(m[0],monster_layer,pos) this.addMonster(m1[0],monster_layer1,pos1) this.addMonster(m2[0],monster_layer2,pos2) this.setp_num -= 1 } private addMonster(uuid:number=1001,layer:any,pos:Vec3=v3(0,0,0)) { let monster = ecs.getEntity(Mon); let scale = -1 monster.load(pos,scale,uuid,layer); } set_layer(start:number=0){ var scene = smc.map.MapView.scene; let pos:Vec3 = v3(start,BoxSet.GAME_LINE) let x = RandomManager.instance.getRandomInt(0,2, 2); let monster_layer = scene.entityLayer!.node! switch (x) { case 1: monster_layer = scene.entityLayer1!.node!; pos.y=pos.y+80; break; case 2: monster_layer= scene.entityLayer2!.node!; pos.y=pos.y-80; break; } return {pos,monster_layer} } private on_other_add_monster(event: string, args: any) { var scene = smc.map.MapView.scene; let pos:Vec3 = v3(BoxSet.MONSTER_START,BoxSet.GAME_LINE) let monster_layer = scene.entityLayer!.node! this.addMonster(args.uuid,monster_layer,pos) } /** 视图层逻辑代码分离演示 */ /** 视图对象通过 ecs.Entity.remove(ModuleViewComp) 删除组件是触发组件处理自定义释放逻辑 */ reset() { this.node.destroy(); } }