FightLayer.ts 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196
  1. import { find, Node, tween, UITransform, v3, Vec3, _decorator } from 'cc';
  2. import { BaseLayer } from '../../common/BaseLayer';
  3. import { cocosUtil } from '../../utils/cocosUtil';
  4. import { constants } from '../data/constants';
  5. import { msgac } from '../data/msgac';
  6. import { RoleItem } from '../item/RoleItem';
  7. import { eventManager } from '../manager/eventManager';
  8. import { levelManager } from '../manager/levelManager';
  9. const { ccclass, property } = _decorator;
  10. @ccclass('FightLayer')
  11. export class FightLayer extends BaseLayer {
  12. stageLayer: Node;
  13. // 玩家原先的父节点
  14. playerNodeParent: Node;
  15. // 玩家原先的世界坐标
  16. playerWorldPos: Vec3;
  17. // 玩家立绘原先的缩放
  18. playerBodyScale: Vec3;
  19. // 怪物id
  20. monsterId: number;
  21. // 怪物节点
  22. monsterNode: Node;
  23. // 怪物原先的父节点
  24. monsterNodeParent: Node;
  25. // 怪物原先的世界坐标
  26. monsterWorldPos: Vec3;
  27. // 怪物立绘原先的缩放
  28. monsterBodyScale: Vec3;
  29. onLoad() {
  30. super.onLoad();
  31. this.stageLayer = this.getNodeByPath("stage");
  32. }
  33. startFight(data: any) {
  34. let playerRoleItem = levelManager.instance.playerRoleItem;
  35. let playerNode = playerRoleItem.node;
  36. let monsterRoleItem = data.monsterRoleItem;
  37. let monsterNode = monsterRoleItem.node;
  38. this.monsterNode = monsterNode;
  39. let atkCount = 0;
  40. if (playerRoleItem.atk > monsterRoleItem.atk) {
  41. // 打赢
  42. let monsterAtk = monsterRoleItem.atk;
  43. playerRoleItem.playAnimation(constants.animations.attack, true, () => {
  44. atkCount++;
  45. if (atkCount >= constants.atkAniTotal) {
  46. // playerRoleItem.playAnimation(constants.animations.win, true);
  47. // 加战力
  48. levelManager.instance.addAtk(monsterAtk);
  49. playerRoleItem.playAnimation(constants.animations.standBy, true);
  50. this.hideLayer();
  51. }
  52. });
  53. let hitCount = 0;
  54. monsterRoleItem.scheduleOnce(() => {
  55. monsterRoleItem.playAnimation(constants.animations.hit, true, () => {
  56. hitCount++;
  57. if (hitCount >= 1) {
  58. let obj: any = {};
  59. obj.parentNode = this.monsterNodeParent;
  60. obj.worldPos = this.monsterWorldPos;
  61. monsterRoleItem.showDeadEffect(null, obj);
  62. }
  63. });
  64. }, 1.5);
  65. return;
  66. }
  67. // 打输了
  68. let tmpCb = () => {
  69. // levelManager.instance.addHitEffect(playerNode);
  70. playerRoleItem.playAnimation(constants.animations.hit, true);
  71. };
  72. playerRoleItem.scheduleOnce(tmpCb, 0.3);
  73. monsterRoleItem.playAnimation(constants.animations.attack, true, () => {
  74. playerRoleItem.unschedule(tmpCb);
  75. atkCount++;
  76. if (atkCount >= constants.atkAniTotal) {
  77. monsterRoleItem.playAnimation(constants.animations.standBy, true);
  78. playerRoleItem.showDeadEffect(() => {
  79. this.hideLayer();
  80. });
  81. }
  82. });
  83. }
  84. hideLayer() {
  85. // 玩家位置
  86. let playerNode = levelManager.instance.playerRoleItem.node;
  87. playerNode.parent = this.playerNodeParent;
  88. let p = cocosUtil.convertToNodeSpace(playerNode, this.playerWorldPos);
  89. playerNode.setPosition(p);
  90. find("body", playerNode).setScale(this.playerBodyScale);
  91. // 怪物位置
  92. let monsterNode = this.monsterNode;
  93. if (cocosUtil.isNodeValid(monsterNode)) {
  94. monsterNode.parent = this.monsterNodeParent;
  95. p = cocosUtil.convertToNodeSpace(monsterNode, this.monsterWorldPos);
  96. monsterNode.setPosition(p);
  97. find("body", monsterNode).setScale(this.monsterBodyScale);
  98. }
  99. levelManager.instance.canClickGoOn = true;
  100. this.node.active = false;
  101. // 镜头跟随
  102. eventManager.instance.send(msgac.adjustPlayerInCenter);
  103. // 战斗结束
  104. let obj: any = {};
  105. obj.isWin = true;
  106. obj.monsterId = this.monsterId;
  107. if (levelManager.instance.playerRoleItem.isDead()) {
  108. // 玩家战斗失败
  109. obj.isWin = false;
  110. }
  111. eventManager.instance.send(msgac.fightEnd, obj);
  112. }
  113. loadFightData(data: any) {
  114. let playerRoleItem = levelManager.instance.playerRoleItem;
  115. let playerNode = playerRoleItem.node;
  116. let monsterRoleItem = data.monsterRoleItem;
  117. let monsterNode = monsterRoleItem.node;
  118. this.monsterWorldPos = cocosUtil.convertToWorldSpace(monsterNode);
  119. let monsterBody = find("body", monsterNode);
  120. this.monsterBodyScale = monsterBody.getScale();
  121. this.monsterNodeParent = monsterNode.parent;
  122. this.monsterId = monsterNode.getComponent(RoleItem).roleTypeP1;
  123. this.playerWorldPos = cocosUtil.convertToWorldSpace(playerNode);
  124. let playerBody = find("body", playerNode);
  125. this.playerBodyScale = playerBody.getScale();
  126. this.playerNodeParent = playerNode.parent;
  127. // 玩家左移和怪物右移的距离(相对中间点)
  128. let dx = 0;
  129. if (playerRoleItem.atk > monsterRoleItem.atk) {
  130. // 玩家攻击怪物,弓箭手要拉开点间距
  131. dx = 75;
  132. }
  133. monsterRoleItem.node.parent = this.stageLayer;
  134. let tf = monsterNode.getComponent(UITransform);
  135. let pos = monsterNode.getPosition();
  136. pos.x = dx + tf.width * tf.anchorX;
  137. pos.y = 0;
  138. let maxX = 280 - tf.width * (1 - tf.anchorX);
  139. if (pos.x > maxX) {
  140. pos.x = maxX;
  141. }
  142. monsterNode.setPosition(pos);
  143. let scale = monsterBody.getScale();
  144. scale.x = Math.abs(scale.x);
  145. monsterBody.setScale(scale);
  146. playerRoleItem.node.parent = this.stageLayer;
  147. tf = playerNode.getComponent(UITransform);
  148. pos = playerNode.getPosition();
  149. pos.x = -(dx + tf.width * (1 - tf.anchorX));
  150. if (playerRoleItem.atk > monsterRoleItem.atk) {
  151. // 打赢情况下,再拉开点距离
  152. pos.x -= 50;
  153. }
  154. pos.y = 0;
  155. playerNode.setPosition(pos);
  156. scale = playerBody.getScale();
  157. scale.x = Math.abs(scale.x);
  158. playerBody.setScale(scale);
  159. this.stageLayer.setScale(0, 0);
  160. tween(this.stageLayer).to(0.2, {
  161. scale: v3(1, 1)
  162. }).call(() => {
  163. this.startFight(data);
  164. }).start();
  165. }
  166. onButtonClick(node: Node, name: string) {
  167. switch (name) {
  168. default:
  169. break;
  170. }
  171. }
  172. }