import { _decorator, Component, Label, director, Node, Button, instantiate, Sprite, Prefab, v3, SpriteFrame } from 'cc'; import {tgxAudioMgr, tgxSceneUtil, tgxUIAlert, tgxUIMgr} from '../../core_tgx/tgx'; import { RoomEvent } from '../../module_basic/scripts/GameMgr'; import { UserMgr } from '../../module_basic/scripts/UserMgr'; import { SceneDef } from '../../scripts/SceneDef'; import { GamePlayerInfo } from './GamePlayerInfo'; import { AreanEvent, AreanNetMgr } from './AreanNetMgr'; import {SubGameMgr} from "db://assets/module_basic/scripts/SubGameMgr"; import { EMusicDefine } from '../../module_basic/scripts/MusicDefine'; import { EFightModel } from '../../module_basic/shared/protocols/public/arean/AreanTypeDef'; import { UserLocalCache } from '../../module_basic/scripts/UserLocalCache'; import {IUserData} from "db://assets/module_basic/shared/types/RoomData"; import {areanMgr} from "db://assets/module_arean/scripts/AreanManager"; import {resLoader} from "db://assets/core_tgx/base/utils/ResLoader"; import {ModuleDef} from "db://assets/scripts/ModuleDef"; import {CommonFun} from "db://assets/module_arean/scripts/CommonFun"; import {MsgUserComesToRoomPush} from "db://assets/module_basic/shared/protocols/public/MsgUserComesToRoomPush"; import {IDanCfg} from "db://assets/module_basic/shared/configs/interface/IDanCfg"; const { ccclass, property } = _decorator; @ccclass('AreanGameHUD') export class AreanGameHUD extends Component { //#endregion @property(Label) tips: Label = null!; @property(Button) btnReady: Button; @property(Node) watcherList: Node; @property(Label) lblRoomId: Label; @property([GamePlayerInfo]) public players: GamePlayerInfo[] = []; //#endregion //#region 组件第一次激活前执行,也就是第一次执行 update 之前触发 start() { if (!UserMgr.inst.uid) { tgxSceneUtil.loadScene(SceneDef.START); return; } tgxUIMgr.inst.closeAll(); director.on(AreanEvent.ChangeHero,this._changeHeroResult.bind(this),this) if (UserLocalCache.inst.fightModel == EFightModel.Room) { this.lblRoomId.string = AreanNetMgr.inst.data.displayId; } else { this.lblRoomId.string = ''; } for (let i = 0; i < this.players.length; i++) { let player = this.players[i]; player.setUserId(''); player.setSeatIndex(i); } let userList = AreanNetMgr.inst.data.userList; console.log("当前房间的所有玩家信息 === ",userList); for (let i = 0; i < AreanNetMgr.inst.data.userList.length; i++) { let userData : IUserData = AreanNetMgr.inst.data.userList[i]; this.initUser(userData,false); } this.initWatcherList(); this.updateCtrlUI(); this.initEventListener(); this.updateReadyBtn(); } //#endregion private _getCurRoomPlayer(uid : string){ let userData : IUserData[] = AreanNetMgr.inst.data.userList; return userData.find(p => p.uid == uid); } //#region 用户信息初始化 initUser(userData: IUserData, isLeaves: boolean) { console.log('initUser:', userData); let play = this.players.find(p => p._userId == userData.uid); let u : IUserData = AreanNetMgr.inst.selfUser; if(!u) return; if ( u.uid == userData.uid) { console.log('我自己selfUser:', u); this.players[0].node.active = true; this.players[0].setUserId(userData.uid); this._getHeroSpine(userData.uid,this.players[0].icon,this.players[0].danIcon).then(); this.players[0].setOpenChooseHero(this._openChooseHeroLayer.bind(this)); // this.btnReady.node.active = u && u.playerId && !u.ready; }else{ if (play) { if (isLeaves) { play.setUserId(''); } else { play.setUserId(userData.uid); this._getHeroSpine(userData.uid,play.icon,this.players[0].danIcon).then(); } } else { // 房主 if(userData.seatIndex === 0){ play = this.players[3]; play.updateBg() play.updateHomeOwnerActive(true); }else{ play = this.players.find(p => p._userId == '' && p.seatIndex != 0); } if (!isLeaves) { play.setUserId(userData.uid); this._getHeroSpine(userData.uid,play.icon,this.players[0].danIcon).then(); } } } } //#endregion //#region 开始注册监听事件 initEventListener() { director.getScene().on(RoomEvent.NEW_USER_COMES, this.onNewUserComes, this); director.getScene().on(RoomEvent.USER_LEAVES, this.onUserLeaves, this); director.getScene().on(RoomEvent.WATCHER_LIST_CHANGED, this.initWatcherList, this); director.getScene().on(RoomEvent.User_Make_Room, this.onUserMakeRoom, this); } onUserMakeRoom(){ console.log('转让房主') this.updateReadyBtn(); } protected onDestroy(): void { director.on(AreanEvent.ChangeHero,this._changeHeroResult.bind(this),this) } //#endregion onNewUserComes(data: MsgUserComesToRoomPush) { console.log('有人加入:', data); if (data) { let userData : IUserData = this._getCurRoomPlayer(data.uid); if(!userData){ console.warn("没有找到对应的玩家的信息,onNewUserComes",data.uid); return; } this.initUser(userData, false); } else { this.initWatcherList(); } } onUserLeaves(data) { console.log('有人离开:', data); if (data.isPlayer) { let userData : IUserData = this._getCurRoomPlayer(data.uid); if(!userData){ console.warn("没有找到对应的玩家的信息,onUserLeaves",data.uid); return; } this.initUser(userData, true); } else { this.initWatcherList(); } } async initWatcherList() { this.watcherList.parent.active = false; let usersData = AreanNetMgr.inst.data?.userList; // if (!AreanNetMgr.inst.gameMode || !usersData.length) { // return; // } this.watcherList.parent.active = true; for (let i = 0; i < this.watcherList.children.length; ++i) { this.watcherList.children[i].active = false; } let userIds = []; let c = this.watcherList.children[0]; for (let i = 0; i < usersData.length; ++i) { let u = usersData[i]; if (!u.playerId) { let newNode = instantiate(c); this.watcherList.addChild(newNode); userIds.push(u.uid); } } await UserMgr.inst.rpc_GetUserInfos(userIds); for (let i = 0; i < userIds.length; ++i) { let c = this.watcherList.children[i]; c.active = true; let icon = c.children[0].getComponent(Sprite); UserMgr.inst.setUserIconAndName(userIds[i], icon); } } updateCtrlUI() { console.log('updateCtrlUI 用户列表', AreanNetMgr.inst.data); // if (AreanNetMgr.inst.gameMode == EFightModel.SOLO) { // this.tips.string = '单人练习'; // } // else if (AreanNetMgr.inst.gameMode == GameMode.AI) { // this.tips.string = '人机对决'; // } // else if (AreanNetMgr.inst.isWatcher) { this.tips.string = '观战中...'; } else if (AreanNetMgr.inst.data.userList.length < 8) { this.tips.string = '等待对手加入...' } // else if (AreanNetMgr.inst.isMyTurn) { // this.tips.string = '该你击球...'; // } else { this.tips.string = '对手击球...'; } } protected updateReadyBtn() { let user = AreanNetMgr.inst.data.userList.find(p => p.uid == UserMgr.inst.uid); let str = "准备" if (user && user.seatIndex == 0) { str = "开始游戏" } this.btnReady.node.getChildByName("Label").getComponent(Label).string = str; this.btnReady.node.getChildByName("autoLab").active = user && user.seatIndex == 0; this.players[0].updateHomeOwnerActive(user && user.seatIndex == 0); } async onBtnEnterClicked() { tgxAudioMgr.inst.playCommonBtn(EMusicDefine.EFFECT_CLICK); let user = AreanNetMgr.inst.data.userList.find(p => p.uid == UserMgr.inst.uid); if (user && user.seatIndex == 0) { let res = await AreanNetMgr.inst.sendMsg_StartGame(); if (!res.res.isStarted) { tgxUIAlert.show("开始游戏失败,有玩家没准备"); } // tgxUIMgr.inst.showUI(UIBattleLoading) // //房主 // let res = await AreanNetMgr.inst.sendMsg_StartGame(); // if (!res.res.isStarted) { // tgxUIAlert.show("开始游戏失败,有玩家没准备"); // }else{ // } } else {///不是房主 SubGameMgr.gameMgr.rpc_Ready().then((ret=>{ if(ret.isSucc){ this.btnReady.node.active = false; } })); } } async onBtnExitClicked() { tgxAudioMgr.inst.playCommonBtn(EMusicDefine.EFFECT_CLOSE); if (AreanNetMgr.inst.isPlayer && AreanNetMgr.inst.isPlaying) { tgxUIAlert.show('确定要退出吗?', true).onClick(async (ok: Boolean) => { if (ok) { let ret = await AreanNetMgr.inst.rpc_LeaveRoom(); if (ret.isSucc) { tgxSceneUtil.loadScene(SceneDef.LOBBY_AREAN); } else { tgxUIAlert.show('不能离开'); } } }); } else { let ret = await AreanNetMgr.inst.rpc_LeaveRoom(); if (ret.isSucc || (ret.err.code == 'LOST_CONN' && ret.err.message == 'USER_LEAVE')) { tgxSceneUtil.loadScene(SceneDef.LOBBY_AREAN); } else { tgxUIAlert.show(ret.err.message); } } } private _openChooseHeroLayer() : void{ } /** 英雄spine */ private async _getHeroSpine(userId : string,icon: Sprite,danIcon: Sprite): Promise { } private _changeHeroResult(data : {uid : string}) : void{ } }