import { _decorator, Component, Node, Label, EventHandler, Sprite, Prefab, instantiate, SpriteFrame, ImageAsset, Texture2D } from 'cc'; import { Http } from '../../core/net/Http'; import { ResourcesUtils } from '../../core/resourceManager/ResourcesUtils'; import { UITween } from '../../core/ui/tween/UITween'; import { WindowManager } from '../../core/ui/window/WindowManager'; import { WindowOpenMode } from '../../core/ui/window/WindowOpenMode'; import { g } from '../../Data/g'; import { ISJSB } from '../../Data/platform'; import { SoundSystem } from '../../Main/SoundSystem'; import { BattleRole, BattleRoleState } from './BattleRole'; import { BattleType } from './BattleUIWindow'; const { ccclass, property } = _decorator; /**切磋战斗准备 */ @ccclass('BattleWindow') export class BattleWindow extends Component { @property({ type: Http, tooltip: "消息控制" }) http: Http; @property({ type: UITween, tooltip: "开始动画" }) ourTeamTween: UITween; @property({ type: UITween, tooltip: "开始动画" }) enemyTeamTween: UITween; @property({ type: Label, tooltip: "剩余次数文本" }) numsLabel: Label; @property({ type: Node, tooltip: "准备时UI" }) generalNode: Node; @property({ type: Sprite, tooltip: "我方头像" }) ourHeadSprite: Sprite; @property({ type: Sprite, tooltip: "敌方头像" }) enemyHeadSprite: Sprite; @property({ type: EventHandler, tooltip: "开始对战回调" }) startHanedler: EventHandler; @property({ type: [Node], tooltip: "我方神将组" }) ourGeneralsGroup: Node[] = []; @property({ type: [Node], tooltip: "敌方神将组" }) enemyGeneralsGroup: Node[] = []; @property({ type: Sprite, tooltip: "返回图片" }) closeSprite: Sprite; @property({ tooltip: "单方最多出战神将数" }) generalMaxNum: number = 50; @property({ type: Label, tooltip: "我方队伍人数文本" }) ourNumLabel: Label; private battleKey: string; //战斗类型0表示随机,1表示好友,2表示复仇,3表示挑战 start() { this.numsLabel.node.active = !(g.battleData.type == BattleType.avengeBattle); SoundSystem.play(1); } update() { if (g.gameData.hasBattleOver) { g.gameData.hasBattleOver = false; g.gameData.hasBattleOverRefresh = true; WindowManager.close(); } } onDestroy() { SoundSystem.play(0); } /**窗口打开回调 设置战斗准备数据*/ public async openHandler(data: any) { if (ISJSB) { if (g.userData.avator) { let img = await ResourcesUtils.loadRemote(g.userData.avator, { ext: ".png" }, this); const spriteFrame = new SpriteFrame(); const texture = new Texture2D(); texture.image = img; spriteFrame.texture = texture; this.ourHeadSprite.spriteFrame = spriteFrame; } if (g.battleData.enemyAvator) { let img = await ResourcesUtils.loadRemote(g.battleData.enemyAvator, { ext: ".png" }, this); const spriteFrame = new SpriteFrame(); const texture = new Texture2D(); texture.image = img; spriteFrame.texture = texture; this.enemyHeadSprite.spriteFrame = spriteFrame; } } this.setOurBattleGenerals(); this.setEnemyBattleGenerals(); this.battleKey = g.battleData.battleKey; this.numsLabel.node.active = data.type != BattleType.avengeBattle; this.numsLabel.string = '今日剩余次数:' + (g.gameData.RemainderAddTimes + g.gameData.RemainderHadAddTimes + g.gameData.battleRemainder); for (let i = 0; i < this.ourGeneralsGroup.length; i++) { if (i < g.battleData.ourBattleGenerals.length) { this.ourGeneralsGroup[i].getComponent(BattleRole).setData(g.battleData.ourBattleGenerals[i], BattleRoleState.Ready); this.ourGeneralsGroup[i].active = true; } } for (let i = 0; i < this.enemyGeneralsGroup.length; i++) { if (i < g.battleData.enemyBattleGenerals.length) { this.enemyGeneralsGroup[i].getComponent(BattleRole).setData(g.battleData.enemyBattleGenerals[i], BattleRoleState.Ready, false); this.enemyGeneralsGroup[i].active = true; } } } /**设置我方参战神将数据 */ private setOurBattleGenerals() { g.battleData.ourBattleGenerals = []; let generals = g.gameData.getMyLocalData(g.userData.id).myLocalGenerals; if (!generals.length) { g.battleData.ourBattleGenerals.push({ id: g.userData.id, lv: g.userData.lv, nickName: g.userData.nickName, avator: g.userData.avator }); for (let j = 0; j < g.battleData.myFriendDatas.length; j++) { if (g.battleData.ourBattleGenerals.length <= this.generalMaxNum) { g.battleData.ourBattleGenerals.push(g.battleData.myFriendDatas[j]); } } } else { generals.sort((a: any, b: any): number => { return a.lv > b.lv ? -1 : 1;//优先最近战斗 }); for (let i = 0; i < generals.length; i++) { if (!i) { g.battleData.ourBattleGenerals.push({ id: g.userData.id, lv: generals[i].generalLv, nickName: g.userData.nickName, avator: g.userData.avator });//主将 for (let j = 0; j < g.battleData.myFriendDatas.length; j++) { if (g.battleData.ourBattleGenerals.length <= this.generalMaxNum) { g.battleData.ourBattleGenerals.push(g.battleData.myFriendDatas[j]); } } } else { if (g.battleData.ourBattleGenerals.length <= this.generalMaxNum) { g.battleData.ourBattleGenerals.push({ id: 0, lv: generals[i].generalLv, nickName: '', avator: '' }); } } } } let ourNum = g.battleData.ourBattleGenerals.length; ourNum = ourNum || 1; this.ourNumLabel.string = ourNum + '人'; } /**设置敌方参战神将数据 */ private setEnemyBattleGenerals() { g.battleData.enemyBattleGenerals = []; let generals = g.battleData.enemyGenerals.concat(); if (!generals.length) { g.battleData.enemyBattleGenerals.push({ id: g.battleData.enemyID, lv: g.battleData.enemyLv, nickName: g.battleData.enemyName, avator: g.battleData.enemyAvator }); for (let j = 0; j < g.battleData.enemyFriendDatas.length; j++) { if (g.battleData.enemyBattleGenerals.length >= this.generalMaxNum) { return; } g.battleData.enemyBattleGenerals.push(g.battleData.enemyFriendDatas[j]); } } else { generals.sort((a: number, b: number): number => { return a > b ? -1 : 1;//优先最近战斗 }); for (let i = 0; i < generals.length; i++) { if (!i) { g.battleData.enemyBattleGenerals.push({ id: g.battleData.enemyID, lv: generals[i], nickName: g.battleData.enemyName, avator: g.battleData.enemyAvator });//主将 for (let j = 0; j < g.battleData.enemyFriendDatas.length; j++) { if (g.battleData.enemyBattleGenerals.length >= this.generalMaxNum) { return; } g.battleData.enemyBattleGenerals.push(g.battleData.enemyFriendDatas[j]); } } else { if (g.battleData.enemyBattleGenerals.length >= this.generalMaxNum) { return; } g.battleData.enemyBattleGenerals.push({ id: 0, lv: generals[i], nickName: '', avator: '' }); } } } } public async onStartButton() { this.ourTeamTween.play(); this.enemyTeamTween.play(); } /**开始动画结束 */ private async startPlayerOver() { // let preFabsData = await ResourcesUtils.load("Prefabs/切磋神将"); // var generalNode = instantiate(preFabsData); // generalNode.parent = this.node; this.generalNode.active = false; this.closeSprite.node.active = false; this.startHanedler.emit([]); } /**战斗动画结束 设置结算 */ public async battleOver() { let result = await this.http.send("/api/battle/Battle", { battleKey: this.battleKey, isWin: g.battleData.isWin ? 1 : 0 }); if (!result.code) { g.battleData.type = result.data.type; g.battleData.isWin = result.data.isWin; g.battleData.enemyName = result.data.enemyName; g.battleData.addMoney = result.data.addMoney; if (g.battleData.isWin && g.battleData.type == BattleType.ChallengeBattle) { g.gameData.hasBattleLogUpdate = true; } if (g.battleData.isWin && g.battleData.type == BattleType.FriendBattle) { g.gameData.hasBattleListUpdate = true; } if (g.battleData.isWin && g.battleData.type == BattleType.avengeBattle) { for (let i = 0; i < g.gameData.myAvengeDatas.length; i++) { let data = g.gameData.myAvengeDatas[i]; if (data.attackUserID == g.battleData.enemyID) { g.gameData.myAvengeDatas.splice(i, 1); break; } } g.gameData.hasAvengeListUpdate = true; } WindowManager.open("Prefabs/Battle/BattleSettlementWindow", WindowOpenMode.NotCloseAndAdd); } else { WindowManager.showTips(g.CodeMsg[result.code]); } } }