关于cocostudio中demogame样例中ccmenu的位置的疑问分析

来源:互联网 发布:赛亚人网络 编辑:程序博客网 时间:2024/06/07 17:03

最近,看到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,今天花了不少时间,在这个小问题,希望可以帮助遇到同样问题的朋友。

原创粉丝点击