2015年

2月

05日

Cocos2d-x 3.x 簡単な画面遷移を作ってみる

 

Cocos2dx 3.x C++言語

 

画面遷移用の2つのクラスをそれぞれ作成し使用しています。

TopScene.h

TopScene.cpp

SecondScene.h

SecondScene.cpp

 

TopScene.h画面のソースコード

TopScene.h

 

#ifndef __Screen__TopScene__

#define __Screen__TopScene__


#include "cocos2d.h"


USING_NS_CC;


class TopScene : public cocos2d::Layer

{

public:

    static Scene *createScene();

    virtual bool init();

    CREATE_FUNC(TopScene);

    

    void makeBackground();

    

    // スタートボタン押下時の処理宣言 戻る Object → Ref に変更

    void pushStart(Ref *pSender);

    

};


#endif /* defined(__Screen__TopScene__) */


TopScene.cpp

 

#include "TopScene.h"

#include "SecondScene.h"

//音をならすためにinclude

#include "SimpleAudioEngine.h"


Scene *TopScene::createScene()

{

    auto scene = Scene::create();

    auto layer = TopScene::create();

    scene->addChild(layer);

    return scene;

}


bool TopScene::init()

{

    if (! Layer::init()) {

        return false;

    }

    

    // バックグラウンド

    makeBackground();

    

    // 画面サイズを取得

    Size winSize = Director::getInstance()->getWinSize();

    

    // スタートボタンを設置

    auto startButton = MenuItemImage::create(

                                             "CloseNormalGo.png"// 通常状態の画像

                                             "CloseSelected.png"// 押下状態の画像

                                             CC_CALLBACK_1(TopScene::pushStart, this)); // 押下時のアクション

    // ボタンの設置

    startButton->setPosition(Point(winSize.width /2 ,winSize.height/2));

    

    // メニューを作成 自動解放オブジェクト

    auto menu = Menu::create(startButton, NULL);

    //

    menu->setPosition(Point::ZERO);

    // メニューを追加

    this->addChild(menu, 1);

    

    return true;

}


void TopScene::makeBackground()

{

    

    // 画面サイズを取得

    Size winSize = Director::getInstance()->getWinSize();

    //マルチレゾリューション対応がどうとか

    Point origin = Director::getInstance()->getVisibleOrigin();

    

    // バックグランドカラー

    auto background = LayerColor::create(Color4B::BLUE,

                                         winSize.width,

                                         winSize.height);

    // バックグランドカラー 第2引数は表示順

    this->addChild(background, 0);

    

    // タイトルを設置

    auto lbl_title = Label::createWithSystemFont

    ("Top","HiraKakuProN-W6", 100);

    lbl_title->setPosition(Point(origin.x + winSize.width/2,

                                 origin.y + winSize.height

                                 -lbl_title->getContentSize().height));

    // ラベルタイトルを追加

    this->addChild(lbl_title,1);

}


//

void TopScene::pushStart(Ref *pSender)

{

    CCLOG("Pushボタン");

    

    // 効果音を鳴らす

    CocosDenshion::SimpleAudioEngine::getInstance()->playEffect("onepoint26.mp3");

    

    // 遷移先の画面のインスタンス

    Scene *pScene = SecondScene::createScene();

    

    // 0.5秒かけてフェードアウトしながら次の画面に遷移します

    //    引数1:フィードの時間

    //    引数2:移動先のシーン

    //    引数3:フィードの色(オプション)

    TransitionFade* transition = TransitionFade::create(0.5f, pScene);

    

    // 遷移実行  遷移時のアニメーション

    // 直前のsceneはもう使わないから捨ててしまう方法。基本はこれになります。

    Director::getInstance()->replaceScene(transition);

}

 

SecondScene画面のソースコード

SecondScene.h

 

#ifndef __Screen__SecondScene__

#define __Screen__SecondScene__


#include "cocos2d.h"


USING_NS_CC;


class SecondScene : public cocos2d::Layer

{

public:

    static Scene *createScene();

    virtual bool init();

    CREATE_FUNC(SecondScene);

    

    void makeBackground();

    

    // スタートボタン押下時の処理宣言 戻る Object → Ref に変更

    void pushBack(cocos2d::Ref *pSender);

};


#endif /* defined(__Screen__SecondScene__) */


SecondScene.cpp

 

#include "SecondScene.h"

#include "TopScene.h"

//音をならすためにinclude

#include "SimpleAudioEngine.h"


Scene *SecondScene::createScene()

{

    auto scene = Scene::create();

    auto layer = SecondScene::create();

    scene->addChild(layer);

    return scene;

}


bool SecondScene::init()

{

    if (! Layer::init()) {

        return false;

    }

    

    // バックグラウンド

    makeBackground();

    

    //画面サイズを取得

    Size winSize = Director::getInstance()->getVisibleSize();

    

    //戻るボタンを設置

    auto backButton = MenuItemImage::create(

                                            "CloseNormalBack.png"//表示

                                            "CloseSelected.png"//タップ時の画像

                                            CC_CALLBACK_1(SecondScene::pushBack, this));

    

    backButton->setPosition(Point(winSize.width /2 ,winSize.height/2));

    

    //create menu, it's an autorelease object

    auto menu = Menu::create(backButton, NULL);

    

    menu->setPosition(Point::ZERO);

    

    this->addChild(menu, 1);

    

    return true;

}


void SecondScene::makeBackground()

{

    //画面の座標関係の詳しい説明はここ

    http://www.cocos2d-x.org/wiki/Coordinate_System

    //画面サイズを取得

    Size winSize = Director::getInstance()->getVisibleSize();

    //マルチレゾリューション対応がどうとか

    Point origin = Director::getInstance()->getVisibleOrigin();

    

    // バックグランドカラー

    auto background = LayerColor::create(Color4B::ORANGE,

                                         winSize.width,

                                         winSize.height);

    //バックグランドカラー追加 第2引数は表示順

    this->addChild(background, 0);

    

    //タイトルを設置

    auto lbl_title = Label::createWithSystemFont

    ("Second", "HiraKakuProN-W6", 100);

    lbl_title->setPosition(Point(origin.x + winSize.width/2,

                                 origin.y + winSize.height

                                 -lbl_title->getContentSize().height));

    this->addChild(lbl_title,1);

}


// pushBackボタン

void SecondScene::pushBack(Ref *pSender)

{

    // 効果音を鳴らす

    CocosDenshion::SimpleAudioEngine::getInstance()->playEffect("onepoint26.mp3");

    

    // 遷移先の画面のインスタンス

    Scene *pScene = TopScene::createScene();

    

    // 0.5秒かけてフェードアウトしながら次の画面に遷移します

    //    引数1:フィードの時間

    //    引数2:移動先のシーン

    //    引数3:フィードの色(オプション)

    TransitionFade* transition = TransitionFade::create(0.5f, pScene);

    

    //遷移実行  遷移時のアニメーション

    Director::getInstance()->replaceScene(transition);

}

 

目 次