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));//设置在相对父节点的(50,50)位置  
  8. big->addChild(little);//big是父节点  


二、定时器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,1,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”,”w_b.png”,this,menu_selector(CCMainScene::menuCallback));
           
                CCMenuItemImage* pCloseItem3 = CCMenuItemImage::create(“w_b.png”,”w_b.png”,this,menu_selector(CCMainScene::menuCallback));

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

            CCMenu* pMenu = CCMenu::create(pCloseItem1,pCloseItem2,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;
      }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值