CCMenu setHandlerPriority 执行assert问题
将源码贴上
bool ASCcHelpScene::init(CCLayer* aLevelOneLayer)
{
if(!CCLayer::init())
{
return false;
}
this->setTouchEnabled(true);
//Add close button
CCSprite* unSelectedButton = CCSprite::create("helpClose.png");
CCSprite* selectedButton = CCSprite::create("helpClose.png");
selectedButton->setColor(ccGRAY);
CCMenuItem* itemClose = CCMenuItemSprite::create(unSelectedButton, selectedButton,this,menu_selector(ASCcHelpScene::closeButtonClicked));
itemClose->setAnchorPoint(kZeroPoint);
itemClose->setPosition(ccp(205,125));
closeButton = CCMenu::create(itemClose,NULL);
closeButton->setAnchorPoint(ccp(0,0));
closeButton->setPosition(ccp(0,0));
this->addChild(closeButton,1026);
return true;
}
void ASCcHelpScene::onEnter()
{
//Add this to touchDispatcher and adjust the touch priority
CCLayer::onEnter();
//In order not to crash because of the register in touchDispatcher
closeButton->setHandlerPriority(kFirstRespondTouch - 1);
}
总是在执行到红色代码部分中断
显示的错误是Assertion failed: (handler != __null), function setPriority
然后我就一步一步跟踪代码,发现在这句话执行的过程的时候CCMenu根本就没有添加到touchDispatcher队列里,不知道为什么。程序中有一个类也是类似的写法,但是没有问题,不知道为什么。我是修改的cocos2d-iphone的程序到cocos2d-x,cocosd-iphone没有问题。
我后来查资料,上群里边问,有如下解决方案,仍是无济于事
1.http://cocos2d.cocoachina.com/bb … viewthread&tid=1959,这个帖子说是执行时序问题,将其推后一段时间执行,我照着做了,还是没有效果,不管我推后多长时间,时间一到,还是崩溃
2.聊天群中 一位聊友是这么说的:
我问了下其他朋友,他们是这么做的,将CCMenu的create放到onEnter()方法里。就不会crash。具体的顺序就是 1 CCMenu::create; 2 CCLayer::onEnter(); 3 menu->setHandlerPriority()
我也试了,还是一样的崩溃
3.在cocos2d-x官网英文论坛上
http://www.cocos2d-x.org/boards/6/topics/18634
http://www.cocos2d-x.org/boards/6/topics/12661
http://www.cocos2d-x.org/boards/6/topics/12092
我可能没有看懂,也没找到解决方案,希望大神帮忙给分析分析是什么原因