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是父节点


二、定时器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;
}
}

相关文章

    本文实践自 RayWenderlich、Ali Hafizji 的文章《...
Cocos-code-ide使用入门学习地点:杭州滨江邮箱:appdevzw@1...
第一次開始用手游引擎挺激动!!!进入正题。下载资源1:从C...
    Cocos2d-x是一款强大的基于OpenGLES的跨平台游戏开发...
1.  来源 QuickV3sample项目中的2048样例游戏,以及最近《...
   Cocos2d-x3.x已经支持使用CMake来进行构建了,这里尝试...