playerActionMgr.ts 7.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220
  1. import itemDtManager from "../dataManager/itemDtManager";
  2. import npcHelper from "../dataManager/npcHelper";
  3. import Utils from "../framework/utils/utils";
  4. const { ccclass, property } = cc._decorator;
  5. @ccclass
  6. class playerActionMgr {
  7. private _gunHeadPos: any;
  8. /**
  9. *
  10. * @param spine 目标spine
  11. * @param npcID 玩家的唯一ID
  12. * @param wqID 武器ID (在捡到武器时或者切换武器时就需要传)
  13. * @param loop 是否循环
  14. */
  15. public playAttackAnim(spine: sp.Skeleton, npcID: number, loop, wqID?: number, cb?) {
  16. let animName = npcHelper.getModelAttrByID(npcID).attAct
  17. let newAnimName = this.getAnimName(animName, npcID, wqID);
  18. let trackIndex = spine.setAnimation(0, newAnimName, loop);
  19. if (cb) {
  20. spine.setTrackCompleteListener(trackIndex, cb);
  21. }
  22. }
  23. /**
  24. *
  25. * @param spine 目标spine
  26. * @param npcID 玩家的唯一ID
  27. * @param wqID 武器ID (在捡到武器时或者切换武器时就需要传)
  28. */
  29. public playStandAnim(spine: sp.Skeleton, npcID: number, loop, wqID?: number) {
  30. let animName = npcHelper.getModelAttrByID(npcID).idleAct
  31. let newAnimName = this.getAnimName(animName, npcID, wqID);
  32. spine.setAnimation(0, newAnimName, loop);
  33. }
  34. /**
  35. *
  36. * @param spine 目标spine
  37. * @param npcID 玩家的唯一ID
  38. * @param wqID 武器ID (在捡到武器时或者切换武器时就需要传)
  39. */
  40. public playWallAnim(spine: sp.Skeleton, npcID: number, loop, wqID?: number) {
  41. let animName = npcHelper.getModelAttrByID(npcID).moveAct;
  42. let newAnimName = this.getAnimName(animName, npcID, wqID);
  43. spine.setAnimation(0, newAnimName, loop);
  44. }
  45. /**
  46. *
  47. * @param spine 目标spine
  48. * @param npcID 玩家的唯一ID
  49. * @param wqID 武器ID (在捡到武器时或者切换武器时就需要传)
  50. */
  51. public playDieAnim(spine: sp.Skeleton, npcID: number, loop, wqID?: number) {
  52. let animName = npcHelper.getModelAttrByID(npcID).dieAct;
  53. let newAnimName = this.getAnimName(animName, npcID, wqID);
  54. spine.setAnimation(0, newAnimName, loop);
  55. }
  56. /**
  57. *
  58. * @param spine 目标spine
  59. * @param npcID 玩家的唯一ID
  60. * @param wqID 武器ID (在捡到武器时或者切换武器时就需要传)
  61. * @param cb 动画播放完后的回调
  62. */
  63. public playHitAnim(spine: sp.Skeleton, npcID: number, loop, wqID?: number, cb?) {
  64. let animName = npcHelper.getModelAttrByID(npcID).hitAct;
  65. let newAnimName = this.getAnimName(animName, npcID, wqID);
  66. let trackIndex = spine.setAnimation(0, newAnimName, loop);
  67. if (cb) {
  68. spine.setTrackCompleteListener(trackIndex, cb);
  69. }
  70. }
  71. AimZombie(spineNode: cc.Node, targetNode: cc.Node, wqID: number) {
  72. let boneName: string = '';
  73. let MuzzleName = '';
  74. let weaName: string = itemDtManager.getDataByID(wqID).anmiName;
  75. let fireEffNode = spineNode.getChildByName('fire1')
  76. if (weaName.indexOf('gunb_') >= 0) {
  77. boneName = 'GUNB_HR_BBGun';
  78. MuzzleName = 'txgunb';
  79. } else if (weaName.indexOf('guna_') >= 0) {
  80. boneName = 'GUNA_HM_CatGun'; //获取骨骼名字
  81. MuzzleName = 'txguna';
  82. }
  83. // setTimeout(() => {
  84. let Muzzle = undefined;
  85. let skeleton = spineNode.getComponent(sp.Skeleton);
  86. if (skeleton) {
  87. Muzzle = spineNode.getComponent(sp.Skeleton).findBone(MuzzleName); //枪口骨骼
  88. if (Muzzle) {
  89. let bulletPos = cc.v2(Muzzle.worldX * spineNode.scaleX, Muzzle.worldY);
  90. this._gunHeadPos = spineNode.parent.convertToWorldSpaceAR(bulletPos);
  91. let worldPos = cc.v2(Muzzle.worldX, Muzzle.worldY);
  92. fireEffNode.setPosition(worldPos.x, worldPos.y) //设置发射特效位置
  93. }
  94. //吴京枪口 相关特殊处理
  95. let wujingBoneName = 'gun_gatlinmg2';
  96. let wujingRotationName = 'gun_gatlinmg';
  97. let wujingBone = spineNode.getComponent(sp.Skeleton).findBone(wujingBoneName);
  98. if (wujingBone) {
  99. let bulletPos = cc.v2(wujingBone.worldX * spineNode.scaleX, wujingBone.worldY);
  100. this._gunHeadPos = spineNode.parent.convertToWorldSpaceAR(bulletPos);
  101. let worldPos = cc.v2(wujingBone.worldX, wujingBone.worldY);
  102. fireEffNode.setPosition(worldPos.x, worldPos.y) //设置发射特效位置
  103. }
  104. if (spineNode.getComponent(sp.Skeleton).findBone(wujingRotationName)) {
  105. boneName = wujingRotationName;
  106. }
  107. let gunBone = spineNode.getComponent(sp.Skeleton).findBone(boneName);
  108. if (gunBone) {
  109. let startNode = spineNode.parent.convertToWorldSpaceAR(cc.v2(spineNode.x, spineNode.y));
  110. let endNode = targetNode.parent.convertToNodeSpaceAR(cc.v2(targetNode.x, targetNode.y));
  111. let sub = startNode.sub(endNode);
  112. let comVec = cc.v2(0, -1); //以X轴正方向为基准线
  113. let radian = sub.signAngle(comVec); //弧度
  114. let angle = Math.floor(cc.misc.radiansToDegrees(radian)); //弧度转角度
  115. gunBone.rotation = -spineNode.scaleX * angle;
  116. fireEffNode.angle = gunBone.rotation - 90;
  117. }
  118. }
  119. // }, 0.02);
  120. }
  121. getGunHeadPos() {
  122. if (this._gunHeadPos) {
  123. return this._gunHeadPos;
  124. }
  125. }
  126. /**枪支角度重置
  127. * @param spineNode spine所在节点
  128. * @param wqID 武器视图id
  129. */
  130. resetGun(spineNode: cc.Node, wqID: number) {
  131. let boneName: string = '';
  132. let weaName: string = itemDtManager.getDataByID(wqID).anmiName;
  133. if (weaName.indexOf('gunb_') >= 0) {
  134. boneName = 'GUNB_HR_BBGun';
  135. } else if (weaName.indexOf('guna_') >= 0) {
  136. boneName = 'GUNA_HM_CatGun'; //获取骨骼名字
  137. }
  138. //吴京英雄枪 特殊处理
  139. let wujingRotationName = 'gun_gatlinmg';
  140. if (spineNode.getComponent(sp.Skeleton).findBone(wujingRotationName)) {
  141. boneName = wujingRotationName;
  142. }
  143. let gunBone = spineNode.getComponent(sp.Skeleton).findBone(boneName);
  144. if (!gunBone) {
  145. return;
  146. }
  147. gunBone.rotation = 90;
  148. let fireEffNode = spineNode.getChildByName('fire1')
  149. fireEffNode.angle = gunBone.rotation - 90;
  150. }
  151. /**
  152. *
  153. * @param spine 目标spine
  154. * @param npcID 玩家的唯一ID
  155. */
  156. public setSkin(spine, npcID: number) {
  157. let skinName = npcHelper.getModelAttrByID(npcID).modelname;
  158. spine.setSkin(skinName);
  159. }
  160. private getAnimName(animName: string, npcID: number, wqID: number) {
  161. let nameArr = animName.split(","); //切割动作名称
  162. let random = Utils.random(0, nameArr.length - 1); //随机取一个名字
  163. let wqName = wqID ? itemDtManager.getItemName(wqID) : null;
  164. let itemName = wqName ? wqName : this.getdefaultWqNameByNpcId(npcID);
  165. if (npcID >= 49 && npcID <= 52) {
  166. return nameArr[random];
  167. }
  168. let newName = '1fist/' + nameArr[random]; //itemName为空 表示空手动画
  169. if (itemName) {
  170. newName = itemName + "/" + nameArr[random];
  171. }
  172. return newName;
  173. }
  174. //获取初始玩家的武器名字 null为空手
  175. public getdefaultWqNameByNpcId(npcId) {
  176. let itemDt = npcHelper.getItemByID(npcId);
  177. if (itemDt == undefined) {
  178. return null;
  179. }
  180. let Wqname = itemDt.anmiName;
  181. if (Wqname == 0) {
  182. return null;
  183. }
  184. return Wqname;
  185. }
  186. }
  187. export default new playerActionMgr();