注: 个人博客园移植
- 关于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"
strTab[1] = 1,
strTab[10] = "str"
-- 总结:方式一种能够提前判断表的大小,速度会更快
- 关于获取随机数相关,请使用
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新的元素,否则结果是未知的。
-- 添加next的判定主要是为了检测{}
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 tab = {1,2,2,2,2,3}
for k, v in pairs(tab) do
if v == 2 then
table.remove(tab, k)
end
end
print(table.concat(tab, ",")) --1,2,2,3, 元素没有完全删除
会发现有的数据没有被删除,故此推荐:
-- 方式1
local tab = {1,2,2,2,2,3}
for i = #tab, 1, -1 do
if tab[i] == 2 then
table.remove(tab, i)
end
end
print(table.concat(tab, ",")) --1,3
-- 方式2
local tab = {1,2,2,2,2,3}
local i = 1
while i <= #tab do
if tab[i] == 2 then
table.remove(tab, i)
else
i = i + 1
end
end
print(table.concat(tab, ",")) --1,3
-- 如上方式,都使用了#,对其数据表进行了重新遍历
但注意:从程序优化效率的角度来说,某些情况下不推荐多次使用#
,如下:
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上总会给你各种错误的提示。