下面三个步骤是在cocos2d +lua的开发环境中实现一个信息展示框,并把它显示出来的实现方法:
- 在项目中有一个通用的面板类baseDialog.lua文件),如下:
baseDialog={}
function baseDialog:new()
local nc={
bgLayer=nil, --背景sprite
dialogLayer, --对话框层
panelLineBg,--底框
}
setmetatable(nc,self)
self.__index=self
return nc
end
function baseDialog:init(bgSrc,isfullScreen)
self.dialogLayer=CCLayer:create()
--添加按钮,背景等
return self.dialogLayer--展示框所在层
end
function baseDialog:resetTab()
end
--用户处理特殊需求
function baseDialog:doUserHandler()
end
- 具体要显示的面板的实现如下(ADialog.lua文件):
ADialog=baseDialog:new()
function ADialog:new()
local anc={}
setmetatable(anc,self)
self.__index=self
self.tab1=nil
self.tab2=nil
return anc
end
function ADialog:resetTab()
end
- 显示面板:
local td=ADialog:new()
local dialog=td:init("panelBg.png",true)
sceneGame:addChild(dialog,3)--添加的sceneGame上的是一个CCLayer(层)
知识点总结:
setmetatable(anc,self)--设置self为anc的元表,定义一些操作方法
self.__index=self--__index是元方法,self.__index=self用来告诉编译器如果anc中查找不到就去self中找,如果self中也找不到就去self的元方法中寻找,以此类推,一直到没有元方法就返回nil
Lua查找一个表元素的规则:
1.在表中查找,如果找到,返回该元素,找不到则继续
2.判断该表是否有元表,如果没有元表,返回nil,有元表则继续
3.判断元表有没有__index方法,如果__index方法为nil,则返回nil(注意:只设置元表,若没有_index方法,就不会去元表中查找);如果__index方法是一个表,则重复1、2、3;如果__index方法是一个函数,则返回该函数的返回值
lua的查找机制是(例如td:init()在ADialog的普通表anc中查找init方法,先在ADialog类中寻找init方法,如果ADialog中有该方法就直接执行该方法,否则就去baseDialog中查找,如果baseDialog中也没有,就返回nil)
self lua中实现面向对象
http://www.jellythink.com/archives/529这篇博文对于Lua中的面向对象编程讲解的很详细,有时间可以多看看
下面是我看完后的一些总结:
local tb1 = {a = 1, b = 2}
local tb2 = {a = 1, b = 2}
local tb3 = tb1
if tb1 == tb2 then
print("tb1 == tb2")
else
print("tb1 ~= tb2")
end
tb3.a = 3
print(tb1.a)
上述代码会输出tb1 ~= tb2,说明两个具有相同值的对象是两个不同的对象。
上述代码输出tb1.a的值为3,说明Lua中的table是引用类型的,将tb1赋值给tb3以后,tb1和tb3就都指向了{a=1,b=2}这个代码块,都可以操作里面的a或b的值;如果这时将tb1或tb3赋值为nil,那么就是取消了tb1或tb3对于{a=1,b=2}代码块的引用,之后就不能再操作table中的值了。
Account = {balance = 0}
function Account.withDraw(v)
Account.balance = Account.balance - v
end
Account.withDraw(10) -- 调用函数
print(Account.balance)
a = Account
Account = nil
a.withDraw(100)
Account = {balance = 0}
function Account.withDraw(self, v)
self.balance = self.balance - v
end
a = Account
Account = nil
a.withDraw(a, 100)
print(a.balance)
lua中通过将Account.withDraw修改成Account:withDraw来隐藏self。
所以我们现在经常看到的代码是这样滴:
Account = {balance = 0}
function Account:withDraw(v) -- 注意这里的冒号":"
self.balance = self.balance - v
end
a = Account
Account = nil
a:withDraw(100) -- 注意这里的调用时,也需要冒号":"
print(a.balance)
冒号的作用很简单,就是在方法定义中添加一个额外的隐藏参数,以及在一个方法调用中添加一个额外的实参。
~~~~~~~~~~~~~~未完待续~~~~~~~~~~~~~~~~