/************************************************************************************ * FileName : UIChooseHero.ts * Description : 英雄选择界面UI * Version : v1.0.0 * CreateTime : 2024-11-01 15:21:45 * Author : * Copyright (c) 2024 * ============================================================== * Method Description: * * ============================================================== ************************************************************************************/ import {GameUILayers} from "db://assets/scripts/GameUILayers"; import {tgx_class} from "db://assets/core_tgx/base/ModuleContext"; import {ModuleDef} from "db://assets/scripts/ModuleDef"; import {tgxAudioMgr, tgxUIAlert, tgxUIController, tgxUITipsBar} from "db://assets/core_tgx/tgx"; import {director, instantiate, Label, Node, Prefab, sp, Sprite, SpriteFrame, Toggle, v3} from "cc"; import {UserMgr} from "db://assets/module_basic/scripts/UserMgr"; import {areanMgr} from "db://assets/module_arean/scripts/AreanManager"; import {ChooseHeroItem} from "db://assets/module_arean/ui_choose_hero/ChooseHeroItem"; import {Layout_UIChooseHero} from "db://assets/module_arean/ui_choose_hero/Layout_UIChooseHero"; import {ChooseSkinItem} from "db://assets/module_arean/ui_choose_hero/ChooseSkinItem"; import {resLoader} from "db://assets/core_tgx/base/utils/ResLoader"; import {CommonFun} from "db://assets/module_arean/scripts/CommonFun"; import {EHeroType, IServerHeroData} from "db://assets/module_basic/shared/protocols/public/arean/AreanTypeDef"; import {UserInfo} from "db://assets/module_basic/shared/types/UserInfo"; import {NetGameServer} from "db://assets/module_basic/scripts/NetGameServer"; import {AreanEvent} from "db://assets/module_arean/scripts/AreanNetMgr"; import {EMusicDefine} from "db://assets/module_basic/scripts/MusicDefine"; import { ISkinCfg } from "../../module_basic/shared/configs/interface/ISkinCfg"; import { IHeroCfg } from "../../module_basic/shared/configs/interface/IHeroCfg"; @tgx_class(ModuleDef.Arean) export class UIChooseHero extends tgxUIController{ // 当前选择的英雄ID private _chooseHeroId : number = null; // 选择的皮肤ID private _chooseSkinId : number = null; // 筛选条件节点 private _ConditionHeroNodes: Map = new Map(); // 当前选择的英雄类型 private _curChooseHeroType : EHeroType = EHeroType.None; private _userInfo: UserInfo = null; // 初始选择的英雄 private _defaultHeroId : number = null; constructor() { super("ui_choose_hero/ui_choose_hero", GameUILayers.POPUP,Layout_UIChooseHero) } // 计算默认的英雄和皮肤Id private _checkHeroIdAndSkinId() : void { let haveHeroData = this._userInfo.hero; let localHeroData = areanMgr.cfgMgr.HeroDatas.getAllDataMap(); // let showHeroData : number[] = []; // let len = haveHeroData.length; // for (let i = 0; i < len; i++) { // let heroData = haveHeroData[i]; // let heroId : number = heroData.heroId; // if(localHeroData.get(heroId).arms === this._curChooseHeroType || this._curChooseHeroType === EHeroType.None){ // showHeroData.push(heroId); // } // } this._defaultHeroId = this._chooseHeroId = UserMgr.inst.userInfo.heroId || 1001; this._chooseSkinId = null; if(this._chooseHeroId !== null){ let localSkinData : ISkinCfg[] = CommonFun.getInstance().getChooseHeroAllSkin(this._chooseHeroId,areanMgr.cfgMgr.SkinData.getAllData()); let data = localSkinData.find((v)=> v.isDefault === 1); this._chooseSkinId = data.id; } } protected async onCreated(params: any) { let layout: Layout_UIChooseHero = this.layout as Layout_UIChooseHero; this._userInfo = await UserMgr.inst.rpc_GetUserInfo(UserMgr.inst.userId); this._checkHeroIdAndSkinId(); this.onButtonEvent(layout.btnClose, () => { tgxAudioMgr.inst.playCommonBtn(EMusicDefine.EFFECT_CLOSE); this.close(); }) this.onButtonEvent(layout.btnSureHero, () => { tgxAudioMgr.inst.playCommonBtn(EMusicDefine.EFFECT_CLICK); this._repChooseHeroFight(); }) this.onButtonEvent(layout.mingYunItem, () => { tgxAudioMgr.inst.playCommonBtn(EMusicDefine.EFFECT_OPEN); this._openMingYunLayer(); }) this.onButtonEvent(layout.bigSkillItem, () => { tgxAudioMgr.inst.playCommonBtn(EMusicDefine.EFFECT_OPEN); this._openBigSkillLayer(); }) for (let i: number = 0; i < 5; i++) { let toggle: Toggle = layout.heroToggleGroup.getChildByName(`Toggle${i + 1}`).getComponent(Toggle); let attr: { tag: EHeroType } = { tag: i } toggle.node.attr(attr); this._ConditionHeroNodes.set(i, toggle.node); toggle.node.on('toggle', (target: Toggle) => { tgxAudioMgr.inst.playCommonBtn(EMusicDefine.EFFECT_CLICK); //@ts-ignore this._changeHeroToggleChecked(target.node.tag) }, this); } this._init(); } private _init() { this._updateHeroScrollView(); this._updateSkinScrollView(); this._initHeroIcon(); this._updateTopData(); this._updateHeroSpine(); } // 命运界面 private _openMingYunLayer() : void{ let chooseHeroId = this._chooseHeroId; tgxUIAlert.show("研发团队加班中,敬请期待!"); } // 大招界面 private _openBigSkillLayer() : void{ let chooseHeroId = this._chooseHeroId; tgxUIAlert.show("研发团队加班中,敬请期待!"); } // 确认选择的英雄和皮肤 private async _repChooseHeroFight() { console.log(`当前选择的英雄ID == ${this._chooseHeroId},皮肤ID == ${this._chooseSkinId} `); if(this._defaultHeroId == this._chooseHeroId){ tgxUITipsBar.show("当前使用的英雄和选择的英雄一致"); this.close(); return; } let ret = await NetGameServer.inst.conn.callApi('lobby/hero/UpdateHeroId', {heroId: this._chooseHeroId}); UserMgr.inst.userInfo.heroId = this._chooseHeroId; director.emit(AreanEvent.ChangeHero,{uid : UserMgr.inst.userInfo.uid}); this.close(); tgxUITipsBar.show("选择成功"); } // 刷新英雄toggle状态 private _changeHeroToggleChecked(uiName: EHeroType) { this._ConditionHeroNodes.forEach((node : Node,_name : EHeroType)=>{ let choose : Node = node.getChildByName("Checkmark"); choose.active = _name === uiName; }) if(this._curChooseHeroType === uiName) return; this._curChooseHeroType = uiName; this._checkHeroIdAndSkinId(); this._updateHeroScrollView(); this._updateSkinScrollView(); this._initHeroIcon(); } private _updateHeroSpine() : void{ let layout: Layout_UIChooseHero = this.layout as Layout_UIChooseHero; let localHeroData = areanMgr.cfgMgr.HeroDatas.getAllDataMap(); let curHeroData = localHeroData.get(this._chooseHeroId); if(curHeroData){ let skin = curHeroData.skinRes[0]; let skinId = areanMgr.cfgMgr.SkinData.getData(skin).icon resLoader.load(ModuleDef.Arean,`res/Prefebs/heroSpine/${skinId}`,(err: Error, prefab: Prefab) => { if(err){ console.error(err); return; }else { let spineNode = instantiate(prefab); layout.heroSpineNode.destroyAllChildren(); layout.heroSpineNode.addChild(spineNode); } }) }else { console.error(`${UserMgr.inst.userInfo.heroId}英雄数据不存在`); } } // 刷新英雄列表 private _updateHeroScrollView() : void{ let layout : Layout_UIChooseHero = this.layout as Layout_UIChooseHero; let content : Node = layout.heroScroll.content; content.destroyAllChildren(); let localHeroData = areanMgr.cfgMgr.HeroDatas.getAllDataMap(); let haveHeroData : IServerHeroData[] = this._userInfo.hero; let len : number = haveHeroData.length; for(let i : number = 0; i < len; i++){ let v : IHeroCfg = localHeroData.get(haveHeroData[i].heroId); let isShow = this._curChooseHeroType === EHeroType.None || this._curChooseHeroType === v.arms; let item : Node = instantiate(layout.chooseHeroCell); item.active = isShow; content.addChild(item); let comp : ChooseHeroItem = item.getComponent(ChooseHeroItem); comp.initData(v,this._chooseUseHeroId.bind(this)); comp.updateChooseActive(v.id === this._chooseHeroId); } } // 选择的英雄id private _chooseUseHeroId(id : number) : void{ this._chooseHeroId = id; let layout : Layout_UIChooseHero = this.layout as Layout_UIChooseHero; let content : Node = layout.heroScroll.content; let children : Node[] = content.children; let len : number = children.length; for (let i = 0; i < len; i++) { let element = children[i]; let comp : ChooseHeroItem = element.getComponent(ChooseHeroItem); comp.updateChooseActive(false); } let localSkinData : ISkinCfg[] = CommonFun.getInstance().getChooseHeroAllSkin(this._chooseHeroId,areanMgr.cfgMgr.SkinData.getAllData()); this._chooseSkinId = localSkinData.find((v)=> v.isDefault === 1).id; this._updateSkinScrollView(); this._initHeroIcon(); this._updateTopData(); this._updateHeroSpine(); } // 命运 private _updateMingYun() : void{ let layout : Layout_UIChooseHero = this.layout as Layout_UIChooseHero; let mingYunNode : Node = layout.mingYunItem.node; let curHeroData = areanMgr.cfgMgr.HeroDatas.getData(this._chooseHeroId); if(curHeroData){ let destinyId : number = curHeroData.fateId; let destinyData = areanMgr.cfgMgr.FateDatas.getData(destinyId); let sp : SpriteFrame = resLoader.getSpriteFrame(`res/Image/DestinyIcon/destiny_${destinyData.id}`,ModuleDef.Arean); if(sp) mingYunNode.getChildByName("icon").getComponent(Sprite).spriteFrame = sp; mingYunNode.getChildByName("lab2").getComponent(Label).string = `${destinyData.fateName}`; } } // 大招 private _updateBigSkill() : void{ let layout : Layout_UIChooseHero = this.layout as Layout_UIChooseHero; let bigSKillNode : Node = layout.bigSkillItem.node; let curHeroData = areanMgr.cfgMgr.HeroDatas.getData(this._chooseHeroId); if(curHeroData){ let skillData = areanMgr.cfgMgr.SkillPerformanceDatas.getData(curHeroData.mainSkill[0]); let sp : SpriteFrame = resLoader.getSpriteFrame(`res/skill/${skillData.icon}`,ModuleDef.Arean); if(sp) bigSKillNode.getChildByName("icon").getComponent(Sprite).spriteFrame = sp; bigSKillNode.getChildByName("lab2").getComponent(Label).string = `${skillData.skillname}`; } } // 英雄Item private _updateHeroItem() : void{ let layout : Layout_UIChooseHero = this.layout as Layout_UIChooseHero; let heroItemNode : Node = layout.heroItem.node; // let sp : SpriteFrame = resLoader.getSpriteFrame(`res/heroImg/${this._chooseHeroId}`,ModuleDef.Arean); // if(sp) heroItemNode.getChildByName("icon").getComponent(Sprite).spriteFrame = sp; let localHeroData = areanMgr.cfgMgr.HeroDatas.getAllDataMap(); let curHeroData = localHeroData.get(this._chooseHeroId); if(curHeroData){ let skin = curHeroData.skinRes[0]; let skinId = areanMgr.cfgMgr.SkinData.getData(skin).icon resLoader.load(ModuleDef.Arean,`res/Prefebs/heroSpine/${skinId}`,(err: Error, prefab: Prefab) => { if(err){ console.error(err); return; }else { let spineNode = instantiate(prefab); heroItemNode.getChildByName("icon").destroyAllChildren(); heroItemNode.getChildByName("icon").addChild(spineNode); spineNode.scale = v3(0.65,0.65,1); spineNode.position = v3(0,-60,0); spineNode.getComponent(sp.Skeleton).animation = null; } }) }else { console.error(`${UserMgr.inst.userInfo.heroId}英雄数据不存在`); } heroItemNode.getChildByName("lab").getComponent(Label).string = `${curHeroData.name}`; } // 皮肤Item private _updateSkinItem() : void{ let layout : Layout_UIChooseHero = this.layout as Layout_UIChooseHero; let skinItemNode : Node = layout.skinItem.node; let sp : SpriteFrame = resLoader.getSpriteFrame(`res/Image/SkinIcon/skinIcon_${this._chooseSkinId}`,ModuleDef.Arean); if(sp) skinItemNode.getChildByName("icon").getComponent(Sprite).spriteFrame = sp; skinItemNode.getChildByName("lab").getComponent(Label).string = `${this._chooseHeroId}皮肤`; } // 刷新顶部数据 private _updateTopData() : void{ if(this._chooseHeroId){ this._updateMingYun(); this._updateBigSkill(); this._updateSkinItem(); this._updateHeroItem(); } } // 刷新英雄列表 private _updateSkinScrollView() : void{ // let layout : Layout_UIChooseHero = this.layout as Layout_UIChooseHero; // let content : Node = layout.skinScroll.content; // content.destroyAllChildren(); // let localSkinData : ISkinCfg[] = areanMgr.cfgMgr.SkinData.getAllData(); // let haveSkinData : ISkinCfg[] = CommonFun.getInstance().getChooseHeroAllSkin(this._chooseHeroId,areanMgr.cfgMgr.SkinData.getAllData()); // let len : number = haveSkinData.length; // for(let i : number = 0; i < len; i++){ // let v : ISkinCfg = haveSkinData[i]; // let item : Node = instantiate(layout.chooseSkinCell); // item.active = true; // content.addChild(item); // let comp : ChooseSkinItem = item.getComponent(ChooseSkinItem); // comp.initData(v,this._chooseUseSkinId.bind(this)); // comp.updateChooseActive(i === 0); // } } // 选择的英雄id private _chooseUseSkinId(id : number) : void{ this._chooseSkinId = id; let layout : Layout_UIChooseHero = this.layout as Layout_UIChooseHero; let content : Node = layout.skinScroll.content; let children : Node[] = content.children; let len : number = children.length; for (let i = 0; i < len; i++) { let element = children[i]; let comp : ChooseSkinItem = element.getComponent(ChooseSkinItem); comp.updateChooseActive(false); } } private _initHeroIcon() : void{ let layout : Layout_UIChooseHero = this.layout as Layout_UIChooseHero; // let sp : SpriteFrame = resLoader.getSpriteFrame(`res/Image/SkinIcon/skinIcon_${this._chooseSkinId}`,SpriteFrame,ModuleDef.Arean); // if(sp) layout.chooseHeroIcon.getComponent(Sprite).spriteFrame = sp; // layout.chooseHeroIcon.active = sp !== null; let curHeroData = areanMgr.cfgMgr.HeroDatas.getAllDataMap().get(this._chooseHeroId); if(curHeroData){ layout.heroNameRich.string = curHeroData.name; let skinData = areanMgr.cfgMgr.SkinData.getData(curHeroData.skinRes[0]); if(skinData){ layout.skinNameRich.string = skinData.name; } } } }