最近,看到cocostudio 这个神器出来,具体很神奇,就看了一下他的例子,其中关于demogame这个例子中,有一段百思不得其解,纳闷。
由于研究cocos2dx只是副业(目前来说) 有些东西可能已经忘了差不多。主要其中关于这段代码
CCMenuItemImage *pCloseItem = CCMenuItemImage::create("CloseNormal.png","CloseSelected.png",
this,
menu_selector(StageBasic::menuTestCallback));
pCloseItem->setPosition(ccp(CCDirector::sharedDirector()->getVisibleSize().width*0.5 - pCloseItem->getContentSize().width/2 ,CCDirector::sharedDirector()->getVisibleSize().height * 0.5 - pCloseItem->getContentSize().height/2));
this->addChild(CCMenu::create(pCloseItem,NULL),4);
实际的运行效果是这样的
但是,从代码上,都应该显示在中间的大概位置(其有减去自身半长),查了好多资料也没有一个相关问题的。后从CCMenu着手。看到起初始化有一段代码,如下
bool CCMenu::initWithArray(CCArray* pArrayOfItems)
{
if (CCLayer::init())
{
setTouchPriority(kCCMenuHandlerPriority);
setTouchMode(kCCTouchesOneByOne);
setTouchEnabled(true);
m_bEnabled = true;
// menu in the center of the screen
CCSize s = CCDirector::sharedDirector()->getWinSize();
this->ignoreAnchorPointForPosition(true);
setAnchorPoint(ccp(0.5f, 0.5f));
this->setContentSize(s);
setPosition(ccp(s.width/2, s.height/2));
这下,豁然开朗了,原来CCMenu默认是放在中间的,默认锚点是(0.5,0.5),但是不启用。所以现在上面的对面就可以解释了,CCMenu已经是在中间了,加上(width/2 - contentsize/2, height/2 - contentsize/2)刚好是右上角,而为什么要减自身半长,那是因为CCMenuItemImage是启用锚点(0.5,0.5)的,
bool CCMenuItem::initWithTarget(CCObject *rec, SEL_MenuHandler selector)
{
setAnchorPoint(ccp(0.5f, 0.5f));
m_pListener = rec;
m_pfnSelector = selector;
m_bEnabled = true;
m_bSelected = false;
return true;
}
而锚点默认是启用的
那么现在来测试一下吧,吧上面的测试代码稍作修改
CCMenuItemImage *pCloseItem = CCMenuItemImage::create("CloseNormal.png","CloseSelected.png",
this,
menu_selector(StageBasic::menuTestCallback));
pCloseItem->setPosition(ccp(CCDirector::sharedDirector()->getVisibleSize().width*0.5 - pCloseItem->getContentSize().width/2 ,CCDirector::sharedDirector()->getVisibleSize().height * 0.5 - pCloseItem->getContentSize().height/2));
CCMenu* pMenu = CCMenu::create(pCloseItem,NULL);
pMenu->setPosition(CCPointZero);
this->addChild(pMenu,4);
这里我把CCMenu设置到屏幕的左下角。那我们再看看实际的效果如下
ok,今天花了不少时间,在这个小问题,希望可以帮助遇到同样问题的朋友。