Cocos2d-x::坐标系、定时器、菜单

前端之家收集整理的这篇文章主要介绍了Cocos2d-x::坐标系、定时器、菜单前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
一、绝对坐标系和相对坐标系的关系

  1. CCSprite*big=CCSprite::create("big.png");
  2. big->setAnchorPoint(ccp(0,0));
  3. big->setPosition(ccp(50,50));//设置在相对父节点的(50,50)位置
  4. this->addChild(big);//屏幕是父节点
  5. CCSprite*little=CCSprite::create("little.png");
  6. little->setAnchorPoint(ccp(0,0));
  7. little->setPosition(ccp(50,50)位置
  8. big->addChild(little);//big是父节点
  9. @H_301_85@


    二、定时器schedule

    CCNode内部封装了一个
    CCScheduler* m_pScheduler;

    1.更新定时器
    //开启定时器
    this->schduleUpdate();

    //update
    void HelloWorld::update(float delta)
    {
    CCLog(“%f”,delta);
    }

    2.自定义定时器
    //开启定时器,延时2s执行,执行3+1次,执行间隔1s
    this->schedule(schedule_selector(HelloWorld::log),1,3,2);
    //回调函数
    void HelloWorld::log(float dt)
    {
    CCLog(“schedule”);
    }

    3.schedule_selector和SEL_SCHEDULE
    #define schedule_selector(_SELECTOR) (SEL_SCHEDULE)(&_SELECTOR)
    该宏把函数指针转化为SEL_SCHEDULE型指针

    typedef void (CCObject::*SEL_SCHEDULE)(float);
    定义了一个带有float参数的函数指针,在使用自定义Schedule的时候,回调一定要带上一个float参数,它记录了两次执行的间隔

    4.谁来调用回调函数
    但是有没有发现,如果这个回调函数是个全局函数或者static函数也就算了,偏偏它是个成员函数,成员函数需要实例来调用,可是从调用方法来看,好像没传入调用对象?
    是的,还记得一开头说的CCNode内部封装的m_pScheduler吗?

    三、CCMenu的布局

    1.CCMenu是cocos2d-x的菜单类,它本身不具备菜单具体属性,但是它会作为一个父节点,将具体类型菜单添加进去;使用时,我们先创建子菜单项CCMenuItem,然后加入到CCMenu,最后将CCMenu加入到CCLayer;
    如直接将CCMenuItem加入到层,则无法响应回调, 因为CCMenu是继承至CCLayer,也就继承了触摸的相关事件,而CCMenuItem只是从CCNode继承而来,并不响应触摸,因此无法调用回调函数

    2.子菜单


    3.CCMenu的锚点为(0,0),而CCMenuItem的锚点为(0.5,0.5)
    CCMenu包含了多个子菜单项,每个子菜单的位置都不一样,如果定义了CCMenu的位置,那它作为父节点会影响到所有的子菜单的位置,因此我们一般把它设置在原点处,然后通过设置子菜单的位置(也就是相对父节点的偏移量)来定位整个菜单

    4.多个子菜单的排列
    (1)横向排列,纵向排列,指定间隔
    CCMenuItemImage* pCloseItem1 = CCMenuItemImage::create(
    “CloseNormal.png”,
    “CloseSelected.png”,
    this,
    menu_selector(HelloWorld::menuCloseCallback));
    CCMenuItemImage* pCloseItem2 = CCMenuItemImage::create(
    “CloseNormal.png”,
    “CloseSelected.png”,
    this,
    menu_selector(HelloWorld::menuCloseCallback));
    CCMenu* pMenu = CCMenu::create(pCloseItem1,pCloseItem2,NULL);
    • pMenu->alignItemsHorizontally();//默认间隔是kDefaultPadding=5
    • //pMenu->alignItemsHorizontallyWithPadding(20);//指定间隔
    • //pMenu->alignItemsVertically();//默认间隔也是kDefaultPadding=5
    • //pMenu->alignItemsVerticallyWithPadding(20);//指定间隔
    this->addChild(pMenu,1);
    (2)按行排列,按列排列
    CCMenu* pMenu = CCMenu::create(p1,p2,p3,p4,p5,p6,NULL);
    pMenu->alignItemsInRows(3,2,NULL);
    this->addChild(pMenu,1);

    四、菜单选项卡

    使用CCLayerMultiplex来实现;
    bool CCManinScene::init()
    {
    bool bRet=false;
    do
    {
    CC_BREAK_IF(!CCScene::init());
    //创建三个层的实例
    _layer1=CCLayer1::create();
    _layer2=CCLayer2::create();
    _layer3=CCLayer3::create();
    //创建多层布景层
    _layerMuticomplex = CCLayerMultiplex::create(_layer1,_layer2,_layer3,NULL);
    this->addChild(_layerMuticomplex);

    CCSize visibleSize = CCDirector::sharedDirector()->getVisibleSize();
    CCPoint origin = CCDirector::sharedDirector()->getVisibleOrigin();
    CCMenuItemImage* pCloseItem1 = CCMenuItemImage::create(“w_b.png”,”w_b.png”,this,menu_selector(CCMainScene::menuCallback));
    CCMenuItemImage* pCloseItem2 = CCMenuItemImage::create(“w_b.png”,menu_selector(CCMainScene::menuCallback));
    CCMenuItemImage* pCloseItem3 = CCMenuItemImage::create(“w_b.png”,menu_selector(CCMainScene::menuCallback));

    pCloseItem1->setTag(0);
    pCloseItem2->setTag(1);
    pCloseItem3->setTag(2);

    CCMenu* pMenu = CCMenu::create(pCloseItem1,pCloseItem3,NULL);
    pMenu->alignItemsHorizontallyWi thPadding(-1);
    pMenu->setPosition(visibleSize.width/2,25);
    this->addChild(pMenu,1);//菜单要在场景中添加而不是在布景中,而且z轴要高于多层布景,保证可见;
    }while(0);
    return bRet;
    }

    void CCMainScene::menuCallback(CCObject* pSender)
    {
    int item=((CCmenuItemImage* )pSender)->getTag();
    if(item!=curLayerPos)
    {
    _layerMuticomplex->switchTo(item);
    curLayerPos=item;
    }
    }

猜你在找的Cocos2d-x相关文章