quick框架之MyApp详解
本来是计划从这篇开始做个用一个小游戏教程来讲解quick的使用,但是发现群里很多童鞋对quick的框架还真是不了解
其实这种不了解源自于没有认真的阅读quick的framework的代码,但无论是懒得读还是读不懂,结果都是会问各种基础的小白问题,于是我决定这个系列还继续讲解一些小白类的问题,而一些略微深入的使用以及我在做项目中得一些值得分享的东西我会单独开贴来写!
好了,进入今天正题,在上一篇内容中,我已经说明了quick得项目启动过程中,看过的应该知道quick启动中一个关键的类就是MyApp,所以本篇就来详细讲解下这个东西
首先,打开自己新建项目的MyApp.lua文件,代码我就不贴了,下面开始逐步讲解!
1.通过一些文件进行framework的初始化
在MyApp.lua的最开始是3行require语句
require("config")
require("cocos.init")
require("framework.init")
在lua中,require表示引入一个文件,那么上面的三个文件分别在哪里呢?
他们分别在:
root/src/config.lua
root/src/cocos/init.lua
root/src/framework/init.lua
其中root表示你项目的根目录
通过require这三个文件后,将会对quick的框架做一些初始化的事情。简单说下是如何初始化的,比如,require("config"),这句会加载root/src/config.lua文件,require加载文件的过程中会检查该文件的lua语法,以及完成文件内的一些变量的初始化,你打开config.lua文件,你回看到都是一些变量的初始化,这些都是全局变量,因为没有local,看过lua语法的都晓得。require了之后,你就可以在任何地方引用这些变量,比如DEBUG变量。关于lua的require更详细明确的讲解,请自行百度。这里,你就可以先理解为引入三个文件并且进行初始化
2.MyApp的定义
回到MyApp文件,看这一行
local MyApp = class("MyApp", cc.mvc.AppBase)
这一行的意思是:定义一个MyApp类,它继承自cc.mvc.AppBase
那么问题来了,cc.mvc.AppBase在哪里?
在root/framework/cc/mvc/AppBase.lua
理解继承概念的童鞋一看则明,不了解何为继承的,可以简单的这样理解:MyApp继承了AppBase,那么MyApp就可以使用AppBase的所有变量和函数,就跟MyApp自己的一样,如何使用,下面会具体介绍
3.MyApp的构造函数
MyApp:ctor这个函数理解为构造函数
MyApp.super.ctor(self),这一行的意思是调用基类的构造函数,也就是AppBase的构造函数
那么我们来看看AppBase的ctor函数都干了啥,打开AppBase,看ctor函数
cc(self):addComponent("components.behavior.EventProtocol"):exportMethods()
这一行是给AppBase函数添加事件组件,至于事件组件是啥,后面会有专门对这个组件讲解,这里你知道是添加了事件组件就好
self.name = appName
self.packageRoot = packageRoot or "app"
这里就是简单地两个赋值,self就是AppBase自己
local eventDispatcher = cc.Director:getInstance():getEventDispatcher()
local customListenerBg = cc.EventListenerCustom:create(AppBase.APP_ENTER_BACKGROUND_EVENT,
handler(self, self.onEnterBackground))
eventDispatcher:addEventListenerWithFixedPriority(customListenerBg, 1)
local customListenerFg = cc.EventListenerCustom:create(AppBase.APP_ENTER_FOREGROUND_EVENT,
handler(self, self.onEnterForeground))
eventDispatcher:addEventListenerWithFixedPriority(customListenerFg, 1)
这几行内容是通过eventDispatcher注册两个监听事件,分别是AppBase.APP_ENTER_BACKGROUND_EVENT和AppBase.APP_ENTER_FOREGROUND_EVENT,这两个事件是你的游戏在切换到后台和从后台切换回来的时候触发后,会调用AppBase的两个方法onEnterBackground,onEnterForeground。这两个方法的定义在AppBase的下面,因为涉及到事件的东西,暂时用不到,所以不做详解。
self.snapshots_ = {}
-- set global app
app = self
这两行是初始化两个变量,注意app这个变量的初始化,app被定义为一个全局变量,并且赋值为self,也就是以后你使用app这个全局变量的时候它就是AppBase,或者继承自AppBase的MyApp
4.run函数
cc.FileUtils:getInstance():addSearchPath("res/")
这一行是向搜索路径中添加res目录,何为搜索路径,就是你将来引用资源的时候能够查找的目录。
self:enterScene("MainScene")
这一句有童鞋会不理解,enterScene方法哪里来得,MyApp中没有定义啊,是得MyApp中没有定义,因为是在AppBase中定义的,而上面说了,通过继承可以直接访问基类的方法,所以MyApp可以直接使用enterScene方法。
在AppBase中找到enterScene方法的定义。
enterScene(sceneName, args, transitionType, time, more)
此函数接收4个参数,你可能比较奇怪,为啥前面MyApp里只传入了一个参数,看过lua语法的应该知道,lua中函数的参数可以少写或者多写,少写得话,对应位置的参数会赋值nil,多写的话会被省略,所以self:enterScene("MainScene")等同于self:enterScene("MainScene", nil, nil, nil)
sceneName是你要跳转的场景名
args是跳转场景是传给该场景类构造函数的参数,args需要是一个table
transitionType是场景切换的过渡动画类型
time过渡时间
more是过渡效果附加参数
在基本的使用中,你只需要传入sceneName即可
local scenePackageName = self.packageRoot .. ".scenes." .. sceneName
local sceneClass = require(scenePackageName)
local scene = sceneClass.new(unpack(checktable(args)))
这三句的意思是确定该场景所在的包名,引入该场景的文件,生成一个该场景的实例
通过看scenePackageName的赋值你会看出,使用enterScene方法跳转场景是有限制的,该场景的定义文件一定要在root/scenes/这个文件夹中,比如
root/scenes/MainScene.lua。
随后,调用display的转换场景方法来转换场景
display.replaceScene(scene, transitionType, time, more)
同样的逻辑你可以看下createView这个方法,这个方法是创建一个定义文件在root/views/这个目录下的view
5.用args给要切换到的场景传参
前面说过args传参需要是一个table类型,比如给MainScene传参可以这样写
self:enterScene("MainScene", {10, 20})
那么如何在MainScene中接收这两个参数呢?需要这样改写MainScene的ctor定义
MainScene:ctor(arg1, arg2)
此时,arg1 = 10, arg2 = 20
quick框架之MyApp详解相关推荐
- spring框架 AOP核心详解
AOP称为面向切面编程,在程序开发中主要用来解决一些系统层面上的问题,比如日志,事务,权限等待,Struts2的拦截器设计就是基于AOP的思想,是个比较经典的例子. 一 AOP的基本概念 (1)Asp ...
- pythonmessage用法_django 消息框架 message使用详解
前言 在网页应用中,我们经常需要在处理完表单或其它类型的用户输入后,显示一个通知信息给用户. 对于这个需求,Django提供了基于Cookie或者会话的消息框架messages,无论是匿名用户还是认证 ...
- 定时任务框架APScheduler学习详解
定时任务框架APScheduler学习详解 APScheduler简介 在平常的工作中几乎有一半的功能模块都需要定时任务来推动,例如项目中有一个定时统计程序,定时爬出网站的URL程序,定时检测钓鱼网站 ...
- java集合框架的结构_集合框架(Collections Framework)详解及代码示例
简介 集合和数组的区别: 数组存储基础数据类型,且每一个数组都只能存储一种数据类型的数据,空间不可变. 集合存储对象,一个集合中可以存储多种类型的对象.空间可变. 严格地说,集合是存储对象的引用,每个 ...
- Android系统(96)---Android 数据交换解析框架Gson使用详解
Android 数据交换解析框架Gson使用详解 Json 是一种文本形式的数据交换格式,比 xml 更为轻量.Json 的解析和生成的方式很多,在 Android 平台上最常用的类库有 Gson 和 ...
- python安装robotframework报错_Python3+RIDE+RobotFramework自动化测试框架搭建过程详解
Python2.7已于2020年1月1日开始停用,之前RF做自动化都是基于Python2的版本. 没办法,跟随时代的脚步,我们也不得不升级以应用新的控件与功能. 升级麻烦,直接全新安装. 一.Pyth ...
- Android自动化大讲堂34--终极自动化框架UIAutomator使用详解
<深入理解Android自动化测试> 又双叒叕重印咯!!! 无以为报,只能改版得更漂亮一点来答谢各位的厚爱! 好了,废话少说,咱们开始吧! 终极自动化框架UIAutomator使用详解 注 ...
- java reflections_Java反射框架Reflections示例详解
MAVEN 坐标 org.reflections reflections 0.9.10 Reflections 的作用 Reflections通过扫描classpath,索引元数据,并且允许在运行时查 ...
- Qt Quick - Popup控件详解
Qt Quick - Popup控件详解 Popup是基于Qt Quick中的一种弹出式用户界面控件.它可以和Window或ApplicationWindow一起使用.如果想要确保一个Popup在场景 ...
最新文章
- linux shell 得到当前时间
- HTML页面转换asp,将asp页面转换成html页面 代码
- 第一次CM--CosH.2
- 丽水数据可视化设计价格_50个数据可视化最有价值的图表(建议收藏)
- 虚拟机linux中怎样打开qt,虚拟机中在Centos 4.7中安装qt-x11-opensource-4.4.3
- AI助特朗普当选?FB史上最大数据滥用曝光,牵出ACL终身奖得主
- 【MySQL】MySQL for Mac 环境变量的配置
- “人大女神”事件思考网络事件背后的教育文化
- 欢迎加入我们的架构师社群
- 关于Big-Endian 和Little-Endian
- Linux内核配置选项 (经典学习)
- 助力Java初级程序员快速成长的营养书单
- C语言银行排队系统仿真
- 计算机网络手写笔记图片,一键收藏!清华学子这样记笔记!
- php网页在iis里打不开,asp的网站在iis上打不开
- LCD12864液晶显示屏工作原理是什么呢?
- java 支付宝回调返回值,支付宝APP支付Java回调具体步骤
- java xsd校验xml文件
- html、js、css3制作一款辉光管时钟
- 创建工作站vmware workstation时,提示before you can run vmware several modules must be compiled
热门文章
- super()继承关系总结
- 猿如意开发工具|python3.7
- luogu P1972 [SDOI2009] HH的项链【莫队——奇偶优化详解】
- 相机对焦、标定等近期学习
- linux 校园网 自动认证,关于在Linux操作系统下校园网 瑞捷的认证(xrgsu)
- “远端www服务支持TRACE请求“验证及修复jetty,非框架,内嵌版本
- 2370 小机房的树
- AI走向“战争技术”,是减少损伤还是推向灾难
- 可扩展性设计之数据切分
- wifipineapple外接网卡上网