cocos lua 个人总结

* 关于and/or,注意返回的结果不是true或false,比如:

4 and 5       -- 5
nil and 1      -- nil 
false and 1   -- false
0 or false     -- 0,在lua中,只有false和nil被认为“假”
nil or fasle    -- false 
false or nil    -- nil 

-- and的计算结果为:第一个操作数为“false”,则返回第一个操作数
-- or的计算结果为:第一个操作数为“true”,则返回第一个操作数

* 关于lua表的初始化

-- 初始化方式一:
local strTab = { x= "1", y = "2", z = "3"}
-- 初始化方式二:
local strTab = {}
strTab.x = "1"
strTab.y = "2"
-- 总结:方式一种能够提前判断表的大小,速度会更快

* 关于获取随机数相关,请使用randomseed,否则随机会是伪随机。如下:

-- 获取当前系统时间,作为随机种子
math.randomseed(os.time()) 
-- 有三种方式:
-- 1. 不带参数调用时,获取的是[0,1)范围内的随机浮点数
-- 2. 带一个整型参数时,获取的是[1,n]范围内的随机整数
-- 3. 带两个整型参数m,n时,获取的是[m,n]范围内随机整数
-- 请注意,参数一定要为整数,否则会返回错误:
-- bad argument #1 to 'random' (number has no integer representation)
math.random(10, 30)

* 判断table是否为空,可使用next(***),比如: 

-- 注意:next从本质上来说,就是pairs遍历table时,用来获取下一个内容的方法
-- 因此使用next判断的话,不得赋予table新的元素,否则结果是未知的。
if tableData and next(tableData) ~= nil then 

* 如果出现类似于如下情况的,建议:

invalid 'cobj' in function 'lua_cocos2dx_Node_removeFromParentAndCleanup'
invalid 'cobj' in function 'lua_cocos2dx_Node_setPosition'
...
-- 以上原因是由于C++中的Node对象已经remove掉,而lua中的对象依然保留着该Node的数据,故此方法如下:

-- tolua.isnull 用于检查C++对象是否已经删除,倘若删除返回true,否则返回false
if not tolua.isnull(node) then
    -- do something
end 

-- 同理,针对于addChild的话,建议也对其进行判定,比如:
local layer = require("src/game/Demo"):create()
if not layer or not tolua.isnull(layer) then 
    return 
end 

在cocos lua中关于tolua的一些其他用法:

-- 用于返回C++对象类型的描述字符串,比如CCNode
tolua.type(node)  
-- 强制转换对象类型
tolua.cast(对象,类型名称)
-- 比如: 
local node = ...
tolua.cast(node, "ccui.Button")

 

* table删除元素:

不建议方式:

local datalist = {1,2,3,4,5,6,7,8,9,10,20}
for k, v in pairs(datalist) do
    if v % 2 == 0 then
        table.remove(datalist, k)
    end
end

table.foreachi(datalist,function(k,v)
    print("output value:"  .. v)
end)
输出结果:
[LUA-print] output value:1
[LUA-print] output value:3
[LUA-print] output value:5
[LUA-print] output value:7
[LUA-print] output value:9
[LUA-print] output value:20

会发现有的数据没有被删除,故此推荐如下方式:

local datalist = {1,2,3,4,5,6,7,8,9,10,20}
-- 方式一:从后往前删除
for i = #datalist,1, -1 do
    if datalist[i] % 2 == 0 then
        table.remove(datalist, i)
    end
end
local outStr = table.concat(datalist,",")
print(outStr)
-- 输出:1,3,5,7,9

-- 方式二: 使用while删除
local datalist = {1,2,3,4,5,6,7,8,9,10,20}
local i = 1
while i <= #datalist do 
    if datalist[i] % 2 == 0 then 
        table.remove(datalist, i)
    else 
        i = i + 1
    end 
end 
local outStr = table.concat(datalist,",")
print(outStr)
-- 输出:1,3,5,7,9

-- 如上方式,都使用了#,对其数据表进行了重新遍历

* 然后从程序优化效率的角度来说,某些情况下不推荐多次使用“#”,如下:

local sTab = {1,2,3,4,5}
if #sTab > 4 then 
    -- do something
end 

for index = 1, #sTab do 
    -- do something
end 

-- 此处代码从程序优化的角度来说,“#”每次都会遍历一次列表,如果要这样的使用的话,推荐如下代码:
local sTab = {1,2,3,4,5}
local tabNum = #sTab
if tabNum > 4 then 
    -- do something
end 

for index = 1, tabNum do 
    -- do something
end 

-- 即使目前的硬件配置很高,但对于程序员而言,即使能够优化0.01秒,也是份内的职责

* require 相关

--[[
有2个特性:
1. 加载文件
2. 避免重复加载文件
]]
-- 如果我想重复加载文件,实现方式:
package.loaded["app/LoginScene"] = nil 
require("app/LoginScene")

其他:

--[[
1. 对于资源,如果背景图过大,可将png替换为jpg。从效率来说,加载jpg比png更慢
(加载jpg,cocos需要将其转换为png,再加载),但是从容量上的确会省下很多 2. 请慎重使用自带的print,否则某些主要的信息会在你的Release版本中打印出去 3. 使用XMLHttpRequest请求时,请注意数据与UI的分离。
该请求为异步加载,比如你的微信多次请求登录,即使成功的从登录场景进入了游戏场景,
但是只要登录的任何数据只要返回,放心,你的bugly上总会给你各种错误的提示。
]]

 

posted @ 2018-01-14 18:22  Code~  阅读(1120)  评论(0)    收藏  举报