import { Badminton } from "../Badminton/Badminton"; import { AvatarColor, AvatarData, MemberData } from "../Badminton/MemberData"; import UIPanel from "../Engine/Component/UIPanel/UIPanel"; import { RandomEx } from "../Engine/Utils/Number/RandomEx"; const { ccclass, property } = cc._decorator; /** AvatarPanel */ @ccclass export default class AvatarPanel extends UIPanel { //#region property @property({ type: cc.Prefab }) public BtnItem: cc.Prefab = null; @property({ type: cc.Node }) public ItemContent: cc.Node = null; @property({ type: cc.Node }) public InfoView: cc.Node = null; @property({ type: cc.Sprite }) public BG: cc.Sprite = null; //#endregion //#region public public Main: Badminton = null; //#endregion //#region private private _m_currentMember: MemberData = null; private _avatars: AvatarData[] = null; private _m_currentIndex: number = null; //#endregion //#region Lifecycle protected ImplementInitial(...initData: any[]): void { let self: this = this; this.Main = initData[0]; this._avatars = this.Main.Config.Avatars; let btnItem: cc.Node = cc.instantiate(this.BtnItem); btnItem.active = false; // 載入兔兔設定 更新UI let container: cc.Node = this.ItemContent; for (let i: number = container.childrenCount - 1; i >= 0; i--) { let obj: cc.Node = container.children[i]; if (obj !== btnItem) { obj.destroy(); } } for (let i: number = 0; i < this._avatars.length; i++) { let data: AvatarData = this._avatars[i]; if (data.color !== AvatarColor.Pink && data.color !== AvatarColor.None) { continue; } let item: cc.Node = container.ExAddChild(btnItem); item.Find("Avatar/Pic").getComponent(cc.Sprite).spriteFrame = data.Pic; item.Find("Avatar/BG").getComponent(cc.Sprite).spriteFrame = data.BG; item.Find("Avatar").on("click", () => { self._showAvatarInfoById(i); }); item.active = true; } } protected *ImplementReadyShow(...param: any[]): IterableIterator { this._m_currentMember = param[0]; } protected *ImplementShow(): IterableIterator { if (this._m_currentMember != null) { let index: number = 0; for (let i: number = 0; i < this._avatars.length; i++) { if (this._m_currentMember.AvatarId === this._avatars[i].ID) { index = i; break; } } this._showAvatarInfoById(index); } this.Main.Lobby.Close(); } protected *ImplementHide(...param: any[]): IterableIterator { yield* this.Main.Lobby.Show(); } //#endregion //#region Custom private _getNextColorAvatarIndex(index: number): number { if (index < 0 || index >= this._avatars.length) { return 0; } let cur: AvatarData = this._avatars[index]; for (let i: number = 0; i < this._avatars.length; i++) { let data: AvatarData = this._avatars[i]; if (data.Model === cur.Model && data.color !== cur.color) { return i; } } return 0; } private _showAvatarInfoById(index: number): void { if (index < 0 || index >= this._avatars.length) { return; } let data: AvatarData = this._avatars[index]; this.BG.spriteFrame = data.BG; this.InfoView.Find("Image").getComponent(cc.Sprite).spriteFrame = data.BigPic != null ? data.BigPic : data.Pic; this.InfoView.Find("Title/Text").getComponent(cc.Label).string = data.Name; this.InfoView.Find("Text").getComponent(cc.Label).string = data.Desc; this._m_currentIndex = index; } public OnClickNextColor(): void { this._showAvatarInfoById(this._getNextColorAvatarIndex(this._m_currentIndex)); } public OnClickConfirm(): void { let data: AvatarData = this._avatars[this._m_currentIndex]; if (data.Model <= 0) { // let list = this._avatars.FindAll(a => a.model > 0); // let list: any[] = this._avatars.map(a => { // if (a.Model > 0) { // return Object.values(a)[0]; // } // }).filter(item => item); let list: AvatarData[] = this._avatars.filter(item => item.Model > 0); data = list[RandomEx.GetInt(0, list.length)]; } this._m_currentMember.AvatarId = data.ID; this.Main.ReloadUI(); this.Close(); } //#endregion }