squidGame/tgx-games-client/assets/module_arean/ui_choose_hero/UIChooseHero.ts

355 lines
16 KiB
TypeScript

/************************************************************************************
* 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<EHeroType, Node> = new Map<EHeroType, Node>();
// 当前选择的英雄类型
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<Prefab>(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<Prefab>(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;
}
}
}
}