【步兵 lua】利用脚本的优势 by EOS.
刚开始从c++转到lua的同学,可能会因为习惯了严格的写法,
从而使得脚本很多的灵活之处没有被发挥出来,那么就让我来教坏你吧。
(ps:脚本用多了不知道会不会回不去了= =、,好久没碰C艹了)
参数
--参数可以是不确定类型的
function node:setSize(size, height)
if height then
local width = size
self.size.width = width
self.size.height = height
else
self.size = size
end
end
--当然你也可以用type来区别做一些处理
function node:setTag(tagOrName)
if type(tagOrName) == "string" then
node:setName(tagOrName)
else
node:setTag(tagOrName)
end
end
--又或者不确定个数
function newButton(spNormal, spSelected, clickEvent)
if type(spSelected) == "function" then
clickEvent = spSelected
spSelected = nil
end
--...
end
表拓展
-- 类拓展
local expandNode = function(node)
function node:addTo(paret, layout, offset, zorder, tagOrName)
print("papapa~")
-- 逻辑省略
end
end
ess = function(width, height)
return {width = width, height = height}
end
newNode = function(size)
local ret = {
size = {width = 0, height = 0}
}
if size then ret.size = size end
expandNode(ret)--拓展node
return ret
end
--测试
print"nodeTest:"
local node = newNode(ess(100, 200))
print(node.size.width)
node:addTo(xx)
运行结果:
比如说我,就直接把一个button,然后加表拓展,成功的实现了标签页的功能。
再比如,创建一个列表的cell,然后直接 function cell:fresh(data),很方便。
但是一定要在高内聚的前提下,不要东边加一个东西,过一会西边又加一个东西,
这简直是在作死=、=(no zuo no die, don’t try)
用表来做参数
newLabel_deprecation = function(input, fontName, fontSize, fontColor, labelSize)
end
假如参数是这样的话,那么我创建可能每次都输入 fontName
即使有默认值 fontSize = fontSize or 32
那也要 newLabel_deprecation(“123”, nil, nil, “ff0000”)
这样看起来并不舒服,(当然也可以选择二次封装)
所以当参数过多时候,顺序结构就限制了可读性
下边就是结合前边的综合应用了。
-- lua lu
-- 类拓展
local expandNode = function(node)
function node:addTo(paret, layout, offset, zorder, tagOrName)
print("papapa~")
if type(paret) == "table" then
local tb = paret
paret, layout, offset, zorder, tagOrName
= tb[1], tb[2], tb[3], tb[4], tb[5], tb[6]
print(paret, layout, offset, zorder, tagOrName)
end
-- 逻辑省略
end
-- 参数可以是不确定类型的
function node:setSize(size, height)
print("ssssss~")
if height then
local width = size
self.size.width = width
self.size.height = height
else
self.size = size
end
end
end
--用表当参数
print"labelTest:"
--映射字典
local mapDic = {
size = "setSize",
addTo = "addTo"
--..其他就不列举了
}
newLabel = function(args)
local ret = newNode()
for k,v in pairs(args) do
ret[mapDic[k]](ret, v)
end
return ret
end
local label = newLabel{
size = ess(20, 2016),
addTo = {"parentNode", "acc", "nil", "-1", "testLabel"}
--..其他属性省略
}
--ps:链式编码 say gu bye~(假装说再见=、=)
print(label.size.height)
运行结果:
另辟蹊径
把东西功能内聚起来~
function Layer:initNet()
-------------FUNC1---------------
function self:reqs_Fuc1()
end
local function recv_Fuc1()
end
Net:addListener(Code.Fuc1,recv_Fuc1)
-------------FUNC2---------------
--...
end
又或者这么玩?
print""
print"PlayerTest:"
local AbilityDic = {
Fly = 1
}
newPlayer = function(name)
local ret = {}
ret.name = name
function ret:walk()
print(self.name .. " walk")
end
function ret:canFly()
return self.fly ~= nil
end
function ret:expand(AbilityTag)
if AbilityTag == AbilityDic.Fly then
if self:canFly() then return end
function ret:fly()
print(self.name .. " fly")
end
end
end
return ret
end
local eos = newPlayer("eos")
eos:walk()
print(eos:canFly() and "can fly" or "can't fly")
eos:expand(AbilityDic.Fly)
print"test again"
print(eos:canFly() and "can fly" or "can't fly")
eos:fly()
--当然也可以这样,假装在写js、、 = 3=
_= eos.fly and eos:fly()
运行结果:
结语
可能还有想到的地方,暂时就这样,如果以后再有什么好想法,继续出(续)~
话说这篇已经不短了=、= 那么!
See Again~
之前
真爱无价,欢迎打赏~