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上总会给你各种错误的提示。 ]]

浙公网安备 33010602011771号