import itemDtManager from "../dataManager/itemDtManager"; import npcHelper from "../dataManager/npcHelper"; import Utils from "../framework/utils/utils"; const { ccclass, property } = cc._decorator; @ccclass class playerActionMgr { private _gunHeadPos: any; /** * * @param spine 目标spine * @param npcID 玩家的唯一ID * @param wqID 武器ID (在捡到武器时或者切换武器时就需要传) * @param loop 是否循环 */ public playAttackAnim(spine: sp.Skeleton, npcID: number, loop, wqID?: number, cb?) { let animName = npcHelper.getModelAttrByID(npcID).attAct let newAnimName = this.getAnimName(animName, npcID, wqID); let trackIndex = spine.setAnimation(0, newAnimName, loop); if (cb) { spine.setTrackCompleteListener(trackIndex, cb); } } /** * * @param spine 目标spine * @param npcID 玩家的唯一ID * @param wqID 武器ID (在捡到武器时或者切换武器时就需要传) */ public playStandAnim(spine: sp.Skeleton, npcID: number, loop, wqID?: number) { let animName = npcHelper.getModelAttrByID(npcID).idleAct let newAnimName = this.getAnimName(animName, npcID, wqID); spine.setAnimation(0, newAnimName, loop); } /** * * @param spine 目标spine * @param npcID 玩家的唯一ID * @param wqID 武器ID (在捡到武器时或者切换武器时就需要传) */ public playWallAnim(spine: sp.Skeleton, npcID: number, loop, wqID?: number) { let animName = npcHelper.getModelAttrByID(npcID).moveAct; let newAnimName = this.getAnimName(animName, npcID, wqID); spine.setAnimation(0, newAnimName, loop); } /** * * @param spine 目标spine * @param npcID 玩家的唯一ID * @param wqID 武器ID (在捡到武器时或者切换武器时就需要传) */ public playDieAnim(spine: sp.Skeleton, npcID: number, loop, wqID?: number) { let animName = npcHelper.getModelAttrByID(npcID).dieAct; let newAnimName = this.getAnimName(animName, npcID, wqID); spine.setAnimation(0, newAnimName, loop); } /** * * @param spine 目标spine * @param npcID 玩家的唯一ID * @param wqID 武器ID (在捡到武器时或者切换武器时就需要传) * @param cb 动画播放完后的回调 */ public playHitAnim(spine: sp.Skeleton, npcID: number, loop, wqID?: number, cb?) { let animName = npcHelper.getModelAttrByID(npcID).hitAct; let newAnimName = this.getAnimName(animName, npcID, wqID); let trackIndex = spine.setAnimation(0, newAnimName, loop); if (cb) { spine.setTrackCompleteListener(trackIndex, cb); } } AimZombie(spineNode: cc.Node, targetNode: cc.Node, wqID: number) { let boneName: string = ''; let MuzzleName = ''; let weaName: string = itemDtManager.getDataByID(wqID).anmiName; let fireEffNode = spineNode.getChildByName('fire1') if (weaName.indexOf('gunb_') >= 0) { boneName = 'GUNB_HR_BBGun'; MuzzleName = 'txgunb'; } else if (weaName.indexOf('guna_') >= 0) { boneName = 'GUNA_HM_CatGun'; //获取骨骼名字 MuzzleName = 'txguna'; } // setTimeout(() => { let Muzzle = undefined; let skeleton = spineNode.getComponent(sp.Skeleton); if (skeleton) { Muzzle = spineNode.getComponent(sp.Skeleton).findBone(MuzzleName); //枪口骨骼 if (Muzzle) { let bulletPos = cc.v2(Muzzle.worldX * spineNode.scaleX, Muzzle.worldY); this._gunHeadPos = spineNode.parent.convertToWorldSpaceAR(bulletPos); let worldPos = cc.v2(Muzzle.worldX, Muzzle.worldY); fireEffNode.setPosition(worldPos.x, worldPos.y) //设置发射特效位置 } //吴京枪口 相关特殊处理 let wujingBoneName = 'gun_gatlinmg2'; let wujingRotationName = 'gun_gatlinmg'; let wujingBone = spineNode.getComponent(sp.Skeleton).findBone(wujingBoneName); if (wujingBone) { let bulletPos = cc.v2(wujingBone.worldX * spineNode.scaleX, wujingBone.worldY); this._gunHeadPos = spineNode.parent.convertToWorldSpaceAR(bulletPos); let worldPos = cc.v2(wujingBone.worldX, wujingBone.worldY); fireEffNode.setPosition(worldPos.x, worldPos.y) //设置发射特效位置 } if (spineNode.getComponent(sp.Skeleton).findBone(wujingRotationName)) { boneName = wujingRotationName; } let gunBone = spineNode.getComponent(sp.Skeleton).findBone(boneName); if (gunBone) { let startNode = spineNode.parent.convertToWorldSpaceAR(cc.v2(spineNode.x, spineNode.y)); let endNode = targetNode.parent.convertToNodeSpaceAR(cc.v2(targetNode.x, targetNode.y)); let sub = startNode.sub(endNode); let comVec = cc.v2(0, -1); //以X轴正方向为基准线 let radian = sub.signAngle(comVec); //弧度 let angle = Math.floor(cc.misc.radiansToDegrees(radian)); //弧度转角度 gunBone.rotation = -spineNode.scaleX * angle; fireEffNode.angle = gunBone.rotation - 90; } } // }, 0.02); } getGunHeadPos() { if (this._gunHeadPos) { return this._gunHeadPos; } } /**枪支角度重置 * @param spineNode spine所在节点 * @param wqID 武器视图id */ resetGun(spineNode: cc.Node, wqID: number) { let boneName: string = ''; let weaName: string = itemDtManager.getDataByID(wqID).anmiName; if (weaName.indexOf('gunb_') >= 0) { boneName = 'GUNB_HR_BBGun'; } else if (weaName.indexOf('guna_') >= 0) { boneName = 'GUNA_HM_CatGun'; //获取骨骼名字 } //吴京英雄枪 特殊处理 let wujingRotationName = 'gun_gatlinmg'; if (spineNode.getComponent(sp.Skeleton).findBone(wujingRotationName)) { boneName = wujingRotationName; } let gunBone = spineNode.getComponent(sp.Skeleton).findBone(boneName); if (!gunBone) { return; } gunBone.rotation = 90; let fireEffNode = spineNode.getChildByName('fire1') fireEffNode.angle = gunBone.rotation - 90; } /** * * @param spine 目标spine * @param npcID 玩家的唯一ID */ public setSkin(spine, npcID: number) { let skinName = npcHelper.getModelAttrByID(npcID).modelname; spine.setSkin(skinName); } private getAnimName(animName: string, npcID: number, wqID: number) { let nameArr = animName.split(","); //切割动作名称 let random = Utils.random(0, nameArr.length - 1); //随机取一个名字 let wqName = wqID ? itemDtManager.getItemName(wqID) : null; let itemName = wqName ? wqName : this.getdefaultWqNameByNpcId(npcID); if (npcID >= 49 && npcID <= 52) { return nameArr[random]; } let newName = '1fist/' + nameArr[random]; //itemName为空 表示空手动画 if (itemName) { newName = itemName + "/" + nameArr[random]; } return newName; } //获取初始玩家的武器名字 null为空手 public getdefaultWqNameByNpcId(npcId) { let itemDt = npcHelper.getItemByID(npcId); if (itemDt == undefined) { return null; } let Wqname = itemDt.anmiName; if (Wqname == 0) { return null; } return Wqname; } } export default new playerActionMgr();