cocos lua 个人总结

本文介绍了Lua中and/or运算符的规则,表的两种初始化方式以及其性能差异,强调了随机数生成时设置随机种子的重要性。同时,讨论了tolua在C++与Lua交互时的对象判定技巧,以及如何优化表元素删除和避免多次使用#符号提高效率。此外,还提到了require的特性以及资源管理和网络请求的注意事项。
摘要由CSDN通过智能技术生成

注: 个人博客园移植


  • 关于and/or,注意返回的结果不是 truefalse ,比如:
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上总会给你各种错误的提示。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

鹤九日

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值