import { _decorator, instantiate, isValid, Label, Node, PageView, Prefab, Sprite, UITransform, view } from 'cc'; import { GButton } from '../../Main/Common/GButton'; import AudioManager from '../../Main/Manager/AudioManager'; import Utils from '../../Main/Common/Utils'; import { ViewManager } from '../../Main/Manager/ViewManager'; import { InnerMsgCode } from '../../Main/Config/InnerMsgCode'; import li_BaseView from '../../Main/Common/li_BaseView'; import GameRootUI from '../../Main/Common/GameRootUI'; import ResManager from '../../Main/Manager/ResManager'; import HttpUnit from '../../Main/Common/HttpUnit'; import { SDKManager } from '../../Main/Channel/SDKManager'; import ScrollViewList from '../../Main/Common/ScrollViewList'; import GameManager, { E_TalkStage, E_TalkStatusType } from '../../Main/Manager/GameManager'; import { I_LevelConfig, I_NpcTalkBack } from '../../Main/Config/CommonConfig'; import SubManager from '../SubManager'; import { ByteDanceSDK } from '../../Main/Channel/bdSDK'; import GlobalValue from '../../Main/Common/GlobalValue'; import PlayerDataManager from '../../Main/Manager/PlayerDataManager'; import { E_AD_TARGET } from './TalkAdDialog'; const { ccclass, property } = _decorator; //主界面 @ccclass('Start_UI') export class Start_UI extends li_BaseView { @property(ScrollViewList) private Level_List: ScrollViewList = null @property(Prefab) private Level_Item: Prefab = null private itemClone: any = null @property(Prefab) private GuidePageItem: Prefab = null //引导选择角色页签 private guidePageView: PageView = null //引导选择角色页签容器 private _nodeTab: any = {}; private _data; private levelData: I_LevelConfig[] = []; //关卡数据 private curLevelIdx: number = 0; //当前关卡Idx private lvUnlockId: string = ""; //解锁关卡id //----重写父类接口--------------------------------------- onLoadCT() { this.registerListenner(); Utils.parseNode(this.node, this._nodeTab) this.itemClone = instantiate(this.Level_Item) this.Level_List.setTemplateItem(this.itemClone) this.guidePageView = this._nodeTab.guidePageView.getComponent(PageView) Utils.setString(this._nodeTab.labNpcName, "") Utils.setString(this._nodeTab.labNpcTalk, "") } openUIDataCT(data: any): void { this._data = data } registerListenner() { Utils.addInnerEL(InnerMsgCode.GM_UI_Close, this, this.resiveGMClose) Utils.addInnerEL(InnerMsgCode.UI_Talk_Back, this, this.resiveTalkBack) Utils.addInnerEL(InnerMsgCode.UI_BD_Sidebar, this, this.resiveBDSidebar) Utils.addInnerEL(InnerMsgCode.Data_BDSidebarReward, this, this.resiveBDSidebarReward) } start() { GButton.BandClick(this._nodeTab.btnStart, this.onStartClick, this, 10002); GButton.BandClick(this._nodeTab.btnKefu, this.onKefuClick, this); GButton.BandClick(this._nodeTab.btnAddTZCount, this.onAddTZClick, this); GButton.BandClick(this._nodeTab.tzCountNode, this.onAddTZClick, this); GButton.BandClick(this._nodeTab.btnSetting, this.onSettingClick, this); GButton.BandClick(this._nodeTab.btnBDSidebar, this.onBDSidebarClick, this); GButton.BandClick(this._nodeTab.btnGM, this.onGMClick, this); SDKManager.register_video_reward(this.node.uuid, (tag:number)=>{ console.log("视频广告回调", tag) if (tag == 1) { // 加次数 HttpUnit.ins.setUserAd({type:1}, (data) => { SubManager.ShowPrompt("观看视频成功,获得相亲次数") this.refreshXiangqinTicket() }) } else if (tag == 2) { // 解锁关卡 HttpUnit.ins.levelUnlock({level_id: this.lvUnlockId}, (data) => { // SubManager.ShowPrompt("关卡解锁成功") this.refreshLevelList() this.enterLevelAfterUnlock() }) } }) SDKManager.register_share_reward(this.node.uuid, (tag:number)=>{ console.log("分享回调", tag) if (tag == 1) { // 加次数 HttpUnit.ins.setUserShare({type:1}, (data) => { SubManager.ShowPrompt("分享成功,获得相亲次数") this.refreshXiangqinTicket() }) } }) AudioManager.I.PlayMusic(1, true) //背景乐 GameRootUI.InitDisableOperUI(false) GameRootUI.InitCrossUI(false) this.setUIVisible(true) // this._nodeTab.labStart2.active = false //快手去掉英文 //客服按钮 this._nodeTab.btnKefu.active = SDKManager.KefuSupport() //设置按钮 if (GlobalValue.GMSwtitch) { this._nodeTab.btnSetting.active = true this._nodeTab.btnGM.active = true } else { this._nodeTab.btnSetting.active = false this._nodeTab.btnGM.active = false } //抖音侧边栏 this._nodeTab.btnBDSidebar.active = false if (SDKManager.isByteDance()) { this.refreshBdSidebarUI() ByteDanceSDK.CheckSidebarState((state) =>{ if (state == true) { this.refreshBdSidebarUI() } }) } //重置引导 this.resetGuide() GameRootUI.DisableOper(2) //判断玩家权限是否已获取 if (!HttpUnit.IsLogin()) { HttpUnit.ins.login((loginData) => { console.log("主界面: 获取授权并登录成功!") this.userInited() }) } else { this.userInited() } } update(deltaTime: number) { } //GM界面关闭消息 resiveGMClose(data) { Utils.Log("收到GM界面关闭消息") } //退出聊天消息 resiveTalkBack(data) { Utils.Log("收到退出聊天消息") AudioManager.I.PlayMusic(1, true) //背景乐 this.setUIVisible(true) this.refreshLevelList() HttpUnit.ins.getUserData((userData) => { this.refreshXiangqinTicket() }) } //抖音侧边栏消息 resiveBDSidebar(data) { this.refreshBdSidebarUI() } //领取抖音侧边栏奖励消息 resiveBDSidebarReward(data) { this.refreshXiangqinTicket() } //增加相亲次数 private doAddXiangqinCnt(add:number = 1) { } //显示主界面UI setUIVisible(vis: boolean) { this._nodeTab.UIRoot.active = vis } //刷新抖音侧边栏按钮显示状态 refreshBdSidebarUI() { if (!SDKManager.isByteDance()) { //不是抖音平台,不显示 this._nodeTab.btnBDSidebar.active = false return } let stage = ByteDanceSDK.SidebarState if (stage == 1) { //前往 this._nodeTab.btnBDSidebar.active = true // Utils.setString(this._nodeTab.labBDSidebar, "前往抖音侧边栏") } else if (stage == 2) { //从侧边栏返回 this._nodeTab.btnBDSidebar.active = false // Utils.setString(this._nodeTab.labBDSidebar, "领取抖音侧边栏") } else { //版本不支持或奖励已领取 this._nodeTab.btnBDSidebar.active = false } } //刷新玩家信息完毕 userInited() { this.refreshSdkUI() this.refreshLevelList() this.refreshXiangqinTicket() } //刷新剩余相亲次数 private refreshXiangqinTicket() { let xqnum = HttpUnit.GetXiangqinTickets() // let xqmax = HttpUnit.GetXiangqinMaxTickets() Utils.setString(this._nodeTab.labTZCount, xqnum + "") Utils.setString(this._nodeTab.labBtnTZCount, "" + xqnum) } //刷新关卡列表 private refreshLevelList() { HttpUnit.ins.getLevelList((levelList) => { if (levelList) { GameRootUI.EnableOper() GameManager.SetLevelCfg(levelList) this.levelData = levelList this.levelData.unshift({} as any) //在最前面插入一个占位数据,用于数组排版显示 this.Level_List.numItems = this.levelData.length if (this.curLevelIdx < 1) { this.curLevelIdx = 1 //自动滚动只在引导后生效 if (PlayerDataManager.I.GuideMainFinished) { for (let i = 1; i < this.levelData.length; i++) { if (this.levelData[i].is_unlock == true) { if (this.curLevelIdx < i) { this.curLevelIdx = i } } else { break } } if (this.curLevelIdx > 2) { this.scheduleOnce(() => { this.Level_List.scrollTo(this.curLevelIdx-2) }, 0.1) } } else { this.checkGuide() } } this.changeLevel(this.curLevelIdx, true) } }) } //刷新SDK相关的UI refreshSdkUI() { console.log("主界面:刷新SDK相关的UI...") SDKManager.getUserInfo((data) => { //头像 let spt = this._nodeTab.headIcon.getComponent(Sprite) ResManager.I.changeRemoteSpriteFrame(spt, data.avatarUrl) SDKManager.avatarUrl = data.avatarUrl //名字 let nickName = this._nodeTab.nickName.getComponent(Label) nickName.string = data.nickName SDKManager.nickName = data.nickName console.log("主界面 设置头像和名字:", data.avatarUrl, data.nickName) }) //刷新id let id = HttpUnit.GetID() Utils.setString(this._nodeTab.userId, `ID:${id}`) // Utils.setString(this._nodeTab.userId, `${id}`) //快手去掉英文 } //region 关卡列表渲染 onRenderItemList(node: any, idx: number) { if(!isValid(node)) {return} if (!node.inited) { node.inited = true; Utils.parseNode(node); } GButton.RemoveClick(node) //第一个是占位用的 if (idx == 0) { node.l_rotateN.active = false node.zhanweiNode.active = true return } node.l_rotateN.active = true node.zhanweiNode.active = false let data = this.levelData[idx] //npc名 // console.log("关卡列表渲染:", data.name) //头像 let headPath = `headLevel/${data.icon}` ResManager.I.changeBundleSpriteFrame(node.head1.getComponent(Sprite), headPath, "Raw") //解锁状态 node.lockNode.active = data.is_unlock ? false : true node.unlockNode.active = data.is_unlock ? true : false if (data.is_unlock) { //分数 Utils.setString(node.labScore, data.score) //星级 if (data.star == 3) { ResManager.I.changeBundleSpriteFrame(node.l_xingji.getComponent(Sprite), "zjm_11", "Zhujiemian") } else if (data.star == 2) { ResManager.I.changeBundleSpriteFrame(node.l_xingji.getComponent(Sprite), "zjm_10", "Zhujiemian") } else if (data.star == 1) { ResManager.I.changeBundleSpriteFrame(node.l_xingji.getComponent(Sprite), "zjm_9", "Zhujiemian") } else { ResManager.I.changeBundleSpriteFrame(node.l_xingji.getComponent(Sprite), "zjm_8", "Zhujiemian") } //满星效果 node.l_manxing.active = data.star == 3 ? true : false if (data.star == 3) { ResManager.I.changeBundleSpriteFrame(node.l_bg.getComponent(Sprite), "zjm_6", "Zhujiemian") } else { ResManager.I.changeBundleSpriteFrame(node.l_bg.getComponent(Sprite), "zjm_5", "Zhujiemian") } } GButton.BandClick(node, ()=>{ this.changeLevel(idx) }, this) } //切换关卡 changeLevel(idx:number, force:boolean = false) { if (this.curLevelIdx == idx && !force) { return } this.curLevelIdx = idx let data = this.levelData[idx] //名字 Utils.setString(this._nodeTab.labNpcName, data.characterName) //介绍 Utils.setString(this._nodeTab.labNpcTalk, data.description) //是否解锁 if (data.is_unlock) { Utils.setString(this._nodeTab.labStart1, "游戏开始") Utils.setString(this._nodeTab.labStart2, "GAME\nSTART") } else { Utils.setString(this._nodeTab.labStart1, "解锁关卡") Utils.setString(this._nodeTab.labStart2, "UNLOCK\nGAME") } let bgPath = `bg/${data.bgImage}` let rolePath = `role/${data.characterFullLengthPortrait}` Utils.sendInnerMsg(InnerMsgCode.SceneLayerBgUp, {bgPath:bgPath, rolePath:rolePath}) } //region 开始游戏 onStartClick() { Utils.Log("点击开始游戏"); this.finishGuide() if (this.curLevelIdx == 0) { console.error("当前关卡为0,此关卡是占位用的") return } let data = this.levelData[this.curLevelIdx] let level_id = data.id GameManager.EndGame() //未解锁 if (data.is_unlock != true) { if (HttpUnit.GetXiangqinTickets() <= 0) { SubManager.ShowPrompt("今日相亲次数已耗尽,无法提前解锁更多关卡"); } else { this.lvUnlockId = level_id SubManager.ShowCommonAdDialog({ content: "关卡未解锁,需要通过本关卡的前置关卡,或观看广告提前解锁关卡,并消耗 1 点相亲次数进入关卡", strAd: "观看广告", strLeft: "返回", adCallback: () => { SDKManager.show_reward_video_ad(this.node.uuid, 2) } }) } return } //检测存档 if (GlobalValue.LvHuancun && data.record_id && data.record_id != "") { HttpUnit.ins.getTalkStage({record_id: data.record_id}, (_data) => { if (_data) { if (_data.level.status == E_TalkStatusType.talking) { this._continueLevel(level_id, _data) } else { this._startNewLevel(level_id) } } else { this._startNewLevel(level_id) } }) } else { SubManager.ShowConfirm({ content: `确认消耗 1 点“相亲次数” 开始与【${data.name}】相亲吗?`, strYes: "确认", strNo: "返回", yesCallback: () => { this._startNewLevel(level_id) } }) } } //开始新关卡 private _startNewLevel(level_id) { if (HttpUnit.GetXiangqinTickets() <= 0) { SubManager.ShowPrompt("今日相亲次数已用完"); return; } GameManager.CurLevelId = level_id HttpUnit.ins.levelStart({level_id:level_id}, (data) => { GameManager.CurLevelData = data.level GameManager.RecordId = data.record_id GameManager.I.connetSorcket(data.record_id) //连接socket this.setUIVisible(false) AudioManager.I.StopMusic() //停止背景音乐,进去后播放当前关卡音乐 ViewManager.I.openBundlesView("UI/StartUI/Talk_UI") }) } //region 继续关卡存档 private _continueLevel(level_id, data) { SubManager.ShowConfirm({ content: "检测到进行中的记录,是否继续?", strYes: "继续", strNo: "重新开始", yesCallback: () => { //继续对话 let lvCfg = this.levelData[this.curLevelIdx] let t_xindong = 0 let t_xihuan = 0 let t_taoyan = 0 //聊天记录 GameManager.AddTalkRecord({talk:lvCfg.prologueMessage, isMe:false, score:-1, scoreBase:-1, scoreAdditional:0}) let msg = data.messages || [] for (let i = 0; i < msg.length; i++) { let m = msg[i] let talkData: I_NpcTalkBack = { aiEmoji: m.ai_emoji, aiResponse: m.ai_response, aiScore: m.ai_score || 0, aiBaseScore: m.ai_base_score || 0, aiAdditionalScore: m.ai_additional_score || 0, isFinished: m.is_finished, sourceCnt: m.source_cnt, userInput: m.user_input, judgement: m.judgement, } GameManager.CurNpcTalkData = talkData GameManager.AddStepScore(m.ai_score) //记录本次分数 GameManager.AddTalkRecord({talk:m.user_input, isMe:true, score:-1, scoreBase:-1, scoreAdditional:0}) GameManager.AddTalkRecord({talk:m.ai_response, isMe:false, score:m.ai_score, scoreBase:talkData.aiBaseScore, scoreAdditional:talkData.aiAdditionalScore}) if (m.judgement == 0) { t_xindong++ t_xihuan++ } else if (m.judgement == 2) { t_taoyan++ } } GameManager.CurLevelId = level_id GameManager.CurLevelData = data.level GameManager.RecordId = data.record_id GameManager.srouceCnt = data.level.current_cnt GameManager.xindongCishu = t_xindong GameManager.npcFixTalkCountXihuan = t_xihuan GameManager.npcFixTalkCountTaoyan = t_taoyan GameManager.TurnToStage(E_TalkStage.myTalk) GameManager.I.connetSorcket(data.record_id) //连接socket this.setUIVisible(false) AudioManager.I.StopMusic() //停止背景音乐,进去后播放当前关卡音乐 ViewManager.I.openBundlesView("UI/StartUI/Talk_UI") }, noCallback: () => { //重新开始 this._startNewLevel(level_id) } }) } /**手动解锁关卡后进入 */ enterLevelAfterUnlock() { this._startNewLevel(this.lvUnlockId) this.lvUnlockId = "" } //点击客服 onKefuClick() { SDKManager.OpenKefu() } //增加相亲次数 onAddTZClick() { ViewManager.I.openBundlesView("UI/StartUI/TalkAdDialog", { type: E_AD_TARGET.xiangqin, //加相亲次数 content: GlobalValue.XiangQinAdTipsStr, adCallback: ()=>{ SDKManager.show_reward_video_ad(this.node.uuid, 1) }, shareCallback: ()=>{ SDKManager.show_reward_share(this.node.uuid, 1) } }) } //设置 onSettingClick() { ViewManager.I.openBundlesView("UI/StartUI/Setting_UI") } //gm onGMClick() { ViewManager.I.openBundlesView("UI/GM_UI") } //点击抖音侧边栏按钮 onBDSidebarClick() { if (!SDKManager.isByteDance()) { //不是抖音平台 return } ViewManager.I.openBundlesView("UI/StartUI/BDSidebar_UI") } //region 引导相关 private _guideInterval: number = 0.3 //引导间隔 //重置引导节点显示 private resetGuide() { this._nodeTab.guideStep1.active = false this._nodeTab.guideStep2.active = false this._nodeTab.guideHandNode.active = false this._nodeTab.btnStart.parent = this._nodeTab.startParent1 } //检查引导 private checkGuide() { if (PlayerDataManager.I.GuideMainFinished) { return } this.doGuideStep1() } //引导步骤1 显示介绍弹窗 private doGuideStep1() { GameRootUI.DisableOper(this._guideInterval) this.scheduleOnce(() => { this._nodeTab.guideStep1.active = true GButton.RemoveAndBandClick(this._nodeTab.btnGs1Ok, this.onGuide1OkClick, this); },this._guideInterval) } //引导步骤2 显示手 private doGuideStep2() { GameRootUI.DisableOper(this._guideInterval) this.scheduleOnce(() => { this._nodeTab.guideStep2.active = true this.scheduleOnce(() => { let tempNode = instantiate(this.GuidePageItem) let tntf = tempNode.getComponent(UITransform) let wsize = view.getVisibleSize() tntf.setContentSize(wsize.width, tntf.height) //0号是占位的,从1开始 for (let i=1; i { // this._startNewLevel(level_id) // } // }) this.onStartClick() } }