123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506 |
- import { default as gameCfg, default as Gamecfg } from "../../../common/gameCfg";
- import { gameMethod } from "../../../common/gameMethod";
- import { xlsGuideInfo } from "../../../common/xlsConfig";
- import auto_guideView from "../../../data/autoui/guide/auto_guideView";
- import { GameEvent, GuideEvent, HomeEvent, MapEvent } from "../../../data/const/EventConst";
- import { AudioConst, GuideType, HdBanBenFuLiCard, OpenType, TaskKind } from "../../../data/const/TypeConst";
- import { ViewZorder } from "../../../data/const/ViewZOrder";
- import GameDataCenter from "../../../data/GameDataCenter";
- import ResSpine from "../../../frameWork/compment/ResSpine";
- import FguiMgr from "../../../frameWork/fgui/FguiMgr";
- import EventMng from "../../../manager/EventMng";
- import { I18n } from "../../../utils/I18nUtil";
- import Load from "../../../utils/Load";
- import { uiCommon } from "../../../utils/UICommon";
- const { ccclass, property } = cc._decorator;
- @ccclass
- export default class UIGuideView extends cc.Component {
- @property(cc.SpriteFrame)
- taskzhezhao: cc.SpriteFrame = null
- @property(cc.SpriteFrame)
- btnzhezhao: cc.SpriteFrame = null
- @property(cc.SpriteFrame)
- fudi: cc.SpriteFrame = null
- @property(cc.SpriteFrame)
- jianghu: cc.SpriteFrame = null
- @property(cc.SpriteFrame)
- shilian: cc.SpriteFrame = null
- @property(cc.SpriteFrame)
- tongyong: cc.SpriteFrame = null
- @property(cc.SpriteFrame)
- tupo: cc.SpriteFrame = null
- @property(cc.SpriteFrame)
- xiuxing: cc.SpriteFrame = null
- @property(cc.SpriteFrame)
- zhaomu: cc.SpriteFrame = null
- @property(cc.SpriteFrame)
- zhenfa: cc.SpriteFrame = null
- @property(cc.SpriteFrame)
- guanbi: cc.SpriteFrame = null
- @property(cc.SpriteFrame)
- imgMask: cc.SpriteFrame = null
- @property(cc.SpriteFrame)
- shouling: cc.SpriteFrame = null
- @property(cc.Node)
- SkipPanel: cc.Node = null
- @property(cc.Node)
- SkipBtn: cc.Node = null;
- @property(cc.Node)
- SkipGuideAllBtn: cc.Node = null;
- ui: auto_guideView = null;
- private needUiName: string = "" //需要此UI才能继续引导
- private guideUiName: string = "" //当前引导的UI
- private delayTime: number = -1 //guide延迟时间
- private handTime: number = -1 //手势延迟时间
- private fixTime: number = -1 //修正延迟时间
- private fixCount: number = 0 //修正次数
- private msgOffsetY: number = 0 //对话框偏移量
- private targetNodeScale: number = 1 //目标节点真实sacle
- private finishTyping = false //打字完成
- private event: GuideType = null //当前引导事件
- private type: number = 1 //引导类型
- callBack: Function;
- yType: number;
- startMoveHand: boolean = false;
- handWolrdPos: cc.Vec2;
- plotResSpine: ResSpine;
- isSkipPlot: boolean = false;//是否已经跳过剧情漫画
- private canSkipPlot: boolean = false;//是否可以跳过漫画
- skipCheckCount: number = 0;//检测点击次数跳过
- protected onEnable() {
- this.ui = this.node.addComponent(auto_guideView);
- cc.game.addPersistRootNode(this.node)
- this.node.zIndex = ViewZorder.GUIDE
- uiCommon.onRegisterEvent(this.ui.dialog, this.onClickDialog, this)
- uiCommon.onRegisterEvent(this.SkipBtn, this.onClickSkipPlot, this)
- uiCommon.onRegisterEvent(this.ui.plot, this.onClickPlot, this)
- uiCommon.onRegisterEvent(this.SkipGuideAllBtn, this.onClickSkipGuideAllBtn, this)
- EventMng.on(GuideEvent.GUIDE_EVENT, this.onGuideEvent, this)
- EventMng.on(GuideEvent.CLOSE_GUIDE, this.onClose, this)
- EventMng.on(GameEvent.ON_CLICK, this.checkOpen, this)
- EventMng.on(GuideEvent.UPDATE_TXTMSG, this.updateTxtMsg, this)
- EventMng.on(GuideEvent.HIDE_HAND, this.hideHand, this)
- this.ui.mask2.on(cc.Node.EventType.TOUCH_END, this.onTouchEnd, this);
- cc.tween(this.ui.imgQuan).repeatForever(cc.tween(this.ui.imgQuan).to(0.45, { scale: 1.2 }).to(0.45, { scale: 1 })).start()
- }
- protected onDisable() {
- uiCommon.unRegisterEvent(this.ui.dialog)
- uiCommon.unRegisterEvent(this.SkipBtn)
- EventMng.off(GuideEvent.GUIDE_EVENT, this.onGuideEvent, this)
- EventMng.off(GuideEvent.CLOSE_GUIDE, this.onClose, this)
- EventMng.off(GameEvent.ON_CLICK, this.checkOpen, this)
- EventMng.off(GuideEvent.UPDATE_TXTMSG, this.updateTxtMsg, this)
- EventMng.off(GuideEvent.HIDE_HAND, this.hideHand, this)
- this.ui.mask2.off(cc.Node.EventType.TOUCH_END, this.onTouchEnd, this);
- }
- private onTouchEnd(event: cc.Event.EventTouch) {
- if (!this.ui.imgHand.active || this.startMoveHand || gameMethod.isEmpty(this.handWolrdPos)) {
- return
- }
- this.skipCheckCount++;
- let lastPos: cc.Vec2 = cc.v2()
- lastPos.x = this.ui.imgHand.x
- lastPos.y = this.ui.imgHand.y
- let touchPos = event.getLocation();
- cc.tween(this.ui.imgHand).stop()
- uiCommon.setWorldPos(this.ui.imgHand, touchPos)
- this.startMoveHand = true
- cc.tween(this.ui.imgHand).to(0.5, { x: lastPos.x, y: lastPos.y }).call(() => {
- uiCommon.setWorldPos(this.ui.imgHand, this.handWolrdPos)
- this.startMoveHand = false
- }).start()
- if (this.skipCheckCount >= 3 && GameDataCenter.guide.isFinishGuide() && this.event != GuideType.evt_guide_150) {
- this.SkipGuideAllBtn.active = true;
- }
- }
- checkOpen() {
- if (GameDataCenter.guide.isShowing) {
- let conf = Gamecfg.guideInfo.getItem(GameDataCenter.guide.guideId)
- if (conf?.ytype == 2) {
- GameDataCenter.guide.saveGuide(() => {
- EventMng.emit(GuideEvent.CLOSE_GUIDE)
- EventMng.emit(GuideEvent.GUIDE_EVENT, conf.event)
- })
- }
- }
- }
- //监听剧情触发事件
- onGuideEvent(event: GuideType, callBack?: Function) {
- //暂时先关闭所有引导
- if (!GameDataCenter.guide.isOpenGuide) {
- return
- }
- this.event = event
- this.callBack = callBack
- let confDramaList = gameCfg.guideInfoList.getItemList(event)
- let isfinish: boolean = false
- for (const key in confDramaList) {
- const element = confDramaList[key];
- //新手引导如果保存了步骤要过滤
- if (!GameDataCenter.guide.checkIsSave(element.id) && GameDataCenter.guide.checkCanDrama(element.id)) {
- this.showGuide(element.id)
- EventMng.emit(HomeEvent.UP_HD_FLYBIRD);
- isfinish = true
- this.fixCount = 0;//重置修正次数
- this.skipCheckCount = 0;
- this.SkipGuideAllBtn.active = false;
- break
- }
- }
- }
- onClickPlot() {
- if (!this.canSkipPlot) return;
- if (this.SkipPanel.active) {
- this.ShowPlotSkip(false);
- } else {
- this.ShowPlotSkip(true);
- }
- }
- onClickSkipPlot() {
- if (this.isSkipPlot) return;
- this.isSkipPlot = true;
- this.SkipPanel.active = false;
- if (!GameDataCenter.guide.isFinishGuide()) {
- GameDataCenter.guide.nextGuide(this.event)
- }
- cc.tween(this.ui.plot)
- .to(1, { opacity: 0 })
- .delay(0.5)
- .call(() => {
- this.ui.plot.active = false
- this.plotResSpine.resetRes();
- GameDataCenter.audio.playMusic(AudioConst.bgm_base)
- }).start();
- }
- ShowPlotSkip(isShow: boolean) {
- cc.Tween.stopAllByTarget(this.SkipPanel);
- if (isShow) {
- this.SkipPanel.active = true;
- cc.tween(this.SkipPanel)
- .to(0.25, { y: this.SkipPanel.height })
- .start();
- } else {
- cc.tween(this.SkipPanel)
- .to(0.25, { y: 0 })
- .call(() => {
- this.SkipPanel.active = false;
- })
- .start();
- }
- }
- showGuide(id: string) {
- if (GameDataCenter.guide.isShowing) {
- return
- }
- console.log("showGuide:" + id)
- GameDataCenter.guide.isShowing = true
- GameDataCenter.guide.guideId = id
- GameDataCenter.guide.guideIndex = 0
- this.ui.gGuide.active = true
- let conf = gameCfg.guideInfo.getItem(GameDataCenter.guide.guideId)
- if (GameDataCenter.guide.isFinishGuide() && conf.event == GuideType.new) {//如果已完成了新手引导,但是仍然触发了新手引导的步骤,直接跳过
- GameDataCenter.guide.saveGuideArray(GuideType.new, [GameDataCenter.guide.guideId], () => { });
- return;
- }
- this.type = conf.type
- this.yType = conf.ytype
- if (this.type == 1) {
- if (!GameDataCenter.guide.isFinishGuide()) {
- GameDataCenter.guide.nextGuide(this.event)
- }
- } else if (this.type == 3) {
- //单纯对话框引导
- this.ui.btnMask.active = false
- this.ui.dialog.active = true
- this.showDialog()
- } else if (this.type == 5) {
- //正常下一步引导
- if (conf.way == "5") {
- GameDataCenter.guide.isShowing = true
- this.ui.gGuide.active = true
- this.ui.btnMask.active = true
- EventMng.emit(GuideEvent.GUIDE_SLOT, conf.pram[0]);
- } else {
- this.playGuide()
- }
- } else {
- //正常下一步引导
- this.guideUiName = conf.pram[0][0];
- this.playGuide()
- }
- }
- showDialog() {
- let conf = gameCfg.guideInfo.getItem(GameDataCenter.guide.guideId)
- let roleImgName = conf.pram[2]
- Load.loadTexture(this.ui.imgRole1, `guide/res/${roleImgName}`);
- uiCommon.setLabel(this.ui.txtName, I18n.getI18nLang(conf.pram[3]))
- if (conf.pram[0][GameDataCenter.guide.guideIndex] == null) {
- GameDataCenter.guide.saveGuide(() => {
- this.onClose()
- if (this.callBack) {
- //当前引导组结束回调
- GameDataCenter.guide.isShowing = true
- this.ui.gGuide.active = true
- this.ui.btnMask.active = true
- this.callBack()
- this.callBack = null
- } else {
- this.onGuideEvent(this.event)
- }
- })
- return
- }
- //播放配音
- GameDataCenter.audio.stopAllEffects()
- //GameDataCenter.audio.playEffect(conf.pram?.[0]?.[GameDataCenter.guide.guideIndex])
- uiCommon.typingAni(this.ui.txtDialog.getComponent(cc.RichText), I18n.getI18nLang(conf.pram?.[0]?.[GameDataCenter.guide.guideIndex]), 1 / 45, () => {
- this.finishTyping = true
- })
- }
- onClickDialog() {
- if (this.finishTyping) {
- this.finishTyping = false
- GameDataCenter.guide.guideIndex++
- this.showDialog()
- } else {
- this.finishTyping = true
- this.ui.txtDialog.getComponent(cc.RichText).unscheduleAllCallbacks()
- let conf = gameCfg.guideInfo.getItem(GameDataCenter.guide.guideId)
- uiCommon.setLabel(this.ui.txtDialog, I18n.getI18nLang(conf.pram?.[0]?.[GameDataCenter.guide.guideIndex]))
- GameDataCenter.audio.stopAllEffects()
- }
- }
- onClickSkipGuideAllBtn() {
- let confDramaList = gameCfg.guideInfoList.getItemList(this.event)
- let guideIds = [];
- confDramaList.forEach(element => {
- guideIds.push(element.id);
- });
- GameDataCenter.guide.saveGuideArray(this.event, guideIds, () => {
- this.SkipGuideAllBtn.active = false;
- this.skipCheckCount = 0;
- this.onClose();
- })
- }
- playGuide() {
- if (this.delayTime >= 0) { return }
- let conf = gameCfg.guideInfo.getItem(GameDataCenter.guide.guideId)
- let guideInfo = conf.pram[GameDataCenter.guide.guideIndex]
- // console.log("guideInfo===", guideInfo)
- if (guideInfo != null) {
- switch (guideInfo[0]) {
- case "name":
- this.ui.btnMask.active = this.yType != 2 //弱引导,不开启遮罩
- this.handTime = guideInfo[1] < 0 ? 0 : guideInfo[1]
- this.msgOffsetY = guideInfo[6] != null ? guideInfo[6] : 140
- break
- default:
- this.ui.btnMask.active = this.yType != 2 //弱引导,不开启遮罩
- this.needUiName = this.changeUiName(guideInfo[0], conf);
- this.delayTime = guideInfo[1]
- break
- }
- } else {
- GameDataCenter.guide.nextGuide(this.event)
- }
- }
- handCall(isFix: boolean = false) {
- if (isFix) {
- return
- }
- let conf = Gamecfg.guideInfo.getItem(GameDataCenter.guide.guideId)
- let guideInfo = conf.pram[GameDataCenter.guide.guideIndex]
- if (guideInfo == null || gameMethod.isEmpty(guideInfo[2])) {
- return
- }
- this.fixTime = 0.5 //每0.5s修正一次位置
- this.ui.btnMask.active = false
- this.ui.mask.active = this.yType != 2 //弱引导,不开启遮罩
- //这里需要查找节点的话,conf.pram[0][0]必须配置uiview
- let uiViewName = this.changeUiName(conf.pram[0][0], conf);
- let targetNode: cc.Node = FguiMgr.Instance.findNodeByName(uiViewName, guideInfo[2]);
- if (targetNode == null) {
- console.error(`找不到目标节点: ${guideInfo[2]}`)
- this.onClose();
- return
- }
- let targetWolrdPos = uiCommon.getWorldPosCenter(targetNode)
- this.targetNodeScale = targetNode.scale
- let maskScale = 1
- if (!gameMethod.isEmpty(guideInfo[7])) {
- maskScale = guideInfo[7]
- }
- this.getRealScale(targetNode)
- this.ui.mask.width = targetNode.width * this.targetNodeScale * maskScale
- this.ui.mask.height = targetNode.height * this.targetNodeScale * maskScale
- this.ui.mask.angle = targetNode.angle
- uiCommon.setWorldPos(this.ui.mask, targetWolrdPos)
- cc.Tween.stopAllByTarget(this.ui.imgHand)
- this.ui.imgHand.active = true//guideInfo[2] != "MaskBgBtn" //点击空白处关闭的,无需显示手指跟光圈
- if (!gameMethod.isEmpty(guideInfo[3])) {
- targetWolrdPos.y -= parseInt(guideInfo[3])
- }
- this.handWolrdPos = targetWolrdPos
- if (conf.type == 15 && !gameMethod.isEmpty(conf.pram?.[2]?.[2])) {//拖动类型的引导
- let targetNode2: cc.Node = FguiMgr.Instance.findNodeByName(uiViewName, conf.pram[2][2]);
- if (targetNode2 == null) {
- console.error(`找不到目标节点: ${conf.pram[2][2]}`)
- this.onClose();
- return
- }
- uiCommon.setWorldPos(this.ui.imgQuan, cc.v2(targetWolrdPos.x, targetWolrdPos.y))
- uiCommon.setWorldPos(this.ui.imgHand, targetWolrdPos)
- this.ui.msgBg.active = !gameMethod.isEmpty(guideInfo[5])
- this.ui.imgQuan.active = false;
- if (!gameMethod.isEmpty(conf.pram?.[GameDataCenter.guide.guideIndex]?.[5])) {
- uiCommon.setLabel(this.ui.txtMsg, I18n.getI18nLang(conf.pram?.[GameDataCenter.guide.guideIndex]?.[5]))
- }
- this.ui.msgBg.y = this.ui.imgQuan.y + this.msgOffsetY
- let msgBgX = this.ui.imgQuan.x
- if (this.ui.imgQuan.x < -155) {
- msgBgX = -155
- } else if (this.ui.imgQuan.x > 155) {
- msgBgX = 155
- }
- this.ui.msgBg.x = msgBgX
- let targetPos = uiCommon.transPos(targetNode2, this.ui.gGuide);
- cc.tween(this.ui.imgHand).repeatForever(cc.tween(this.ui.imgHand).to(0.5, { position: targetPos }).delay(0.3).call(() => {
- uiCommon.setWorldPos(this.ui.imgHand, targetWolrdPos)
- })).start()
- }
- else {
- uiCommon.setWorldPos(this.ui.imgHand, targetWolrdPos)
- this.guideHandEnd(guideInfo, conf, targetWolrdPos)
- }
- }
- guideHandEnd(guideInfo: any[], conf: xlsGuideInfo, targetWolrdPos: cc.Vec2) {
- this.ui.msgBg.active = !gameMethod.isEmpty(guideInfo[5])
- this.ui.imgQuan.active = true//guideInfo[2] != "MaskBgBtn" //点击空白处关闭的,无需显示光圈
- //播放配音
- if (!gameMethod.isEmpty(conf.pram?.[GameDataCenter.guide.guideIndex]?.[5])) {
- uiCommon.setLabel(this.ui.txtMsg, I18n.getI18nLang(conf.pram?.[GameDataCenter.guide.guideIndex]?.[5]))
- GameDataCenter.audio.stopAllEffects()
- //GameDataCenter.audio.playEffect(conf.pram?.[GameDataCenter.guide.guideIndex]?.[5])
- }
- uiCommon.setWorldPos(this.ui.imgQuan, cc.v2(targetWolrdPos.x, targetWolrdPos.y))
- uiCommon.setWorldPos(this.ui.imgHand, cc.v2(targetWolrdPos.x, targetWolrdPos.y))
- this.ui.msgBg.y = this.ui.imgQuan.y + this.msgOffsetY
- let msgBgX = this.ui.imgQuan.x
- if (this.ui.imgQuan.x < -155) {
- msgBgX = -155
- } else if (this.ui.imgQuan.x > 155) {
- msgBgX = 155
- }
- this.ui.msgBg.x = msgBgX
- }
- updateTxtMsg(txt: string) {
- uiCommon.setLabel(this.ui.txtMsg, txt)
- }
- //获取目标节点真实sacle
- getRealScale(root: cc.Node) {
- if (root.parent != null) {
- this.targetNodeScale *= root.parent.scale
- this.getRealScale(root.parent)
- }
- }
- update(dt: number) {
- if (this.delayTime >= 0) {
- this.ui.btnMask.active = this.yType != 2 //弱引导,不开启遮罩
- if (this.needUiName.length > 0) {
- if (FguiMgr.Instance.isShowingByName(this.needUiName) && FguiMgr.Instance.getShowingViewByName(this.needUiName)?.isFinishOpenAni) {
- this.delayTime -= dt
- if (this.delayTime < 0) {
- this.ui.btnMask.active = false
- this.needUiName = ""
- if (this.type == 1) {
- this.ui.dialog.active = true
- this.showDialog()
- } else {
- GameDataCenter.guide.guideIndex++
- this.playGuide()
- }
- }
- }
- } else {
- this.delayTime -= dt
- if (this.delayTime < 0) {
- this.ui.btnMask.active = false
- if (this.type == 1) {
- this.ui.dialog.active = true
- this.showDialog()
- } else {
- this.playGuide()
- }
- }
- }
- }
- //手势引导延迟
- if (this.handTime >= 0) {
- if (FguiMgr.Instance.isShowingByName(this.guideUiName)) {
- this.handTime -= dt
- if (this.handTime < 0) {
- this.handCall()
- }
- }
- }
- //修正位置
- if (this.fixTime >= 0) {
- if (FguiMgr.Instance.isShowingByName(this.guideUiName)) {
- this.fixTime -= dt
- if (this.fixTime < 0) {
- this.handCall(true)
- }
- }
- }
- }
- changeUiName(uiName: string, conf: xlsGuideInfo) {
- return uiName;
- }
- hideHand() {
- this.ui.imgQuan.active = false
- this.ui.imgHand.active = false
- }
- onClose() {
- GameDataCenter.guide.init()
- this.ui.gGuide.active = false
- this.ui.dialog.active = false
- this.ui.mask.active = false
- this.ui.msgBg.active = false
- this.ui.imgQuan.active = false
- this.ui.imgHand.active = false
- this.needUiName = ""
- this.guideUiName = ""
- this.delayTime = -1
- this.handTime = -1
- this.fixTime = -1
- this.targetNodeScale = 1
- }
- }
|