cocos2dx-lua制作新手引导

最近在项目中负责制作新手引导,有些想法分享一下。

常见的引导类型有点击和对话(剧情),甚至有些对话(剧情)不归属新手引导的范围,但是下文介绍的时候会涉及到剧情方面。

引导的整体逻辑

我的新手引导连贯性是使用事件派发实现,cocos2dx自带的事件派发是跟Node绑定的,所以你需要去找一个lua的事件派发(当然自己写一个更好)。下面的代码中sgEventDispatcher即为我使用的事件派发工具。

新手引导肯定是跟UI层有关联的,这个无法避免所以一定要设置合理的UI节点保证你引导的位置。我这里UI是使用cocosbuilder来拼接的,lua层解析使用的Viewbase基类。在设计UI时,我会在有引导的ccb中设置一个空的Node,并且命名为ccbNodeTutorial, 然后Viewbase解析的时候,如果检测到该节点就会在该Node的”enterTransitionFinish”事件里注册监听引导的监听函数,然后在”exitTransitionStart”取消注册。

function ViewBase:registerListener() if not tutorialMgr:getTutorialOpenState() thenreturnendself:onNodeEvent("enterTransitionFinish", function()if self.ccbNodeTutorial thensgEventDispatcher:registerEventListener("sgeNewTutorial", self.onEventAddTutorial, self)self:onNodeEvent("exitTransitionStart", self.unregisterListener, self)sgEventDispatcher:dispatchEvent("sgeStartTutorial")endend)
endfunction ViewBase:unregisterListener()sgEventDispatcher:remove("sgeNewTutorial", self.onEventAddTutorial, self)
endfunction ViewBase:onEventAddTutorial(event)if not tutorialMgr:checkCanCreateTutorialView(self) thenreturnendapp:showSwallowLayer()local node = display.newNode():addTo(self)performWithDelay(node, function()tutorialMgr:processNormalTutorial(self)end, delayTime)
end

然后在每次新手引导完成,或者是加载一个含有可引导节点的时候,或者达到指定的条件(比如等级达到), 都会派发一个新的引导事件,有时候会收到多次派发事件,需要做好筛选。

新手引导主要考虑的问题:

  1. 新手引导中途断开怎么办?
  2. 新手引导阻止触摸怎么实现?
  3. 新手引导一连串的引导怎么实现?
  4. 新手引导如果有特殊的触发条件?
  5. 新手引导如果有特殊场景的引导?

新手引导中途断开处理

新手引导设计一般是按照一定的时间轴进行的, 策划配表的时候可以按照一步一步来配置,但是每一步引导一般属于实现某个功能引导的一部分,可以按照对所属的功能引导把引导步数进行分组。配置示例:

    [1] = {index = 1, part = 1, type = 2, finish = 1, dialog = 901, receiver = "ccb/WelcomeScene.ccbi", },[2] = {index = 2, part = 2, type = 1, finish = 1, receiver = "ccb/Gate.ccbi", target = "ccbNodeEnterGate", targetCallback = "onBtnEnterGate", },

然后在存档的时候只存储分组的字段,每次进入游戏都是取出该分组的第一步进行引导。但是在实际引导过程中,我们需要知道当前的具体引导索引,必须设置一个字段来记录当前的引导索引。新手引导管理类的初始化方法,self.baseInfo.curTutorialPart即为存档的引导分组,self.curIndex即为当前引导的具体索引:

function Ref:ctor()self.baseInfo = data.baseInfoself.guiding = falseself.pause = falseself.tutorial = tutorialApi:getTutorialInfoByPart(self.baseInfo.curTutorialPart)-- 判断引导是否开启if self.tutorial == nil thenself.state = stateOffelseself.state = stateOnself.curIndex = self.tutorial.indexend--注册监听sgEventDispatcher:registerEventListener("sgeStartTutorial", self.onEventStartTutorial, self)sgEventDispatcher:registerEventListener("sgeEndTutorial", self.onEventEndTutorial, self)
end

当引导完成时的处理:

function Ref:onEventEndTutorial()self.guiding = false--检查引导是否完成if self:checkTutorialEndCondition() thenself:processTutorialFinished()else--引导未完成重新进行该分组的引导self.tutorial = tutorialApi:getTutorialInfoByPart(self.baseInfo.curTutorialPart)self.curIndex = self.tutorial.indexself:dispatchTutorialEvent()end
end--处理引导完成
function Ref:processTutorialFinished()local lastTutorial = self:getCurrentTutorialInfo()self.curIndex = self.curIndex + 1if lastTutorial.finish == 1 thenself.baseInfo.curTutorialPart = self.baseInfo.curTutorialPart + 1endif self:getCurrentTutorialInfo() ~= nil thenself:dispatchTutorialEvent()else-- 特殊引导完成if lastTutorial.special == 1 thenself.baseInfo.specialTutorial[lastTutorial.part] = 1self.curIndex = self.backUpIndexself:dispatchTutorialEvent()elseself:tutorialAllFinished()endend
end

新手引导阻止触摸怎么实现?

在引导点击层中注册触摸监听事件,然后在onTouchBegan, onTouchEnded中处理

--[[创建一个全屏阻止触摸的层,点击在指定范围内才会响应onTouchEnded方法,调用点击的回到方法。self.swallow是因为有时候可能需要点击到下层,如果不需要可以去掉。
]]
function Ref:onTouchBegan(touch, event)local touchPoint = touch:getLocation()local touchPos = self:getParent():convertToNodeSpace(touchPoint)local swallow = self.swallowif not swallow thenif cc.pGetDistance(touchPos, self.pos) > 50 thenswallow = trueelseswallow = falseendendreturn swallow
endfunction Ref:onTouchEnded(touch, event)local touchPoint = touch:getLocation()local touchPos = self:getParent():convertToNodeSpace(touchPoint)if cc.pGetDistance(touchPos, self.pos) < 50 thenself:processTutorialComplete()end
endfunction Ref:processTutorialComplete()if self.callback thenself.callback()endsgEventDispatcher:dispatchEvent("sgeEndTutorial")self:removeSelf()
end

新手引导一连串的引导怎么实现?

就是通过事件派发实现,但是有许多细节需要处理。比如两次引导之间如果快速点击出现问题怎么办?
我的解决方法是Node接收到合理的引导事件的时候创建一个全屏阻止触摸的layer,然后引导层出现之后移除该layer.

新手引导如果有特殊的触发条件?

local tutorialMap =
{[1] = "onGuidingClick",[2] = "onGuidingStory",
}-- 开始处理普通引导
function Ref:processNormalTutorial(view)if self:getIsGuidingTutorial() or self.pause or not self:checkTutorialStartCondition() thenreturnendlocal tutorial = self:getCurrentTutorialInfo()if tutorial.voice thenaudio:preloadAudio(string.format(tutorialAudioPath,tutorial.voice))endlocal funcName = tutorialMap[tutorial.type]local callback = handler(self, self[funcName])local arg = callback(tutorial, view)self:pushTutorial(tutorial.type, arg)
end

在self:checkTutorialStartCondition()检查引导配置里配置的引导条件是否满足,比如等级,未达到等级则不能进行引导。

新手引导如果有特殊场景的引导?

这个也可以理解为正常引导流程以外的引导。依然走的是正常引导的流程,不过需要把之前的引导进度保存起来,特殊引导走完之后再恢复回来。因为修改的是内存中self.curIndex的值,所以不需要考虑特殊引导进行中游戏中断的情况。

-- 开始处理特殊引导
function Ref:processSpecialTutorial(view, type)if self.baseInfo.specialTutorial[type] ~= nil thenreturnendself.backUpIndex = self.curIndexlocal specialTutorial = tutorialApi:getTutorialInfoByPart(type)self.curIndex = specialTutorial.indexself.tutorial = self:getCurrentTutorialInfo()self.pause = falseself:processNormalTutorial(view)
end

cocos2dx-lua制作新手引导相关推荐

  1. cocos2d-x lua 学习笔记(1) -- 环境结构

    Cocos2d-x 3.0超过环境的版本号来建立和前Cocos2d-x 2.0 差异较大的版本,从同时Cocos2d-x 3.0项目打包成apkAndroid的应用程序文件,步骤,构建环境有些乏味安德 ...

  2. cocos2d-x lua table数据存储

    cocos2d-x lua table数据存储 version: cocos2d-x 3.6 1. 将table转为json http://blog.csdn.net/songcf_faith/art ...

  3. cocos2d-x lua 学习笔记(1) -- 环境搭建

    Cocos2d-x 3.0以上版本的环境搭建和之前的Cocos2d-x 2.0 版差异较大的,同时从Cocos2d-x 3.0项目打包成apk安卓应用文件,搭建安卓环境的步骤有点繁琐,但搭建一次之后, ...

  4. Cocos2d-x Lua中实例:帧动画使用

    Cocos2d-x Lua中实例:帧动画使用 下面我们通过一个实例介绍一下帧动画的使用,这个实例如下图所示,点击Go按钮开始播放动画,这时候播放按钮标题变为Stop,点击Stop按钮可以停止播放动画. ...

  5. cocos2d-x+lua开发模式下编辑器的选择

    cocos2d-x+lua开发模式下编辑器的选择 原本打算直接用CocosIDE的,毕竟是官方出品,并且支持Android远程调试,windows下的调试也非常方便,调试的信息也非常全,智能提示也不错 ...

  6. 反编译 cocos2dx+lua

    严正声明:本帖所有的技术手段仅供用于技术学习使用,禁止用于商业目的! 1.准备工作 下载要反编译的 apk 文件(Android安装包),然后解压. 2.获取XXTEA的Key和Sign 目前大多数的 ...

  7. 手把手教你制作新手引导图片

    现在越来越多的网站都很注重用户的体验度,特别对新手,在用户注册成功后,都会有一个新手引导的界面. 让新手了解平台一些关键字或新增加功能,那些这些图片是怎么做的呢? 我只是一个程序员,不是美工.所以我想 ...

  8. Cocos2dx Lua开发环境搭建

    本文记录在 Windows 下搭建 cocos2dx lua 开发环境,还有调试设置. 系统:Windows 7 64 IDE:Mircrosoft Visual Studio 2013 Cocos2 ...

  9. cocos2dx lua 日志系统

    在实际开发过程中,代码日志是必不可少的系统,尤其是在线上版本中,对于查找问题相当有帮助.但是cocos2dx lua的代码日志是基于lua的print打印,只写在console中,不会长久保存.怎么办 ...

最新文章

  1. 关于某日访问次数最多的IP的topK问题的三种解法
  2. latex不能识别eps图片
  3. 算法笔记_204:第四届蓝桥杯软件类决赛真题(Java语言C组)
  4. 【Gerrit】持续集成工具Jenkins的安装配置与使用过程中遇到的问题整理
  5. python中的与或非_「Python基础」 While 循环语句
  6. bom_clear.php,thinkphp清除BOM方法
  7. unity捕捉全景图_DronePan:可捕捉飞机全景的应用程序
  8. hadoop: Operation category READ is not supported in state standby
  9. 关于Mysql8.0.26版本与IDEA连接的配置
  10. 基于SSM的猫头鹰轻博客系统
  11. 修复easyMule for Mac 2.0崩溃造成的任务丢失
  12. 360插件化踩坑记录(二),RePlugin安装、启动插件无反应
  13. 用sync toy做增量备份
  14. Redis ZADD命令
  15. 厉害!张近东钦点,80后郝嘉成苏宁北京300亿市场掌舵人
  16. Java实现旅游app_旅游app源码(在路上)
  17. 机器人与视觉,基于TCP(工具坐标)偏移
  18. 数学复习全程规划及方法指导(武忠祥笔记)
  19. js中replace函数的使用
  20. 怎么开qq远程连接服务器,QQ远程协助出现权限问题该怎么处理?不用慌这样保证解决...

热门文章

  1. 源码编译系列之mpv播放器编译教程
  2. DNF纯图色起号源码
  3. 【LeetCode】871. Minimum Number of Refueling Stops 解题报告(Python)
  4. 尹春鹏-Cocos游戏的自动化测试和崩溃分析
  5. 【编程小技巧】实现弹窗、选项、关机(文件后缀改成.vbs)
  6. Linux 安装与多重引导摘要
  7. 网页设计中文案是网站的性格
  8. PMP考试的分数线是怎么确定的(记分规则,成绩的演变)
  9. 上传文件时,服务器报错:IOFileUploadException: Processing of multipart/form-data request failed. 设备上没有空间
  10. lib/python3.7/site-packages/torch/lib/../../../../libgomp.so.1: version `GOMP_4.0‘ not found (requir