CC3.2+Lua(3) ——Lua之class

【唠叨】

在使用Lua的时候,cocos2d-x为我们提供了一个 class(classname, super) 这个函数。

它可以让我们很方便的定义一个类,或者继承cocos2d-x的某个类。

PS:class()是cocos2d-x为我们封装的函数,本身Lua没有这个函数。



【class】

class函数是在"cocos2d-x-3.2/cocos/scripting/lua-bindings/script/extern.lua"中定义的。


-- Create an class.

function class(classname, super)

local superType = type(super)

local cls

if superType ~= "function" and superType ~= "table" then

superType = nil

super = nil

end

if superType == "function" or (super and super.__ctype == 1) then

-- inherited from native C++ Object

cls = {}

if superType == "table" then

-- copy fields from super

for k,v in pairs(super) do cls[k] = v end

cls.__create = super.__create

cls.super    = super

else

cls.__create = super

end

cls.ctor    = function() end

cls.__cname = classname

cls.__ctype = 1

function cls.new(...)

local instance = cls.__create(...)

-- copy fields from class to native object

for k,v in pairs(cls) do instance[k] = v end

instance.class = cls

instance:ctor(...)

return instance

end

else

-- inherited from Lua Object

if super then

cls = clone(super)

cls.super = super

else

cls = {ctor = function() end}

end

cls.__cname = classname

cls.__ctype = 2 -- lua

cls.__index = cls

function cls.new(...)

local instance = setmetatable({}, cls)

instance.class = cls

instance:ctor(...)

return instance

end

end

return cls

end

在Lua中类的概念就是table表,而上面的函数代码主要做的就是对父类super的表进行拷贝,然后再定义了两个函数 cls.new(...)cls:ctor(...) 。如果我们不了解上面的代码,也是没有关系的,只要我们会使用它就够了。

0、使用方法

定义一个类:cls = class("类名","父类")

> 创建实例  :obj = cls.new()

初始化函数:cls:ctor()    在创建实例的时候,会自动调用

    只要掌握这三步骤,对于我们cocos2d-x的开发已经够用了!

1、创建基类

首先创建一个Hero类,然后重写Hero类的初始化函数Hero:ctor()

再创建一个Hero类的实例对象Hero.new() ,会自动调用初始化函数Hero:ctor() 。

测试输出。

注意:其中ctor()中出现的 self 为实例对象本身,就相当于C++类中的 this 。


2、继承父类

在cocos2d-x开发中,经常需要继承引擎中的类,如Layer、Sprite等。

这里举例,将上面的Hero类修改一下,继承自Sprite

3、再举个例子:继承Layer类

我一般习惯在 ctor() 中只声明一些类的成员变量。

然后再自定义一个函数 create() ,将 new() 进行封装,然后在 create() 中调用 init() 函数进行实例对象的初始化工作。

这样的好处就是:在使用上就和我在C++中的使用的方式一样了。

3.1、定义一个继承于Layer的类

3.2、使用方法

    > 创建包含GameLayer层的Scene场景:GameLayer:createScene()

    > 创建一个GameLayer层-----------GameLayer:create()

> 而在创建GameLayer时,也会调用自定义的初始化函数 init()

    > 类的成员变量,均在 ctor() 中进行声明即可。

3.3、代码下载

http://down.51cto.com/data/1886438



本文出自 “夏天的风” 博客,请务必保留此出处http://shahdza.blog.51cto.com/2410787/1566513

时间: 2024-10-06 13:16:51

CC3.2+Lua(3) ——Lua之class的相关文章

错误gcc -O2 -Wall -DLUA_COMPAT_ALL -DLUA_USE_LINUX -c -o lua.o lua.clua.c:67:31: error:

编译Lua时,出现这样的错误: gcc -O2 -Wall -DLUA_COMPAT_ALL -DLUA_USE_LINUX -c -o lua.o lua.clua.c:67:31: error: 查阅了一下,centOS上需要安装readline-devel ncurses-devel yum install readline-devel ncurses-devel 测试平台成功. [[email protected] lua-5.2.3]# make linux test cd src &

在C++使用LUA交互,LUA实现闭包,C++/LUA相互闭包

LUA可谓是配置文件神器,具体功能用过才知道,接近两年没用了抽了俩小时熟悉了下基本的用法. 包括C/LUA堆栈操作 函数相互调用 以及LUA的闭包 C++和LUA相互闭包 想要灵活使用LUA必须先要学习 LUA和C的堆栈交互模型 类似于汇编函数调用方式了 很有意思. 要学习LUA首先要理解LUA和C/C++交互的堆栈lua_State  这里引用网友的一篇文章很详细 http://wind-catalpa.blog.163.com/blog/static/11475354320131191031

FFLIB之FFLUA——C++嵌入Lua&扩展Lua利器[转]

摘要: 在使用C++做服务器开发中,经常会使用到脚本技术,Lua是最优秀的嵌入式脚本之一.Lua的轻量.小巧.概念之简单,都使他变得越来越受欢迎.本人也使用过python做嵌入式脚本,二者各有特点,关于python之后会写相关的文章,python对于我而言更喜欢用来编写工具,我前边一些相关的算法也是用python来实现的.今天主要讲Lua相关的开发技术.Lua具有如下特点: Lua 拥有虚拟机的概念,而其全部用标准C实现,不依赖任何库即可编译安装,更令人欣喜的是,整个Lua 的实现代码并不算多,

如何在Mac OS X 中运行Lua (Running Lua on Mac OS X)

参考文章:1) http://www.oschina.net/question/12_769552) http://rudamoura.com/luaonmacosx.html 最近在为iOS开发游戏,我的开发机是iPhone5.在开发的游戏项目中需要使用Lua语言,所以想在我的苹果MacBook Pro 中安装Lua语言的解释器,以便进行脚本调试.我的Mac OS X的版本是10.8.3.Lua 是一个轻量级的脚本语言,在游戏开发上使用非常多.它是开源的.我们可以下载它的源码进行编译. 到本文

【Lua】Lua中__index与元表(转)

转载于:http://blog.csdn.net/xocoder/article/details/9028347 Lua的表本质其实是个类似HashMap的东西,其元素是很多的Key-Value对,如果尝试访问了一个表中并不存在的元素时,就会触发Lua的一套查找机制,也是凭借这个机制,才能够实现“面向对象”的. 举例说明: tempTable = {} print(tempTable.memberA) --这里试图打印tempTable并不存在的成员memberA 执行结果:nil输出为nil的

让lua面向对象--lua和android

让lua面向对象 lua本身不支持面向对象的特性,但是由于lua是基于原型(prototype)的语言,要实现面向对象的特性也是有一定的方法的,实现方式有很多种, 总结了一下我最近对使用lua实现面向对象的特性,主要可以分为以下两种不同的方式来实现: 1.使用metatable的__index域实现,实现的时候需要利用的lua语言的一些特性才可以实现,主要有: a.将table b作为table a的一个prototype的方法:setmetatable(a, {__index = b}); b

CC3.2+Lua(8) ——Lua调用自定义C++类

[唠叨] 本节要讲的是如果将自己写的C++类注册进Lua环境,让Lua去调用自定义的C++类. 网上有很多都是用原始的tolua++工具来注册C++类的,我看了很多这样的教程,感觉操作起来十分麻烦,而且也很难看懂他们到底在讲什么. 其实,在cocos2dx v3.2版本中,提供了bindings-generator脚本来封装toLua++的用法,从而节省了工作量. [致谢] http://segmentfault.com/blog/hongliang/1190000000718145 (讲得非常

CC3.2+Lua(2) ——Lua基础语法1

[唠叨] 首先,我已经默认你已经学过至少一门宿主语言了(C++.Java等),然后转向学习Lua. 因为51cto中对于Lua语言没有代码高亮,为了让代码看起来丰富多彩,我只好用截图了. 本节内容仅介绍Lua的简单基础语法,更多用法请百度:Lua中文教程 . Lua参考手册 . [学习感慨]     > 语句末尾不需要加分号 ;      > 语句块不是用花括号 { } , 而是 do 语句块 end 表示语句块的开始和结束.         而 花括号 {} 表示的为一个 表结构 .    

【Lua】Lua + openresty遍历文件目录

OpenResty (也称为 ngx_openresty)是一个全功能的 Web 应用服务器,它打包了标准的 Nginx 核心,很多的常用的第三方模块,以及它们的大多数依赖项. 今天用OpenResty + lua来遍历指定目录,返回json字符串 我们用Lua来遍历文件目录,并用nginx来访问lua文件,使其返回这个目录的json字符串. Lua代码: 1 local lfs = require("lfs") 2 3 function getType(path) 4 return