cocos2d-x细节之不能设置触摸优先级隐晦bug

LUA_API int setNodePRI(lua_State * L)
{
    TouchSprite * del = static_cast<TouchSprite*>(lua_touserdata(L, 1));
    jassert(del && del->getParent()); 
    int pri = lua_tointeger(L, 2);
    JLayer * layer = static_cast<JLayer*>(del->getParent());
    jassert(layer);
    CCTouchDispatcher * dispatcher = CCDirector::sharedDirector()->getTouchDispatcher();
    //尼玛莫名奇妙呀
    jassert(dispatcher->findHandler(del)); 
    dispatcher->setPriority(LAYER_MAX-layer->getLayerOrder().y + pri, del);
    return 0;
}

这段代码跑过无数次了,一直都很正常,然而今天这里却发生一个异常。

CCDirector::sharedDirector()->getTouchDispatcher()找不到del的handler,在jassert(dispatcher->findHandler(del)); 处发生异常。

这实在是奇怪,前面刚刚注册了del的touch回调的。代码一切都很正常,为什么会出现异常呢?

没办法,只好一头扎进cocos2d-x的源码里面寻找真相了。

addTargetedDelegate函数在添加pDelegate指针时会有一个判定:

if (! m_bLocked) { forceAddHandler(pHandler, m_pTargetedHandlers); } else { ...m_pHandlersToAdd->addObject(pHandler);

调试发现代码走的是第二条路线,怎么,上锁了?

唯一能上锁的地方位于:

void CCTouchDispatcher::touches(CCSet *pTouches, CCEvent *pEvent, unsigned int uIndex){ CCAssert(uIndex >= 0 && uIndex < 4, ""); CCSet *pMutableTouches; m_bLocked = true;

这才恍然大悟,原来我是在Layer的touch事件中添加一个精灵,并为该精灵注册touch回调,此时CCTouchDispatcher处于上锁状态,因此注册不上。

那该如何处理呢?

只能通过别的方式绕过去了。修改cocos2d-x的源代码并不是好事,自己的逻辑还是写在自己的代码里面吧:)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值