在我们的游戏中我们可能需要主菜单、结束场景和一些其他层次。那么我们如何组织他们呢?答案:Scene。正如电影一样,会被直接分解成若干个场景。游戏也是如此。不管这个游戏的大小,我们都要想出几个游戏场景。Renderer渲染器负责绘制Scene场景。渲染器负责收集所有一切在屏幕上的东西。
Scene(场景)是每一个游戏的基础。Scene(场景)是一个容器,用来容纳Sprite(精灵)、Label(标签)、Node(节点)和其他对象。Scene(场景)负责运行游戏逻辑和渲染每一帧的内容。我们至少需要一个Scene(场景)来启动我们的游戏。Scene(场景)就是实时在运行和用户所看到的。我们的游戏可能有很多Scene,Cocos2d-x 提供了 scene之间的转换和转换特效。

创建Scene

auto myScene = Scene::create();

请记住Cocos2d-x使用的坐标系是right handed coordinate system(右手坐标系)。这意味着( 0,0 )坐标是在屏幕或显示屏的左下角,如:

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);

过渡场景

开发一个游戏,我们思考游戏需要什么Scene场景对象。有一些游戏只有一个Scene场景对象,它通过移除场景里的所有节点对象,再用新的节点对象来布局成下一个场景;另一种方法是将游戏分解成主菜单和一个游戏场景;第三种方法是将游戏分解成主菜单、level 1 到 level N多个层次和一个关闭场景。在场景切换之间我们需要添加一些小的过渡,通常被称为cut scene(切割场景)。

  • runWithScene() :只能用于第一个Scene(场景)。这是启动你的游戏的第一个Scene(场景)的方式。
Director::getInstance()->runWithScene(myScene);
  • replaceScene():直接替换场景
Director::getInstance()->replaceScene(myScene);
  • pushScene():暂停正在运行的场景,并将它压入到暂停的场景栈中。只有在有正在运行场景的情景下,才调用这个。
Director::getInstance()->pushScene(myScene);
  • popScene():这个场景将会替换掉正在运行的场景,被替换掉的场景将被删除。只有在有正在运行场景的情景下,才调用这个。
Director::getInstance()->popScene();

带效果的过渡场景

可以将视觉效果添加到场景过渡中,如:

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) );

Scene Graph场景图

scene graph是一个数据结构,它用来安排一个图形化的场景。scene graph包含Node(节点)对象在一棵“树”结构中

一旦,你开始添加Node(节点), Sprite(精灵)和Animation(动画)对象到你的游戏中,你要保证它们符合你所预期那样被绘制在屏幕上。​​Scene​​是Node(节点)的集合对象。scene graph用z-order(z轴次序)来布局Scene场景。Node(节点)对象通过不同的z-order(z轴次序) 把它们叠在一起。在Cocos2d-x里,我们可以用addChild() API来构建scene graph场景图:

// Adds a child with the z-order of -2, that means
// it goes to the "left" side of the tree (because it is negative)
scene->addChild(title_node, -2);

// When you don't specify the z-order, it will use 0
scene->addChild(label_node);

// Adds a child with the z-order of 1, that means
// it goes to the "right" side of the tree (because it is positive)
scene->addChild(sprite_node, 1);

场景图是一棵树;你可以在树上行走。Cocos2d-x使用有序行走算法。按顺序行走是被行走的树的左侧,然后是根节点,然后是树的右侧。由于树的右侧是最后一次渲染,因此它首先显示在场景图上:

Cocos2dx之Scene和Scene Graph_2d