import { _decorator, Vec3,Animation, instantiate, Prefab, Node } 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 { smc } from "../common/SingletonModuleComp"; import { oops } from "../../../../extensions/oops-plugin-framework/assets/core/Oops"; import { FightSet} from "../common/config/Mission"; import { Timer } from "../../../../extensions/oops-plugin-framework/assets/core/common/timer/Timer"; import { GameEvent } from "../common/config/GameEvent"; import { HeroViewComp } from "../hero/HeroViewComp"; import { MonModelComp } from "../hero/MonModelComp"; import { SkillCom } from "../skills/SkillCom"; import { UIID } from "../common/config/GameUIConfig"; import { ItemComp } from "./ItemComp"; const { ccclass, property } = _decorator; //@todo this is a test /** 视图层对象 */ @ccclass('MissionComp') @ecs.register('MissionComp', false) export class MissionComp extends CCComp { // VictoryComp:any = null; // reward:number = 0; // reward_num:number = 0; rewards:any[]=[] onLoad(){ this.on(GameEvent.MissionStart,this.mission_start,this) this.on(GameEvent.MonDead,this.do_mon_dead,this) this.on(GameEvent.HeroDead,this.do_hero_dead,this) this.on(GameEvent.FightEnd,this.fight_end,this) this.on(GameEvent.MissionEnd,this.mission_end,this) this.on(GameEvent.DO_AD_BACK,this.do_ad,this) // this.on(GameEvent.CanUpdateLv,this.show_uplv_button,this) } protected update(dt: number): void { if(!smc.mission.play||smc.mission.pause){ return } if(smc.mission.in_fight){ smc.vmdata.mission_data.fight_time+=dt } } //奖励发放 do_reward(){ // 奖励发放 } do_drop(drop_item:any[]){ console.log("[MissionComp] do_drop",drop_item) let parent=this.node.getChildByName("reward").getChildByName("items") let items=parent.children if(drop_item.length>0){ for(let i=0;i item.item_uuid === d_item.item_uuid); if(existingItem){ // 如果已存在该物品,累加数量 existingItem.count += d_item.count; }else{ // 如果不存在该物品,添加新物品 this.rewards.push({item_uuid: d_item.item_uuid, count: d_item.count}); } } } for(let i=0;i0){ console.log("[MissionComp] do_drop 剩余物品",drop_item) for(let i=0;ido_drop] 预制体加载失败:", path); return; } const node = instantiate(prefab) as unknown as Node; node.parent=parent node.getComponent(ItemComp)!.update_data(d_item.item_uuid,d_item.count) } } } do_mon_dead(event:any,data:any){ console.log("[MissionComp] do_mon_dead",event,data) smc.vmdata.mission_data.mon_num-- if(data.drops){ if(data.drops.length>0){ this.do_drop(data.drops) } } if(smc.vmdata.mission_data.mon_num<=0) { smc.vmdata.mission_data.level++ if(smc.vmdata.mission_data.level < smc.vmdata.mission_data.max_mission){ oops.message.dispatchEvent(GameEvent.NewWave) return } smc.addMission(1) oops.message.dispatchEvent(GameEvent.FightEnd,{victory:true}) oops.gui.open(UIID.Victory,{victory:true,rewards:this.rewards}) } } do_hero_dead(event:any,data:any){ console.log("[MissionComp] do_hero_dead",event,data) smc.vmdata.mission_data.hero_num-- if(smc.vmdata.mission_data.hero_num<=0) { oops.message.dispatchEvent(GameEvent.FightEnd,{victory:false}) oops.gui.open(UIID.Victory,{victory:false,rewards:this.rewards}) } } do_ad(){ if(this.ad_back()){ oops.message.dispatchEvent(GameEvent.AD_BACK_TRUE) smc.vmdata.mission_data.refresh_count+=FightSet.MORE_RC }else{ oops.message.dispatchEvent(GameEvent.AD_BACK_FALSE) } } ad_back(){ return true } async mission_start(){ console.log("[MissionComp] ** 1 ** mission_start") this.node.getChildByName("ending").getComponent(Animation).play("startFight") oops.message.dispatchEvent(GameEvent.FightReady) this.node.active=true this.data_init() let loading=this.node.parent.getChildByName("loading") loading.active=true this.scheduleOnce(()=>{ loading.active=false },0.5) this.scheduleOnce(()=>{ this.to_fight() },0.1) } to_fight(){ smc.mission.in_fight=true oops.message.dispatchEvent(GameEvent.FightStart) //MissionMonComp 监听刷怪 } to_end_fight(){ oops.message.dispatchEvent(GameEvent.FightEnd,{victory:false}) oops.gui.open(UIID.Victory,{victory:false,rewards:this.rewards}) } fight_end(){ console.log("任务结束") // 延迟0.5秒后执行任务结束逻辑 this.scheduleOnce(() => { smc.mission.play=false smc.mission.pause=false this.cleanComponents() }, 0.5) } mission_end(){ console.log("[MissionComp] mission_end") this.node.getChildByName("ending").active=false this.node.active=false } data_init(){ //局内数据初始化 smc 数据初始化 smc.mission.play = true; smc.vmdata.mission_data.in_fight=false smc.vmdata.mission_data.fight_time=0 smc.vmdata.mission_data.level=0 this.rewards=[] // 改为数组,用于存储掉落物品列表 this.node.getChildByName("reward").getChildByName("items").removeAllChildren() console.log("[MissionComp]局内数据初始化",smc.vmdata.mission_data) } private cleanComponents() { ecs.query(ecs.allOf(HeroViewComp)).forEach(entity => {entity.remove(HeroViewComp);entity.destroy()}); ecs.query(ecs.allOf(SkillCom)).forEach(entity => {entity.remove(SkillCom);entity.destroy()}); } /** 视图层逻辑代码分离演示 */ /** 视图对象通过 ecs.Entity.remove(ModuleViewComp) 删除组件是触发组件处理自定义释放逻辑 */ reset() { this.node.destroy(); } }