下面三个步骤是在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)


冒号的作用很简单,就是在方法定义中添加一个额外的隐藏参数,以及在一个方法调用中添加一个额外的实参。




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