您的位置:首页 > 移动开发 > Cocos引擎

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 脚本语言