Cocos2d-x开发教程 第五节 深入Scene

来源:互联网 发布:清宫表虚岁准确算法 编辑:程序博客网 时间:2024/05/21 06:44

         这一节我们来具体说说Scene,简单来说Scene就是一个容器,其中可以容纳Sprite、Label、Node等各种游戏中需要的对象。Scene还负责控制游戏的逻辑和内部对象的渲染,游戏中至少有一个Scene,也可以有多个Scene互相切换,并且在Scene切换的过程中还可以指定炫酷的效果。下面的代码创建了一个Scene

auto dirs = Director::getInstance();Size visibleSize = dirs->getVisibleSize();Vec2 origin = dirs->getVisibleOrigin();scene1 = Scene::create();auto nodeItems = Node::create();nodeItems->setName("nodeItems");auto menuNode = Node::create();menuNode->setName("menuNode");int index = 2;auto thisSceneLabel = Label::createWithTTF("This Is A Scene", "Marker Felt.ttf", 32);thisSceneLabel->setPosition(Vec2(visibleSize.width / 2, visibleSize.height / 2));scene1->addChild(thisSceneLabel, 1);auto menuItem1 = MenuItemFont::create("Make A New Scene");menuItem1->setFontNameObj("Marker Felt.ttf");menuItem1->setFontSizeObj(32);menuItem1->setName("menuItem1");menuItem1->setPosition(Vec2(origin.x + visibleSize.width / 2, origin.y + visibleSize.height / 2).x,(Vec2(origin.x + visibleSize.width / 2, origin.y + visibleSize.height).y - (index) * 40));menuItem1->setCallback([&](cocos2d::Ref *sender) {Director::getInstance()->replaceScene(createScene2());});auto menu = Menu::create(menuItem1, NULL);menu->setName("menu");menuNode->addChild(menu, 1);menu->setPosition(Vec2::ZERO);scene1->addChild(menuNode, 2);
创建结果如下

第24、25、26行设置了菜单的回调函数,当点击菜单时就会执行替换Scene的操作。replaceScene函数用于直接替换Scene,不添加任何效果。替换效果如下

创建这个Scene的代码如下

auto dirs = Director::getInstance();Size visibleSize = dirs->getVisibleSize();Vec2 origin = dirs->getVisibleOrigin();scene2 = Scene::create();scene2->retain();auto nodeItems = Node::create();nodeItems->setName("nodeItems");auto menuNode = Node::create();menuNode->setName("menuNode");int index = 2;auto thisSceneLabel = Label::createWithTTF("This Is A New Scene", "Marker Felt.ttf", 32);thisSceneLabel->setPosition(Vec2(visibleSize.width / 2, visibleSize.height / 2));scene2->addChild(thisSceneLabel, 1);auto menuItem1 = MenuItemFont::create("Make a New Scene Using a Transition Fade");menuItem1->setFontNameObj("Marker Felt.ttf");menuItem1->setFontSizeObj(32);menuItem1->setName("menuItem1");menuItem1->setPosition(Vec2(origin.x + visibleSize.width / 2, origin.y + visibleSize.height / 2).x,(Vec2(origin.x + visibleSize.width / 2, origin.y + visibleSize.height).y - (index)* 40));menuItem1->setCallback([&](cocos2d::Ref *sender) {Director::getInstance()->replaceScene(TransitionFade::create(0.5, createScene3(), Color3B(0, 255, 255)));});auto menu = Menu::create(menuItem1, NULL);menu->setName("menu");menuNode->addChild(menu, 1);menu->setPosition(Vec2::ZERO);scene2->addChild(menuNode, 2);return scene2;
注意27行菜单回调函数的内容,这里使用了TransitionFade::create来创建了一个0.5秒长的渐变褪色效果,点击菜单效果如下


创建这个Scene的代码如下

auto dirs = Director::getInstance();Size visibleSize = dirs->getVisibleSize();Vec2 origin = dirs->getVisibleOrigin();scene3 = Scene::create();scene3->retain();auto nodeItems = Node::create();nodeItems->setName("nodeItems");auto menuNode = Node::create();menuNode->setName("menuNode");int index = 2;auto thisSceneLabel = Label::createWithTTF("This Scene used a Transition!", "Marker Felt.ttf", 32);thisSceneLabel->setPosition(Vec2(visibleSize.width / 2, visibleSize.height / 2));scene3->addChild(thisSceneLabel, 1);auto menuItem1 = MenuItemFont::create("Make a New Scene Using a Flip");menuItem1->setFontNameObj("Marker Felt.ttf");menuItem1->setFontSizeObj(32);menuItem1->setName("menuItem1");menuItem1->setPosition(Vec2(origin.x + visibleSize.width / 2, origin.y + visibleSize.height / 2).x,(Vec2(origin.x + visibleSize.width / 2, origin.y + visibleSize.height).y - (index)* 40));menuItem1->setCallback([&](cocos2d::Ref *sender) {Director::getInstance()->replaceScene(TransitionFlipX::create(2, createScene4()));});auto menu = Menu::create(menuItem1, NULL);menu->setName("menu");menuNode->addChild(menu, 1);menu->setPosition(Vec2::ZERO);scene3->addChild(menuNode, 2);return scene3;
在27行的菜单回调函数中使用TransitionFlipX::create函数创建了一个2秒的翻转效果,点击菜单执行效果如下


               除了上面介绍的3种切换Scene的方法,还有如下方法来用于切换Scene。

         TransitionSlideInT::create用来创上下欢动切换效果。

         pushScene用于把已经存在的Scene放到场景堆栈中,之后可以用popScene把场景堆栈中的Scene取出。

         下一节我们将讲述其它和UI有关的部分。

0 0
原创粉丝点击