原著是英文,本文只是一个个人的简单理解的中文的非正式翻译,供自己学习使用,参考需谨慎。
向原著的作者SlackMoehrle, Ricardo, Justin, Nite , Kai, Minggo, Wenhai, Tony, Yingtao, Rao 致敬。
第5章:创建和转换场景(Scenes)
什么是场景?
游戏中的场景是精灵(Sprites),标签(Labels),节点(Nodes)和其他对象的一个容器。场景以帧为基础控制逻辑和渲染。你至少需要一个场景来开始你的游戏。你可以把这看成是一个电影。场景上的事物就是用户看到的正在发生的事物。你可以建立任意数量的场景,并且非常容易的完成他们之间的切换。Cocos2d-x提供了场景转换和一些非常酷的转换效果。
创建场景
这个非常容易
auto myScene = Scene:create();
还记得场景图形(Scene Graph)么?
在本书的第2章,我们学习了关于场景图形的知识,并且知道了他是如何影响游戏的图形绘制工作。它决定了GUI图形的绘制顺序这一点非常重要。z-order也非常重要!
一个简单的场景
我们来建立一个简单的场景。记住,Cocos2d-x使用的是右手坐标系。这就以为着 屏幕/显示区域 左下角是坐标的原点。当你开始设定你游戏元素的位置的时候,这里就是你计算的原点。我们来创建一个简单的场景并向上面添加一些元素。
auto dirs = Director::getInstance();
Size = visibleSize = dirs->getVisibleSize();
auto myScene = Scene:create();
auto label1 = Label:createWithTTF("My Game","Marker Felt.ttf", 36);
label1->setPosition(Vec2(visibleSize.width/2, visibleSize.height/2));
myScene->addChild(label1);
auto sprite1 = Sprite::create("mysprite.png");
sprite1->setPosition(Vec2(100, 100));
myScene->addChild(sprite1);
当我们运行这段代码的时候,我们看到一个场景,上面有一个标签和一个精灵。虽然没有其他的操作,但是这是一个开始。
两个场景之间的转换
在游戏中有时需要完成两个场景的转换。可能是游戏的开始,关卡的改变或者是游戏结束。Cocos2d-x提供了一些场景转换的方法。
场景转换方法
这里有不少场景转换的方法,每一种都有不同的功能,我们一起看一下:
auto myScene = Scene::create();
runWithScene - 这个方法只在第一次使用。这个方法能够启动你的第一个游戏场景。
Director::getInstance()->runWithScene(myScene);
replaceScene - 立刻替换场景。
Director::getInstance()->replaceScene(myScene);
pushScene - 挂起正在运行的场景。将当前场景压入一个挂起场景的栈中。只有当前有正在运行的场景才能调用这个方法。
Director::getInstance()->pushScene(myScene);
popScene - 这个场景将会替换正在运行的场景。正在运行的场景将会被删除。只有当前有场景正在运行才能调用这个方法。
Director::getInstance()->popScene(myScene);
场景转换效果
你可以为你的场景转换添加视觉效果
auto myScene = Scene::create();
//Transition Fade
Director::getInstance()->replaceScene(TransitionFade::create(0.5), myScene, Color3B(0, 255, 255));
//FlipX
Director::getInstance()->replaceScene(TransitionFlipX::create(2, myScene));
//Transition Slide In
Director::getInstance()->replaceScene(TransitionSlideInT::create(1, myScene));