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

19 篇文章 0 订阅

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值