import { _decorator, instantiate, Node, Prefab } 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 { HeroViewComp } from "../hero/HeroViewComp"; import { BuffAttr, RType, SkillSet } from "../common/config/SkillSet"; import { AtkConCom } from "./AtkConCom"; const { ccclass, property } = _decorator; /** 视图层对象 */ @ccclass('SkillViewCom') @ecs.register('SkillView', false) export class SkillViewCom extends CCComp { /** 视图层逻辑代码分离演示 */ @property({ type: Prefab }) atkPrefab: Prefab = null! @property({ type: Number }) runType: number = 0; @property({ type: Boolean }) hasReady: boolean = false; @property({ type: Number }) ReadyTime: number = 0; @property({ type: Number }) postion_y: number = 0; endTime: number = 0; s_uuid:number=0; s_count:number=1; s_interval:number=0.2; s_cd:number=0; caster:HeroViewComp=null; cName:string=""; target:HeroViewComp=null; parent:Node=null; target_postions:any[]=null // 战斗相关运行时数据 ap:number=0; burn_count:number=0; burn_value:number=0; stun_time:number=0; stun_ratio:number=0; frost_ratio:number=0; frost_time:number=0; run_time:number=0; hited_time:number=0; hit_count:number=0; caster_crit:number=0; caster_crit_d:number=0; puncture:number=0; puncture_damage:number=0; debuff_up:number=0; debuff_value:number=0; debuff_count:number=0; targetPos:any[]=null start() { // var entity = this.ent as ecs.Entity; // ecs.Entity 可转为当前模块的具体实体对象 this.cName = this.caster.hero_name this.node.getChildByName("ready").active = this.hasReady } protected update(dt: number): void { this.doTimer(dt) this.move(dt) this.doEnd(dt) if(this.hasReady) { if(this.ReadyTime <= 0) { this.doAtk(dt) } }{ this.doAtk(dt) } } doEnd(dt: number) { this.endTime += dt if(this.endTime >= SkillSet[this.s_uuid].in) { this.ent.destroy() } } doTimer(dt: number){ if(this.ReadyTime > 0&&this.hasReady) this.ReadyTime -= dt } doAtk(dt:number): void { // console.log(`${this.cName}_[SkillViewCom] doAtkC`) if(this.s_cd <= 0&&this.s_count > 0) { this.doSkill() this.s_count-- this.s_cd = this.s_interval } if(this.s_cd > 0) this.s_cd -= dt } doSkill(){ console.log(`${this.cName}_[SkillViewCom] doSkill`,this.atkPrefab) if(this.atkPrefab!=null){ let atkNode:Node = instantiate(this.atkPrefab) atkNode.parent = this.node.parent atkNode.setPosition(this.node.position) let atkCom=atkNode.getComponent(AtkConCom) Object.assign(atkCom, { // 核心标识 s_uuid: this.s_uuid, // 位置和施法者信息 startPos: this.node.position, targetPos: this.targetPos[0], group: this.caster.box_group, fac: this.caster.fac, // 技能数值 ap: this.caster.Attrs[BuffAttr.AP], caster: this.caster, caster_crit: this.caster.Attrs[BuffAttr.CRITICAL], caster_crit_d: this.caster.Attrs[BuffAttr.CRITICAL_DMG], puncture: this.caster.Attrs[BuffAttr.PUNCTURE], puncture_damage: this.caster.Attrs[BuffAttr.PUNCTURE_DMG], burn_count: this.caster.Attrs[BuffAttr.BURN_COUNT], burn_value: this.caster.Attrs[BuffAttr.BURN_VALUE], stun_time: this.caster.Attrs[BuffAttr.STUN_TIME], stun_ratio: this.caster.Attrs[BuffAttr.STUN_RATIO], frost_time: this.caster.Attrs[BuffAttr.FROST_TIME], frost_ratio: this.caster.Attrs[BuffAttr.FROST_RATIO], debuff_up: this.caster.Attrs[BuffAttr.DEBUFF_UP], debuff_value: this.caster.Attrs[BuffAttr.DEBUFF_VALUE], debuff_count: this.caster.Attrs[BuffAttr.DEBUFF_COUNT], }); switch(this.runType){ case RType.linear: this.do_linear(atkNode) break case RType.bezier: this.do_bezier(atkNode) break case RType.fixed: this.do_fixed(atkNode) break } } } do_linear(atkNode:any): void { console.log(`${this.cName}_[SkillViewCom] skille run type: linear`) } do_bezier(atkNode:any): void { console.log(`${this.cName}_[SkillViewCom] skille run type: bezier`) } do_fixed(atkNode:any): void { console.log(`${this.cName}_[SkillViewCom] skille run type: fixed`) } move(dt: number): void { // console.log(`${this.cName}_[SkillViewCom] move`) if(this.caster != null&&this.caster.node!=null) this.node.setPosition(this.caster.node.position.x,this.caster.node.position.y+this.postion_y) // console.log(`${this.cName}_[skillview]move`,this.caster.node.position,this.node.position) } reset() { this.node.destroy(); } }