import { _decorator, Label,sp, UITransform, Vec2, Vec3 ,Node, isValid, tween} from 'cc'; import { ObjectUtil } from '../../../../framework/util/ObjectUtil'; import { BattleNodeBase } from './BattleNodeBase'; import { HeroData } from '../data/HeroData'; import { AudioID } from '../../../../framework/config/AudioConf'; import { Framework } from '../../../../framework/Framework'; import { UptypeConf } from '../conf/UptypeConf'; import { BattleEventManager } from '../base/BattleEventManager'; import { BattleEventHeroAction, BattleEventTarget, HeroActionType } from '../base/BattleEventUtil'; import { BattleUtil } from '../data/BattleUtil'; const { ccclass, property } = _decorator; //英雄基类 @ccclass('Hero') export class Hero extends BattleNodeBase { @property({ type: sp.Skeleton, tooltip: '骨骼动画' }) modelSpine: sp.Skeleton = null; @property({ type: Label, tooltip: '等级' }) levelLabel: Label = null; @property({ type: Node, tooltip: '枪 左右' }) gunNode1: Node = null; @property({ type: Node, tooltip: '枪 下' }) gunNode2: Node = null; @property({ type: Node, tooltip: '枪 上' }) gunNode3: Node = null; @property({ type: UITransform, tooltip: '点击框' }) clickBox: UITransform = null; //所属格子 -1表示暂无 private _posIndex = -1; private _bAttackAnimation: boolean = false; attackNode = null; // attackBone1 = null; attackBone2 = null; attackBone3 = null; attackBone4 = null; attackAngle1 = 0; attackAngle2 = 0; attackAngle3 = 0; attackAngle4 = 0; attackSlot = null; typeID: number = -1; private _raceID: number = -1; level: number = 1; radius = 1; //半径 battleEventManager: BattleEventManager; set posIndex(posIndx:number){ this._posIndex = posIndx; } get posIndex(){ return this._posIndex; } get raceID(){ return this._raceID; } protected onLoad(): void { this.modelSpine.setCompleteListener(this.actionComplete.bind(this)) this.modelSpine.setEventListener(this.actionCallback.bind(this)) this.battleEventManager = BattleEventManager.instance let bone1 = this.modelSpine.findBone("gun1") if(bone1){ this.attackBone1= bone1 let rot = this.attackBone1.rotation this.attackAngle1 = rot console.log("rot",rot) } let bone2 = this.modelSpine.findBone("gun2") if(bone2){ this.attackBone2 = bone2 let rot = this.attackBone2.rotation this.attackAngle2 = rot console.log("rot",rot) } let bone3 = this.modelSpine.findBone("gun3") if(bone3){ this.attackBone3 = bone3 let rot = this.attackBone3.rotation this.attackAngle3 = rot console.log("rot",rot) } let bone4 = this.modelSpine.findBone("gun1") if(bone4){ this.attackBone4 = bone4 let rot = this.attackBone4.rotation this.attackAngle4 = rot console.log("rot",rot) } // this.clickBox.setContentSize(this.modelSpine.getComponent(UITransform).contentSize) } start() { } resetData(heroData:HeroData) { this.typeID = heroData.typeID; this._raceID = heroData.raceID; this.level = heroData.level; this.radius = heroData.attackRadius; this.levelLabel.string = heroData.level.toString(); this.node.active = true; this.modelSpine.node.active = true; this.modelSpine.timeScale = 1; this.stand() // let id: string = heroData.heroID; } clearData() { this.node.active = false; this.modelSpine.node.active = false; this._posIndex = -1; this.typeID = -1; this.level = 0; this._isLock = false; } update(deltaTime: number) { super.update(deltaTime); if(this._bAttackAnimation && isValid(this.attackNode)){ let pos = this.attackNode.position; let rotationAngleDegrees = this.getRotationAngle(this.node,pos) this.attackBone1.rotation = 0 this.attackBone2.rotation = 0 this.attackBone3.rotation = 0 this.attackBone4.rotation = 0 let bChange = false if(rotationAngleDegrees<67.5 || rotationAngleDegrees > 292.5){ let rotationAngle = this.getRotationAngle(this.gunNode1,pos) this.attackBone1.rotation = (rotationAngle+this.attackAngle1) if(this.modelSpine.animation != "atk_right"){ this.modelSpine.setAnimation(0, 'atk_right', true); bChange = true } } else if(rotationAngleDegrees < 112.5){ let rotationAngle = this.getRotationAngle(this.gunNode3,pos) this.attackBone3.rotation = rotationAngle+this.attackAngle3-90 if(this.modelSpine.animation != "atk_up"){ this.modelSpine.setAnimation(0, 'atk_up', true); bChange = true } } else if(rotationAngleDegrees < 247.5){ let rotationAngle = this.getRotationAngle(this.gunNode1,pos) this.attackBone4.rotation = 180-rotationAngle+this.attackAngle4 if(this.modelSpine.animation != "atk_left"){ this.modelSpine.setAnimation(0, 'atk_left', true); bChange = true } } else if(rotationAngleDegrees < 292.5){ let rotationAngle = this.getRotationAngle(this.gunNode2,pos) this.attackBone2.rotation = rotationAngle+this.attackAngle2-270 if(this.modelSpine.animation != "atk_down"){ this.modelSpine.setAnimation(0, 'atk_down', true); bChange = true } } if(bChange){ let conf = UptypeConf.data let speedScale = conf.HeroSpeedColArr[this.level] this.modelSpine.timeScale = speedScale; } } } //屏幕坐标 bTouch(pos: Vec2){ return this.node.getComponent(UITransform).hitTest(pos,0); } get bAttackAnimation(): boolean{ return this._bAttackAnimation; } //通过目标坐标 来确定朝向 attack(attackNode:Node){ if(!this.modelSpine.node.active) return; // if(this._bAttackAnimation) return; this._bAttackAnimation = true; this.attackNode = attackNode; Framework.audio.playEffect(AudioID.Tututu); } stand() { if(!this.modelSpine.node.active) return; this._bAttackAnimation = false; // this.gunNode.angle = 0; // this.gunNode.active = true; this.attackBone1.rotation = 0 this.attackBone2.rotation = 0 this.attackBone3.rotation = 0 this.attackBone4.rotation = 0 // this._attackCallback = null; let animationName = this.modelSpine.animation if(animationName.includes("idle")) return; switch(animationName){ case "atk_right": this.modelSpine.setAnimation(0, 'idle_right', true); break; case "atk_left": this.modelSpine.setAnimation(0, 'idle_left', true); break; case "atk_up": this.modelSpine.setAnimation(0, 'idle_up', true); break; case "atk_down": this.modelSpine.setAnimation(0, 'idle_down', true); break; default: this.modelSpine.setAnimation(0, 'idle_right', true); break; } this.modelSpine.timeScale = 1; // if(this.modelSpine.node.scale.x < 0) // this.modelSpine.node.scale = new Vec3(-this.modelSpine.node.scale.x,this.modelSpine.node.scale.y,this.modelSpine.node.scale.z); } levelUp() { this.level++; this.levelLabel.string = this.level.toString(); } actionCallback(trackEntry){ // console.log("动作回调:",trackEntry.animation.name) if (trackEntry.animation.name && trackEntry.animation.name.includes("atk")) { // if (this._attackCallback) { // this._attackCallback(trackEntry); // } // console.log("攻击动作完成:",trackEntry.animation.name) if(this.posIndex > BattleUtil.PosID_Init){ let eventData:BattleEventHeroAction = { action: HeroActionType.Normal, posIndex: this._posIndex - BattleUtil.BagListSize } this.battleEventManager.fireEvent(BattleEventTarget.HeroAction,eventData) } } } actionComplete(trackEntry:sp.spine.TrackEntry){ // console.log("动作完成:",trackEntry.animation.name,this._posID) if (trackEntry.animation.name && trackEntry.animation.name.includes("fire")) { // this._bAttackAnimation = false; // // this.gunNode.angle = 0; // // this.gunNode.active = false; // this.attackBone.rotation = 0 // this._attackCallback = null; } } // flyTo(pos:Vec3, callback:Function){ if(this._isLock){ return false; } this.isLock = true; let length = Vec3.distance(this.node.position,pos); if(length > 300){ length = 300; } tween(this.node).to(length/500,{position:pos}).call(()=>{ this.isLock = false; if(callback) callback(); }).start(); } hitTest(pos:Vec2){ return this.clickBox.hitTest(pos) || this.node.getComponent(UITransform).hitTest(pos); } //根据目标位置获取旋转角度 getRotationAngle(srcNode:Node,targetPos:Vec2){ // 获取子节点的世界坐标 let worldPosition = this.node.getComponent(UITransform).convertToWorldSpaceAR(Vec3.ZERO); // 将子节点的世界坐标转换为父节点的局部坐标 let localPosition = this.node.parent.getComponent(UITransform).convertToNodeSpaceAR(worldPosition); // 计算从p0到p1的向量 let deltaX: number = targetPos.x - localPosition.x; let deltaY: number = targetPos.y - localPosition.y; // 计算旋转角度(弧度) let rotationAngleRadians: number = Math.atan2(deltaY, deltaX); // 将旋转角度转换为度数 let rotationAngleDegrees: number = (rotationAngleRadians * (180 / Math.PI)+360)%360; return rotationAngleDegrees; } }