标签:
| 版权声明:本文为博主原创文章,未经博主允许不得转载。
Scene场景也是cocos2dx中必不可少的元素,游戏中通常我们需要构建不同的场景(至少一个),游戏里关卡、版块的切换也就是一个一个场景的切换,就像在电影中变换舞台和场地一样。场景的一个重要的作用就是流程控制的作用,我们可以通过Director的一系列方法控制游戏中不同的场景的自由切换。下面是Director控制场景的常用方法:
runWithScene( Scene *scene ) /*启动游戏,并运行scene场景。本方法在主程序第一次启动主场景的时候调用。如果已有正在运行的场景则不能调用该方法;会调用pushScene-->startAnimation。*/ pushScene( Scene *scene ) /*将当前运行中的场景暂停并压入到代码执行场景栈中,再将传入的scene设置为当前运行场景,只有存在正在运行的场景时才调用该方法;*/ replaceScene( Scene *scene ) /*直接使用传入的scene替换当前场景来切换画面,当前场景被释放。这是切换场景时最常用的方法。*/ popScene() /*释放当前场景,再从代码执行场景中弹出栈顶的场景,并将其设置为当前运行场景。如果栈为空,直接结束应用。和PushScene结对使用 */ end() //释放和终止执行场景,同时退出应用 pause() //暂停当前运行场景中的所有计时器和动作,场景仍然会显示在屏幕上 resume() //恢复当前运行场景的所有计时器和动作,场景仍然会显示在屏幕上
同时场景是层的容器,包含了所有需要显示的游戏元素。通常,当我们需要完成一个场景时候,会创建一个Scene的子类,并在子类中实现我们需要的功能。比如,我们可以在子类的初始化中载入游戏资源,为场景添加层,启动音乐播放 等等。
Scene来是Node的一个子类。和Node相比,Scene只是添加了一个特性,它拥有自己的锚点,位置在运行窗口屏幕的正中央。除此之外,再也没有额外的功能,只是一个抽象的概念
新建,运行一个场景的方法:
使用AppDelegate类中的applicationDidFinishLaunching函数中调用上一步定义的方法,并使用导演类的runWithScene方法运行场景,如下
Scene* MyGame::createScene() { //新建场景的实例 auto scene = Scene::create(); //定义布景层 auto layer = MyGame::create(); //将布景层加入场景 scene->addChild(layer); //返回场景类 return scene; } // create a scene. it‘s an autorelease object auto scene = MyGame::createScene(); // run director->runWithScene(scene);
场景的切换:
首先我们建立一个要切换新的Scene:
StartGame.h
#ifndef _START_GAME_SCENE_H_ #define _START_GAME_SCENE_H_ #include "cocos2d.h" class MyGameBegin : public cocos2d::Layer { public: static cocos2d::Scene* createScene(); virtual bool init(); void startMenuItemback(cocos2d::Ref* pSender); CREATE_FUNC(MyGameBegin); }; #endif //_START_GAME_SCENE_H_
StartGame.cpp
#include "Startgame.h" USING_NS_CC; Scene* MyGameBegin::createScene() { auto startScene = Scene::create(); auto startLayer = MyGameBegin::create(); startScene->addChild(startLayer); return startScene; } bool MyGameBegin::init() { if (!Layer::init()) { return false; } Size startSize = Director::getInstance()->getVisibleSize(); Vec2 startOrigin = Director::getInstance()->getVisibleOrigin(); auto startSprite = Sprite::create("bg2.png"); startSprite->setPosition(Vec2(startSize.width / 2 + startOrigin.x, startOrigin.y + startSize.height / 2)); float xs = startSize.width / startSprite->getContentSize().width; float ys = startSize.height / startSprite->getContentSize().height; startSprite->setScale(xs, ys); this->addChild(startSprite); return true; }
MyGameScene.h
#ifndef _MYGAME_SCENE_H_ #define _MYGAME_SCENE_H_ #include "cocos2d.h" class MyGame : public cocos2d::Layer { public: static cocos2d::Scene* createScene(); virtual bool init(); void startMenuItemback(cocos2d::Ref* pSender); //start的回调函数,在这里切换场景 void helpMenuItemback(cocos2d::Ref* pSender); //点击start的回调函数 void exitMenuItemback(cocos2d::Ref* pSender); //点击start的回调函数 CREATE_FUNC(MyGame); }; #endif // _MYGAME_SCENE_H_
MyGameScene.cpp
#include "MyGameScene.h" #include "StartGame.h" //要包含切换场景的头文件 USING_NS_CC; Scene* MyGame::createScene() { auto scene = Scene::create(); auto layer = MyGame::create(); scene->addChild(layer); return scene; } bool MyGame::init() { if (!Layer::init()) { return false; } Size visibleSize = Director::getInstance()->getVisibleSize(); Vec2 origin = Director::getInstance()->getVisibleOrigin(); //设置Sprite auto bg = Sprite::create("bg1.png"); bg->setPosition(Vec2(visibleSize.width / 2 + origin.x, visibleSize.height / 2 + origin.y)); //下面是将图片调节到与窗口同比例的缩放;图片 / 窗口 float xs = visibleSize.width / bg->getContentSize().width; float ys = visibleSize.height / bg->getContentSize().height; bg->setScale(xs, ys); this->addChild(bg,0); auto mouse = Sprite::create("mouse.png"); mouse->setPosition(Vec2(visibleSize.width / 3 + origin.x, visibleSize.height / 4 + origin.y)); mouse->setScale(0.5, 0.5); this->addChild(mouse, 1); auto hammer = Sprite::create("hammer.png"); hammer->setPosition(Vec2(visibleSize.width / 2.5 + origin.x, visibleSize.height / 2 + origin.y)); hammer->setScale(0.7, 0.7); this->addChild(hammer); //设置Label auto label = Label::createWithTTF("Whac-a-mole", "fonts/Marker Felt.ttf", 38); label->setPosition(Vec2(origin.x + visibleSize.width / 2, origin.y + visibleSize.height - label->getContentSize().height)); this->addChild(label,1); //设置一个菜单项, auto start = MenuItemFont::create("Start", CC_CALLBACK_1(MyGame::startMenuItemback, this)); start->setPosition(Vec2(origin.x + visibleSize.width / 2, (origin.y + visibleSize.height - (visibleSize.height / 2)))); auto menu1 = Menu::create(start, NULL); menu1->setPosition(Vec2(0,0)); this->addChild(menu1); auto help = MenuItemFont::create("Help", CC_CALLBACK_1(MyGame::helpMenuItemback, this)); help->setPosition(Vec2(origin.x + visibleSize.width / 2, (origin.y + visibleSize.height - (visibleSize.height / 2) - (Help->getContentSize().height*1.5)))); auto menu2 = Menu::create(help, NULL); menu2->setPosition(Vec2(0, 0)); this->addChild(menu2); auto exit = MenuItemFont::create("Exit", CC_CALLBACK_1(MyGame::exitMenuItemback, this)); exit->setPosition(Vec2(origin.x + visibleSize.width / 2, (origin.y + visibleSize.height - (visibleSize.height / 2) - ((Exit->getContentSize().height*1.5) * 2)))); auto menu3 = Menu::create(exit, NULL); menu3->setPosition(Vec2(0, 0)); this->addChild(menu3); return true; } //replaceScene()切换场景,在回调函数中切换场景 void MyGame::startMenuItemback(Ref* pSender) { //这里写回调函数的操作 Director::getInstance()->replaceScene(TransitionJumpZoom::create(2, MyGameBegin::createScene())); } void MyGame::helpMenuItemback(Ref* pSender) { //这里写回调函数的操作 } void MyGame::exitMenuItemback(Ref* pSender) { //这里写回调函数的操作 Director::getInstance()->end(); //exit(0);也可以 }
效果图:
开始点击进入游戏:start
切换的过程中的过渡效果:TransitionJumpZoom::create(time,Scene)
>>场景切换效果函数汇总
TransitionCrossFade::create(time,Scene); 慢慢淡化到另一场景 TransitionFade::create(time,Scene); 本场景变暗消失后另一场景慢慢出现 TransitionFadeBL::create(time,Scene); 本场景右上角到左下角方块消失到另一场景 TransitionFadeDown::create(time,Scene); 本场景从上到下横条消失到另一场景 TransitionFadeTR::create(time,Scene); 本场景左下角到右上角方块消失到另一场景 TransitionFadeUp::create(time,Scene); 本场景从下到上横条消失到另一场景 TransitionFlipAngular::create(time,Scene,style ); 本场景翻转消失到另一场景(斜上方) TransitionFlipX::create(time,Scene,style); 本场景翻转消失到另一场景(X轴) TransitionFlipY::create(time,Scene); 本场景翻转消失到另一场景(Y轴) TransitionJumpZoom::create(time,Scene); 本场景跳动消失后另一场景跳动出现 TransitionMoveInB::create(time,Scene); 另一场景由整体从下面出现 TransitionMoveInL::create(time,Scene); 另一场景由整体从左面出现 TransitionMoveInT::create(time,Scene); 另一场景由整体从上面出现 TransitionMoveInR::create(time,Scene); 另一场景由整体从右面出现 TransitionPageTurn::create(time,Scene,bool); 翻页切换,bool为true是向前翻。 TransitionProgressHorizontal::create(time,Scene); 本场景从左到右消失同时另一场景出现 TransitionProgressInOut::create(time,Scene); 本场景从中间到四周消失同时另一场景出现 TransitionProgressOutIn::create(time,Scene); 本场景从四周到中间消失同时另一场景出现 TransitionProgressRadialCCW::create(time,Scene); 本场景逆时针消失到另一场景 TransitionProgressRadialCW::create(time,Scene); 本场景顺时针消失到另一场景 TransitionProgressVertical::create(time,Scene); 本场景从上到下消失同时另一场景出现 TransitionRotoZoom::create(time,Scene); 本场景旋转消失后另一场景旋转出现 TransitionShrinkGrow::create(time,Scene); 本场景缩小切换到另一场景放大 TransitionSlideInB::create(time,Scene); 本场景向上滑动到另一场景 TransitionSlideInL::create(time,Scene); 本场景向右滑动到另一场景 TransitionSlideInR::create(time,Scene); 本场景向左滑动到另一场景 TransitionSlideInT::create(time,Scene); 本场景向下滑动到另一场景 TransitionSplitCols::create(time,Scene); 本场景三矩形上下消失后另一场景三矩形上下 TransitionSplitRows::create(time,Scene); 本场景三矩形左右消失后另一场景三矩形左右 TransitionTurnOffTiles::create(time,Scene); 本场景小方块消失到另一场景 TransitionZoomFlipAngular::create(time,Scene,style); 本场景翻转消失到另一场景(斜上方) TransitionZoomFlipX::create(time,Scene,style); 本场景翻转消失到另一场景(X轴) TransitionZoomFlipY::create(time,Scene,style); 本场景翻转消失到另一场景(Y轴 )
切换成功:
标签:
原文地址:http://www.cnblogs.com/geore/p/5797118.html