Scene
とは ゲームに必要なSprites
, Labels
, Nodes
,その他オブジェクトを保持するコンテナです。
Scene
はゲームロジックの実行とフレームごとのコンテンツの描写を司ります。
ゲームを開始するには少なくとも一つのScene
が必要です。
これは映画のようなものだと考えることができます。
Scene
はゲーム中ずっと動作をし続け、起こっていることをリアルタイムにユーザーに表示します。
ゲームでは望む数のScene
オブジェクトを作成し、それらを簡単に切り替えることができます。
Cocos2d-x ではscene 切り替えが実装されており、クールなエフェクトと共にscene 切り替えを行うことさえできます。
Scene
を作成するのはとても簡単です。
auto myScene = Scene::create();
このガイドの第二章 で、scene graph とそれがゲーム描写にどのような影響を与えるかについて学びました。 覚えておくべき重要なことは、scene graphによってGUI要素の描写順番が決まるということです。 また、 z-orderについても忘れないでください!
それでは、簡単な Scene
を構築してみましょう。
Cocos2d-x は右手系座標系を使用していることを忘れないでください
つまり、 0,0 座標は画面/ディスプレイの左下隅の位置にあるということです。
ゲーム中に何かを配置する時は、ここが位置計算の開始点となります。
それでは、簡単なScene
を作成してそれにいくつか要素を追加してみましょう:
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);
When このコードを実行すると、Label
とSprite
の入った簡単なScene
が表示されるでしょう。
あまり多くのことは行っていませんが、最初の一歩には十分です。
ゲームにおいてはScene
オブジェクト間の移動が必要かもしれません。
おそらくゲーム開始、ステージの変更、ゲームのエンディングなどの画面で。
Cocos2d-x scene 切り替えのためのいくつかの方法が用意されています。
scenesを切り替える方法はたくさんあります。 各方法はそれぞれ特徴的な機能を持っています。それでは、それらについて見てみましょう。:
auto myScene = Scene::create();
runWithScene() - 最初の scene でのみこれを使用します。これはあなたのゲームの最初の Scene
を開始する方法です。
Director::getInstance()->runWithScene(myScene);
replaceScene() - scene を即座に置き換えます。
Director::getInstance()->replaceScene(myScene);
pushScene() - 実行中の sceneのを中断し、それを中断sceneのスタックに入れます。実行中のscene がある場合のみこれを実行します。
Director::getInstance()->pushScene(myScene);
popScene() - このscene と実行中のscene を置き換えます。実行中の scene は削除されます。実行中のscene がある場合のみこれを実行します。
Director::getInstance()->popScene(myScene);
Scene
切り替えに視覚的なエフェクトを追加することができます。
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) );