Qiuck_Cocos基础(一)
2016-07-13 00:57
381 查看
前言
最近学校和触控科技合作,组织了一次qiuck_cocos的教学(非常感谢触控科技的小强老师,笔者暂时不知道他的博客,以后会告知大家),笔者有幸参与其中,领略了脚本语言lua的实用性和cocos引擎的便捷开发流程,在此把一些感悟想和大家分享。此篇文章不会太过详细地向读者讲解lua语言的基本特性,由于lua语言特别简单,有任何面向对象基础的人和c语言基础的人都可以很快上手();如果大家想了解quick_cocos的安装配置,可以移步泰然网
提前申明:笔者的lua基础并不好,也没有看过它编译c的源码,理解可能有误,但是实用的部分还是没问题的
基本结构:lua中的类
要了解lua中的类,首先要了解基本数据table。在我的理解中,table就是一个struct。有一点不同的是,它通过__index索引,能够实现类似c++ vptr的功能,能够实现公有继承,但是它的overload是完全覆盖,所以并不能从虚表中找到父类的函数原型。
创建一个简单的类
我们来看代码-- 首先创建一个空的table local State={ }
这是一个空表,也是一个空类,我们为它加一个属性,lua里面的属性可以被任意调用,并没有数据保护,省略了java和c系语法的setter和getter,但是在严谨的项目中,代码的健壮性也被大大地影响了。
local State={ owner=0 }
我们为它加入了一个成员变量owner,它是一个number值,lua没有整形和浮点型的区别,全是浮点数,至于精度为多少,由于在游戏中并不关键,有兴趣的读者可以自己去查
-- 省略上面的代码 function State:enter() end
我们通过“类名:函数名”在大括号外面为其添加方法
实例化
function State:new() local p={} setmetatable(p,self) self.__index=self return p end
lua的类使用table模拟的,所以并没有vtbl函数表这种方案来支持泛性,lua中类的对象利用索引来引用父类的所有属性具体操作。
实例化过程中,创建一个空的table “p”,然后用setmetatable和__index方法(缺一不可,此处的new函数可以作为范例)来添加索引,编译器会遍历p中的所有属性,如果没有查找到某条属性,就会去遍历 __index索引的table,我们之前也说过,lua的继承就是用这个方法实现的,所以实例化其实可以理解为如下:
复制一个类的所有属性
引用一个类的table
继承一个类
我们看一下完整文件
-- State base
local State={
}
function State:new() local p={} setmetatable(p,self) self.__index=self return p end
function State:enter(owner)
end
function State:execute(owner)
owner:movementUpdate()
end
function State:exit(owner)
end
function State:handleMsg(owner,msg) --处理消息来进行状态转换
end
return State -- 这句是为了跨文件操作,下一块我们会讲
继承
前面已经讲了很多继承了,现在直接看代码local State=require("app.common.State") local Normal=State:new() -- @overload function Normal:handleMsg(owner,msg) if msg=="on_injured" then return end end return Normal
最上面require方法相当于各种语言中的#include,import,Using,from等方法,添加一个引用,并在这个文件中创建这个类的table
Normal继承于State,此处我们重写了handleMsg函数,该函数被完全覆盖,调用Normal你就别再想使用State的handleMsg函数了。
Cocos的类
创建一个类并且继承于cocos的自带类
看了代码再说--function是一个匿名函数,参数可以理解为构造函数的参数,可以在ctor函数里面调用参数,但需要ctor参数为同名参数 local StartScene=class("StartScene",function() return display.newScene("StartScene") end) function StartScene:ctor() -- 固定函数,在调用new方法时,固定被调用,相当于create和init宏 -- init list self.count=1 -- ... end
基于如上的格式,我们可以创建一个类,如果大家有兴趣的话,可以参考functions.lua的class实现,其实就是根据类不同(这里有原生的lua类,也有c++的编译类),进行不同的操作(针对table使用元表引用,针对c++类使用逐项复制)
quick_cocos引擎内部使用这样的方法,为几乎所有的cocos-2dx类做了封装,所以有cocos基础的童鞋可以随意使用从前的cocos方法。
关于成员使用点号还是冒号
细心的同学可能注意到了,我们使用self调用成员变量的时候,使用了“.”和“:”,这里lua是这样的,使用”:”时,默认地为你在参数表里面添加了self变量,当你的函数会使用类成员变量时,就请使用“:”。基本上所有的变量我们使用“.”,函数我们使用”:”,但也有特例,比如全局(静态)函数,类似于static修饰符,不会使用任何类成员。
什么?你没看懂我写的什么,没关系,后面的实践内容非常简单,到时候你会理解的
相关文章推荐
- 详解Lua中的表的概念及其相关操作方法
- Lua编程示例(二):面向对象、metatable对表进行扩展
- 把Lua编译进nginx步骤方法
- Lua脚本自动生成APK包
- Lua中的元表(metatable)、元方法(metamethod)详解
- Lua中的metatable介绍
- Lua中ipair和pair的区别
- Lua中的函数精讲笔记
- 浅谈Lua的面向对象特性
- 详解Lua中的变量相关知识点
- Lua脚本语言入门笔记
- Lua脚本调用外部脚本
- 详解Lua中的if语句的使用方法
- Lua中调用函数使用点号和冒号的区别
- Lua中的闭合函数、非全局函数与函数的尾调用详解
- Lua中强大的元方法__index详解
- Lua中调用C++函数示例
- Lua面向对象之类和继承浅析
- Lua性能优化技巧(一):前言
- nginx+lua+GraphicsMagick生成实时缩略图-CentOS7