BattleWindow.ts 9.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210
  1. import { _decorator, Component, Node, Label, EventHandler, Sprite, Prefab, instantiate, SpriteFrame, ImageAsset, Texture2D } from 'cc';
  2. import { Http } from '../../core/net/Http';
  3. import { ResourcesUtils } from '../../core/resourceManager/ResourcesUtils';
  4. import { UITween } from '../../core/ui/tween/UITween';
  5. import { WindowManager } from '../../core/ui/window/WindowManager';
  6. import { WindowOpenMode } from '../../core/ui/window/WindowOpenMode';
  7. import { g } from '../../Data/g';
  8. import { ISJSB } from '../../Data/platform';
  9. import { SoundSystem } from '../../Main/SoundSystem';
  10. import { BattleRole, BattleRoleState } from './BattleRole';
  11. import { BattleType } from './BattleUIWindow';
  12. const { ccclass, property } = _decorator;
  13. /**切磋战斗准备 */
  14. @ccclass('BattleWindow')
  15. export class BattleWindow extends Component {
  16. @property({ type: Http, tooltip: "消息控制" })
  17. http: Http;
  18. @property({ type: UITween, tooltip: "开始动画" })
  19. ourTeamTween: UITween;
  20. @property({ type: UITween, tooltip: "开始动画" })
  21. enemyTeamTween: UITween;
  22. @property({ type: Label, tooltip: "剩余次数文本" })
  23. numsLabel: Label;
  24. @property({ type: Node, tooltip: "准备时UI" })
  25. generalNode: Node;
  26. @property({ type: Sprite, tooltip: "我方头像" })
  27. ourHeadSprite: Sprite;
  28. @property({ type: Sprite, tooltip: "敌方头像" })
  29. enemyHeadSprite: Sprite;
  30. @property({ type: EventHandler, tooltip: "开始对战回调" })
  31. startHanedler: EventHandler;
  32. @property({ type: [Node], tooltip: "我方神将组" })
  33. ourGeneralsGroup: Node[] = [];
  34. @property({ type: [Node], tooltip: "敌方神将组" })
  35. enemyGeneralsGroup: Node[] = [];
  36. @property({ type: Sprite, tooltip: "返回图片" })
  37. closeSprite: Sprite;
  38. @property({ tooltip: "单方最多出战神将数" })
  39. generalMaxNum: number = 50;
  40. @property({ type: Label, tooltip: "我方队伍人数文本" })
  41. ourNumLabel: Label;
  42. private battleKey: string;
  43. //战斗类型0表示随机,1表示好友,2表示复仇,3表示挑战
  44. start() {
  45. this.numsLabel.node.active = !(g.battleData.type == BattleType.avengeBattle);
  46. SoundSystem.play(1);
  47. }
  48. update() {
  49. if (g.gameData.hasBattleOver) {
  50. g.gameData.hasBattleOver = false;
  51. g.gameData.hasBattleOverRefresh = true;
  52. WindowManager.close();
  53. }
  54. }
  55. onDestroy() {
  56. SoundSystem.play(0);
  57. }
  58. /**窗口打开回调 设置战斗准备数据*/
  59. public async openHandler(data: any) {
  60. if (ISJSB) {
  61. if (g.userData.avator) {
  62. let img = await ResourcesUtils.loadRemote<ImageAsset>(g.userData.avator, { ext: ".png" }, this);
  63. const spriteFrame = new SpriteFrame();
  64. const texture = new Texture2D();
  65. texture.image = img;
  66. spriteFrame.texture = texture;
  67. this.ourHeadSprite.spriteFrame = spriteFrame;
  68. }
  69. if (g.battleData.enemyAvator) {
  70. let img = await ResourcesUtils.loadRemote<ImageAsset>(g.battleData.enemyAvator, { ext: ".png" }, this);
  71. const spriteFrame = new SpriteFrame();
  72. const texture = new Texture2D();
  73. texture.image = img;
  74. spriteFrame.texture = texture;
  75. this.enemyHeadSprite.spriteFrame = spriteFrame;
  76. }
  77. }
  78. this.setOurBattleGenerals();
  79. this.setEnemyBattleGenerals();
  80. this.battleKey = g.battleData.battleKey;
  81. this.numsLabel.node.active = data.type != BattleType.avengeBattle;
  82. this.numsLabel.string = '今日剩余次数:' + (g.gameData.RemainderAddTimes + g.gameData.RemainderHadAddTimes + g.gameData.battleRemainder);
  83. for (let i = 0; i < this.ourGeneralsGroup.length; i++) {
  84. if (i < g.battleData.ourBattleGenerals.length) {
  85. this.ourGeneralsGroup[i].getComponent(BattleRole).setData(g.battleData.ourBattleGenerals[i], BattleRoleState.Ready);
  86. this.ourGeneralsGroup[i].active = true;
  87. }
  88. }
  89. for (let i = 0; i < this.enemyGeneralsGroup.length; i++) {
  90. if (i < g.battleData.enemyBattleGenerals.length) {
  91. this.enemyGeneralsGroup[i].getComponent(BattleRole).setData(g.battleData.enemyBattleGenerals[i], BattleRoleState.Ready, false);
  92. this.enemyGeneralsGroup[i].active = true;
  93. }
  94. }
  95. }
  96. /**设置我方参战神将数据 */
  97. private setOurBattleGenerals() {
  98. g.battleData.ourBattleGenerals = [];
  99. let generals = g.gameData.getMyLocalData(g.userData.id).myLocalGenerals;
  100. if (!generals.length) {
  101. g.battleData.ourBattleGenerals.push({ id: g.userData.id, lv: g.userData.lv, nickName: g.userData.nickName, avator: g.userData.avator });
  102. for (let j = 0; j < g.battleData.myFriendDatas.length; j++) {
  103. if (g.battleData.ourBattleGenerals.length <= this.generalMaxNum) {
  104. g.battleData.ourBattleGenerals.push(g.battleData.myFriendDatas[j]);
  105. }
  106. }
  107. } else {
  108. generals.sort((a: any, b: any): number => {
  109. return a.lv > b.lv ? -1 : 1;//优先最近战斗
  110. });
  111. for (let i = 0; i < generals.length; i++) {
  112. if (!i) {
  113. g.battleData.ourBattleGenerals.push({ id: g.userData.id, lv: generals[i].generalLv, nickName: g.userData.nickName, avator: g.userData.avator });//主将
  114. for (let j = 0; j < g.battleData.myFriendDatas.length; j++) {
  115. if (g.battleData.ourBattleGenerals.length <= this.generalMaxNum) {
  116. g.battleData.ourBattleGenerals.push(g.battleData.myFriendDatas[j]);
  117. }
  118. }
  119. }
  120. else {
  121. if (g.battleData.ourBattleGenerals.length <= this.generalMaxNum) {
  122. g.battleData.ourBattleGenerals.push({ id: 0, lv: generals[i].generalLv, nickName: '', avator: '' });
  123. }
  124. }
  125. }
  126. }
  127. let ourNum = g.battleData.ourBattleGenerals.length;
  128. ourNum = ourNum || 1;
  129. this.ourNumLabel.string = ourNum + '人';
  130. }
  131. /**设置敌方参战神将数据 */
  132. private setEnemyBattleGenerals() {
  133. g.battleData.enemyBattleGenerals = [];
  134. let generals = g.battleData.enemyGenerals.concat();
  135. if (!generals.length) {
  136. g.battleData.enemyBattleGenerals.push({ id: g.battleData.enemyID, lv: g.battleData.enemyLv, nickName: g.battleData.enemyName, avator: g.battleData.enemyAvator });
  137. for (let j = 0; j < g.battleData.enemyFriendDatas.length; j++) {
  138. if (g.battleData.enemyBattleGenerals.length >= this.generalMaxNum) { return; }
  139. g.battleData.enemyBattleGenerals.push(g.battleData.enemyFriendDatas[j]);
  140. }
  141. } else {
  142. generals.sort((a: number, b: number): number => {
  143. return a > b ? -1 : 1;//优先最近战斗
  144. });
  145. for (let i = 0; i < generals.length; i++) {
  146. if (!i) {
  147. g.battleData.enemyBattleGenerals.push({ id: g.battleData.enemyID, lv: generals[i], nickName: g.battleData.enemyName, avator: g.battleData.enemyAvator });//主将
  148. for (let j = 0; j < g.battleData.enemyFriendDatas.length; j++) {
  149. if (g.battleData.enemyBattleGenerals.length >= this.generalMaxNum) { return; }
  150. g.battleData.enemyBattleGenerals.push(g.battleData.enemyFriendDatas[j]);
  151. }
  152. }
  153. else {
  154. if (g.battleData.enemyBattleGenerals.length >= this.generalMaxNum) { return; }
  155. g.battleData.enemyBattleGenerals.push({ id: 0, lv: generals[i], nickName: '', avator: '' });
  156. }
  157. }
  158. }
  159. }
  160. public async onStartButton() {
  161. this.ourTeamTween.play();
  162. this.enemyTeamTween.play();
  163. }
  164. /**开始动画结束 */
  165. private async startPlayerOver() {
  166. // let preFabsData = await ResourcesUtils.load<Prefab>("Prefabs/切磋神将");
  167. // var generalNode = instantiate(preFabsData);
  168. // generalNode.parent = this.node;
  169. this.generalNode.active = false;
  170. this.closeSprite.node.active = false;
  171. this.startHanedler.emit([]);
  172. }
  173. /**战斗动画结束 设置结算 */
  174. public async battleOver() {
  175. let result = await this.http.send("/api/battle/Battle", { battleKey: this.battleKey, isWin: g.battleData.isWin ? 1 : 0 });
  176. if (!result.code) {
  177. g.battleData.type = result.data.type;
  178. g.battleData.isWin = result.data.isWin;
  179. g.battleData.enemyName = result.data.enemyName;
  180. g.battleData.addMoney = result.data.addMoney;
  181. if (g.battleData.isWin && g.battleData.type == BattleType.ChallengeBattle) {
  182. g.gameData.hasBattleLogUpdate = true;
  183. }
  184. if (g.battleData.isWin && g.battleData.type == BattleType.FriendBattle) {
  185. g.gameData.hasBattleListUpdate = true;
  186. }
  187. if (g.battleData.isWin && g.battleData.type == BattleType.avengeBattle) {
  188. for (let i = 0; i < g.gameData.myAvengeDatas.length; i++) {
  189. let data = g.gameData.myAvengeDatas[i];
  190. if (data.attackUserID == g.battleData.enemyID) {
  191. g.gameData.myAvengeDatas.splice(i, 1);
  192. break;
  193. }
  194. }
  195. g.gameData.hasAvengeListUpdate = true;
  196. }
  197. WindowManager.open("Prefabs/Battle/BattleSettlementWindow", WindowOpenMode.NotCloseAndAdd);
  198. } else {
  199. WindowManager.showTips(g.CodeMsg[result.code]);
  200. }
  201. }
  202. }