123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142 |
- import { _decorator, Button, Component, isValid, Label, Node, Sprite, Widget } from 'cc';
- import { ModuleDef } from '../../scripts/ModuleDef';
- import { GameUILayers } from '../../scripts/GameUILayers';
- import { UserMgr } from '../scripts/UserMgr';
- import { LobbyMgr } from '../scripts/LobbyMgr';
- import { GameSceneUtil } from '../scripts/GameSceneUtil';
- import { UIGameMatching } from '../ui_game_matching/UIGameMatching';
- import { UserLocalCache } from '../scripts/UserLocalCache';
- const { ccclass, property } = _decorator;
- /**
- * @en Layout component is used to mount on the root node of the UI corresponding to the Prefab, and declare a series of property references for tgxUIController to call.
- * @zh Layout 组件用于挂载到UI对应的Prefab根节点,并声明一系列 property 引用,供 tgxUIController 调用。
- */
- @ccclass('UITeam')
- export class Layout_UITeam extends Component {
- @property(Button) btnClose: Button;
- @property(Label) lblTeam: Label;
- @property(Sprite) sprIcon: Sprite;
- @property(Label) lblUserName: Label;
- @property(Label) roleName: Label;
- @property(Label) lblTips: Label;
- @property(Button) btnMatch: Button;
- @property(Button) btnRandomName: Button;
- @property([Button]) playerSlots: Button[] = [];
- }
- @tgx_class(ModuleDef.BASIC)
- export class UITeam extends tgx.UIController {
- constructor() {
- super('ui_team/ui_team', GameUILayers.POPUP, Layout_UITeam);
- }
- public get layout(): Layout_UITeam {
- return this._layout as Layout_UITeam;
- }
- protected async onCreated(args: any) {
- this.layout.lblTeam.string = UserMgr.inst.name + '的队伍';
- await UserMgr.inst.setUserIconAndName(UserMgr.inst.uid, this.layout.sprIcon, this.layout.lblUserName, ModuleDef.BASIC);
- this.layout.lblUserName.updateRenderData(true);
- this.layout.lblUserName.node.children.forEach(v=>{
- v.getComponent(Widget).updateAlignment();
- });
- for (let i = 0; i < this.layout.playerSlots.length; ++i) {
- this.onButtonEvent(this.layout.playerSlots[i], () => {
- tgx.UIAlert.show('功能暂未开放!');
- });
- }
- this.onButtonEvent(this.layout.btnClose,async ()=>{
- //@en if matching, need to cancel before closing
- //@zh 如果正在匹配中,则需要取消匹配
- if(this.isMatching){
- let ret = await LobbyMgr.inst.rpc_QuickPlayCancel();
- if(ret.isSucc){
- this.close();
- }
- }
- else{
- this.close();
- }
- });
-
- this.onButtonEvent(this.layout.btnRandomName,()=>{
- this.layout.roleName.string = UserMgr.inst.getRandomName(true);
- });
- this.onButtonEvent(this.layout.btnMatch,()=>{
- this._startMatchTime = Date.now();
- this.startMatch('normal');
- });
- this.layout.lblTips.node.active = false;
- this.layout.roleName.string = UserLocalCache.inst.getRoleName(UserMgr.inst.uid);
- }
- protected onUpdate(dt: number): void {
- if (this._startMatchTime > 0) {
- let elapsedTime = Math.floor((Date.now() - this._startMatchTime) / 1000);
- if (elapsedTime < 60) {
- this.layout.lblTips.string = '匹配中... ' + elapsedTime + 's';
- }
- else {
- let s = elapsedTime % 60;
- let m = Math.floor(elapsedTime / 60);
- this.layout.lblTips.string = '匹配中... ' + m + 'm' + s + 's';
- }
- }
- }
- private _startMatchTime = 0;
- private get isMatching(){
- return this._startMatchTime > 0;
- }
- async startMatch(type: string) {
- this.layout.btnMatch.node.active = false;
- this.layout.lblTips.node.active = true;
- let ret = await LobbyMgr.inst.rpc_QuickPlay(type);
- if(!isValid(this.node)){
- //@en if the node has been destroyed, it means the match has been canceled halfway
- //@zh 如果节点已被销毁,表示中途取消了匹配
- return;
- }
- if (!ret.isSucc) {
- tgx.UIAlert.show('未找到适合的对手');
- this.layout.btnMatch.node.active = true;
- this.layout.lblTips.node.active = false;
- this._startMatchTime = 0;
- }
- else {
- //@en inactive btnClose to forbidden users close this UI at the moment
- //@zh 禁用 btnClose,用户不能在此时关闭此界面
- this.layout.btnClose.node.active = false;
-
- //@en enter game and show the waiting UI.
- //@zh 进入游戏,并显示等待其他玩家界面
- let params = ret.res;
- tgx.UIMgr.inst.showUI(UIGameMatching,async (ui:UIGameMatching)=>{
- let ret = await GameSceneUtil.inst.enterGame(params, true);
- if(!ret.isSucc){
- //@en close matching ui, and restart to match
- //@zh 关闭面板,重新开始匹配
- ui.close();
- this.layout.btnClose.node.active = true;
- this.startMatch('normal');
- }
- else{
- this.close();
- }
- });
- }
- }
- }
|