355 lines
16 KiB
TypeScript
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;
|
|
}
|
|
}
|
|
|
|
}
|
|
|
|
} |