这章主要讲cocos2d-x中场景的切换,做过ios开发经常会用到通过一些点击事件从而跳到另外一个界面,最熟悉的就是uibutton,下面讲下场景的切换其实和ios开发中的思想都差不多。
在cocos2d-x是通过CCMenu来创建一些菜单从而实现菜单的点击。CCMenuItem有很多的子类,比如:
CCMenuItemFont 文字菜单
CCMenuItemImage 图片菜单
CCMenuItemLabel 标签菜单
都可以加入到菜单CCMenu中去。。。。
下面掩饰一个 CCMenuItemFont 文字菜单的跳转
//创建文字菜单
CCMenuItemFont *item = CCMenuItemFont::create("开始游戏");//传一个参数
//添加到菜单栏里面
CCMenu *menu =CCMenu::create(item,NULL);//可以传多个
this->addChild(menu); //添加到当前的层
运行:
可以看到在屏幕的中间看到一个开始游戏菜单。
下面设置设置菜单的点击事件让点击时候跳到另外一个场景,这时的菜单创建时就要选择另外一个了。
函数原型:
CCMenuItemFont *item = CCMenuItemFont::create(<#const char *value#>, <#cocos2d::CCObject *target#>, <#SEL_MenuHandler selector#>)
看看 SEL_MenuHandler 要传的参数typedefvoid (CCObject::*SEL_MenuHandler)(CCObject*);
SEL_MenuHandler是一个函数指针 指向一个无返回值 函数参数为CCObject类型的函数
下面定义一个这样的函数:
在类里面定义:
class MainScene:publicCCLayer {
private:
void onMenuItem(CCObject *obj); //定义一个菜单点击事件
private:
void update(float t); //定义一个帧回掉函数
private:
CCSprite *sprite;
public:
virtual bool init(); //初始化
static CCScene* scene(); //类方法用来创建场景对象
CREATE_FUNC(MainScene); //创建MainScene层对象
};
函数实现:
//创建文字菜单
// CCMenuItemFont *item = CCMenuItemFont::create("开始游戏"); //传一个参数
CCMenuItemFont *item =CCMenuItemFont::create("开始游戏",this, menu_selector(MainScene::onMenuItem));//点击事件
//添加到菜单栏里面
CCMenu *menu = CCMenu::create(item,NULL);//可以传多个
this->addChild(menu); //添加到当前的层
//菜单点击事件
voidMainScene::onMenuItem(CCObject *obj)
{
CCLOG("开始游戏被点击了!!");
}
运行:
点击开始游戏 菜单可以看到信息被打印 输出:
知道点击会调用这个函数 下面在这个函数里改变场景就实现了场景的切换。
一、再添加一个场景
新建一个GameScene 类
类的声明:
using namespace cocos2d;
class GameScene:publicCCLayer
{
public:
//必须实现的三个函数
virtual bool init();
static CCScene *scene();
CREATE_FUNC(GameScene);
};
类的实现:
CCScene *GameScene::scene()
{
CCScene *scene = CCScene::create(); //场景
GameScene *layer = GameScene::create(); //层
scene->addChild(layer); //层添加到场景
return scene; //返回场景
}
boolGameScene::init()
{
if(!CCLayer::init())
{
return false;
}
CCSprite *sprite = CCSprite::create("Icon-72.png"); //创建一个精灵
CCSize winSize = CCDirector::sharedDirector()->getWinSize();//得到屏幕的宽高
sprite->setPosition(ccp(winSize.width/2, winSize.height/2));//设置位置
this->addChild(sprite); //添加精灵
return true;
}
有了前面的基础 这些基本的函数写法都会很熟悉了。
再回到MainScene.m 的onMenuItem函数
//菜单点击事件
voidMainScene::onMenuItem(CCObject *obj)
{
CCLOG("开始游戏被点击了!!");
CCScene *scene = GameScene::scene();//得到game场景
CCDirector::sharedDirector()->replaceScene(scene);//原场景释放掉跳转到新场景
}
运行:
点击开始游戏:
跳转到game场景
弹出的效果还可以修改:
//也可以
CCTransitionCrossFade *transitionScene =CCTransitionCrossFade::create(2, scene);//淡入淡出的效果
CCDirector::sharedDirector()->pushScene(transitionScene); //新场景在原先场景的后面
这里有很多效果 都可以去尝试场景的切换就写到这里。。