环境是quick-3.5
一、cc(self) 乱调用
在framework下的cc目录下的init.lua中 给cc定义了一个原方法_call
local GameObject = cc.GameObject
local ccmt = {}
ccmt.__call = function(self, target)
if target then
return GameObject.extend(target)
end
printError("cc() - invalid target")
end
setmetatable(cc, ccmt)
可以看出在调用cc()的时候会运行函数 主要功能是GameObject.extend(target)
跳转到GameObject中 我们看到这个扩展知识针对组件功能的扩展 其中有一句代码target.components_ = {}
这个可以看出 每一次运行cc(target)的时候 都会对target的组件进行一次空表赋值 所以乱掉是有问题的
二、callback的处理bug
举个例子:网络请求管理一般是一个全局的
在 RoomLayer里面我去请求开始游戏 在网络请求期间 用户因为某种原因退出了房间(被踢了。。)
但是网络请求返回了失败 这个时候可能在 Roomlayer的失败回调中有失败处理 但是RoomLayer已经被释放了 这个时候就会lua报错
function GameCenterNetManager:registerMatchCallback(callback)
self.m_mathch_callback = callback
end
function GameCenterNetManager:gotoMatch(gameid, bShowWaitStatus, callback)
-- 先清理一下房间内的信息
center.room:Instance():clearData()
self:registerMatchCallback(callback)
if gameid then
self:setMatchGameID(gameid)
end
local verNo = center.gameVM:Instance():getGameVersion(self.m_current_gameid)
route = center.const.ROUTE.ROUTE_MATCHGAME
local function requestCallback(msg)
if msg.ret == 0 then
center.room:Instance():init(msg)
end
if self.m_mathch_callback then
self.m_mathch_callback(msg)
end
end
local requestData = {
route = route,
params = {
gameId = self.m_current_gameid,
verNo = verNo,
},
callback = requestCallback,
timeout = 30,
showWaitStatus = bShowWaitStatus
}
if center.room:Instance():isFirstMatch() then
requestData.params.first = 1
end
center.netm:Instance():request(requestData)
end
这边暂时的方案是 提供一个回调变量 在页面退出的时候 将回调变量清为nil 这样就不会调用了
三、TableView的问题
TableView效率比ListView效率更高 数据更灵活 但是在cocos中截图分享有问题 这个自己实现一下就好了
TableView需要重新实现一些函数 其中有一个cc.TABLECELL_SIZE_FOR_INDEX 也就是tableCellSizeForIndex
在3.5中去参数有问题
原因是因为 lua跟C++数据交互是通过栈的形式
LuaEngine::getInstance()->handleEvent(ScriptHandlerMgr::HandlerType::TABLECELL_SIZE_FOR_INDEX, (void*)&data,2,[&](lua_State* L,int numReturn){
CCASSERT(numReturn == 2, "tableCellSizeForIndex return count error");
ValueVector vec;
width = (float)tolua_tonumber(L, -1, 0);
lua_pop(L, 1);
height = (float)tolua_tonumber(L, -1, 0);
lua_pop(L, 1);
});
通过上面的代码 我们看到C++获取参数的时候将栈顶传给了width,栈的第二个元素传给了height
这就意味着 lua中我的传参顺序应该是height、width 这与我们平时使用的size 习惯不一样
修改方法就是更改C++中的参数获取
width = (float)tolua_tonumber(L, -2, 0);
height = (float)tolua_tonumber(L, -1, 0);
lua_pop(L, 2);
或者
height = (float)tolua_tonumber(L, -1, 0);
lua_pop(L, 1);
width= (float)tolua_tonumber(L, -1, 0);
lua_pop(L, 1);
另外注意:我在看315代码的时候发现这个问题已经被修复了
四、listView跟TableView中item点击事件吞噬 本身滑动功能的问题
问题1.吞噬事件
解决方法: 在对应的点击响应控件中添加setSwallowTouches(false)
问题2.解决吞噬事件之后再移动控件的时候如果 移动开始点击的位置 跟移动结束点击的位置都在同一个控件上会响应点击
解决方法:我在item里面添加了cc.EventListenerTouchOneByOne:create()事件监听
在touchbegin的时候 判断点击位置是否在控件内 记录点击位置
在onTouchEnded的时候判断位置移动大小 超过一定像素 认为移动距离过大 不响应点击事件
问题3.item超出裁剪界面依然还是会响应点击事件
解决方法:暂时是通过传入父节点 的方式解决
另外需要注意一点:listview加载子节点的时候务必用定时添加 否则item数目过大会卡
五、Label的问题
1.Label的字数限制 超过1000多个显示不出来 应该分段显示
2.Label字体的大小没办法精确计算 按照设计思想来说 fontsize = 40的话 那么 单个的汉字应该显示出来之后获取的contentsize应该是40但是实际上几乎大部分汉字都不是同一个size 而且不同的字体不一样
六、截屏的问题
在cocos中我想截右下角的某个矩形是没办法实现的 我们只能截取从左下角为起点的指定size的矩形 然后选择显示截取下来矩形的某个部分
七、C++二进制 跟lua交互不能直接使用string 原因是会被0截断 求不出长度
八、UI系列的控件不能通过更改GlobalZOrder来改变显示层级顺序
九、输入框的问题
cocos自带EditBox输入框 在安卓上存在bug 在send模式的时候 return 会被回调多次
并且如果页面因为某种原因被退出的时候 cocos弹窗的输入框不会被释放 响应函数依旧会相应 但是页面被释放 逻辑肯定也会报错
coocssutdio的textfiled控件 最大的问题是 假设没有安装输入法 基本上这个是用不了的输入法(iphone上是这样 android我没有看)