07/07/2017 cocos遇到的坑的一些分享

来源:互联网 发布:学日语 知乎 编辑:程序博客网 时间:2024/06/06 04:03
环境是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我没有看)





原创粉丝点击