Lua(setmetatable,__index,self,元表)+(cocos2d + lua信息展示框的实现和显示)

下面三个步骤是在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)
在Lua中是基于table实现的模块,上面代码在table中定义了函数,table拥有了自己的操作。
a = Account
Account = nil
a.withDraw(100)
上面的操作会报错是因为前面定义函数时指定函数只能Account这个对象来调用,为了能让a能调用这个函数,我们就需要在函数中修改语句为a.balance = a.balance - v,这样太麻烦了。将上面的函数定义修改成下面self的方式:
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)
self这个关键字指定在调用该函数时,函数内的计算使用调用该函数的对象指定的table中的内容。
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)
冒号的作用很简单,就是在方法定义中添加一个额外的隐藏参数,以及在一个方法调用中添加一个额外的实参。

~~~~~~~~~~~~~~未完待续~~~~~~~~~~~~~~~~

你可能感兴趣的:(Lua(setmetatable,__index,self,元表)+(cocos2d + lua信息展示框的实现和显示))