Cocos2d-x 开发者指南05:创建和转换场景
这一章我们将深入讲解场景相关内容,主要围绕两个核心主题:创建场景和场景转换。
什么是场景
场景在 Cocos2d-x 中是一个重要的概念,它是包含精灵(Sprites)、标签(Labels)、节点(Nodes)以及其他游戏所需对象的容器。场景承担着两项关键任务:一是负责游戏逻辑的运行,二是实现游戏内容的逐帧渲染。
每个游戏至少需要一个场景,为了便于理解,你可以把场景想象成一部电影中的画面,它是正在运行且用户能够实时看到的部分。在游戏里,我们可以拥有多个场景,并且能够在这些不同的场景之间实现自然切换。Cocos2d-x 为我们提供了多种场景切换效果,甚至允许我们使用一些超酷的特效。
创建场景
创建场景的操作十分简单,使用以下代码即可:
auto myScene = Scene::create();
回顾第二章中我们讲过的场景图部分,它涉及到游戏的绘制原理。这里需要特别注意的是,一定要明确 GUI 元素的绘制顺序以及 z - order,这对于正确呈现游戏画面至关重要。
场景使用范例
下面我们来创建一个简单的场景。Cocos2d - x 使用右手坐标系系统,屏幕和显示位置的原点 (0, 0) 位于左下角,游戏元素的坐标是相对于这个原点计算出来的相对坐标。以下是创建简单场景并添加元素的代码:
// 获取导演实例
auto dirs = Director::getInstance();
// 获取可见区域大小
Size visibleSize = dirs->getVisibleSize();
// 创建场景
auto scene1 = Scene::create();
// 创建标签
auto label1 = Label::createWithTTF("My Game", "Marker Felt.ttf", 36);
// 设置标签位置
label1->setPosition(Vec2(visibleSize.width / 2, visibleSize.height / 2));
// 将标签添加到场景中
scene1->addChild(label1);
// 创建精灵
auto sprite1 = Sprite::create("mysprite.png");
// 设置精灵位置
sprite1->setPosition(Vec2(100, 100));
// 将精灵添加到场景中
scene1->addChild(sprite1);
运行上述代码,你就会看到一个包含标签和精灵的简单场景。当然,这只是开发游戏的第一步。
多个场景的切换
在游戏开发中,不同场景之间的切换是必不可少的,比如开始新游戏、进入游戏下一章或者退出游戏时都会用到。Cocos2d - x 提供了多种场景切换方式,下面为你详细介绍:
几种场景切换的方式
runWithScene:该方法只能用于启动游戏的第一个场景,是启动游戏首个场景的特定方式。示例代码如下:auto myScene = Scene::create(); Director::getInstance()->runWithScene(myScene);replaceScene:此方法用于直接替换当前正在运行的场景。示例代码如下:auto myScene = Scene::create(); Director::getInstance()->replaceScene(myScene);pushScene:该方法会暂停当前正在运行的场景,并将其放入暂停场景的堆栈中。使用此方法的前提是当前有正在运行的场景。示例代码如下:auto myScene = Scene::create(); Director::getInstance()->pushScene(myScene);popScene:该方法会用堆栈中的场景替换当前正在运行的场景,当前正在运行的场景会被移除。同样,使用此方法也要求当前有正在运行的场景。示例代码如下:Director::getInstance()->popScene();
场景切换特效
在场景切换时,我们可以为其添加一些特效,让切换过程更加炫酷。以下是一些特效的使用示例:
auto myScene = Scene::create();
// 渐变切换特效,0.5 秒内完成切换,背景颜色为青色
Director::getInstance()->replaceScene(TransitionFade::create(0.5, myScene, Color3B(0, 255, 255)));
// 水平翻转切换特效,2 秒内完成切换
Director::getInstance()->replaceScene(TransitionFlipX::create(2, myScene));
// 从上向下滑动切换特效,1 秒内完成切换
Director::getInstance()->replaceScene(TransitionSlideInT::create(1, myScene));
通过以上介绍,你可以在 Cocos2d - x 中灵活地创建场景并实现场景之间的切换,同时还能添加各种特效,为游戏增添更多趣味性。