diff --git a/cocos2d-x-3.0alpha0/projects/ichi_okuman_yen/Classes/Opening/PrologueScene.cpp b/cocos2d-x-3.0alpha0/projects/ichi_okuman_yen/Classes/Opening/PrologueScene.cpp index 24edabb..747907a 100644 --- a/cocos2d-x-3.0alpha0/projects/ichi_okuman_yen/Classes/Opening/PrologueScene.cpp +++ b/cocos2d-x-3.0alpha0/projects/ichi_okuman_yen/Classes/Opening/PrologueScene.cpp @@ -1,5 +1,6 @@ #include "PrologueScene.h" #include "SimpleAudioEngine.h" +#include "SplashScene.h" USING_NS_CC; USING_NS_CC_EXT; @@ -8,21 +9,35 @@ USING_NS_ICHI; PrologueScene::PrologueScene() -: _messageTTF(nullptr) +: _state(State_TouchIgnore) +, _messageIndex(0) +, _messageArray(nullptr) +, _messageTTF(nullptr) , _animationManager(nullptr) { - + // こっちで初期化するより上のコロンで繋げて書いている方が余計な処理が入らない分軽くなるそう } +PrologueScene::~PrologueScene() +{ + CCLOG("PrologueScene::~PrologueScene()"); + if (_messageArray != nullptr) + { + _messageArray->removeAllObjects(); + CC_SAFE_RELEASE(_messageArray); + } + CC_SAFE_RELEASE(_messageTTF); + CC_SAFE_RELEASE(_animationManager); +} Scene* PrologueScene::createScene() { auto scene = Scene::create(); - // タイトルのccbiファイルを読み込む + auto nodeLoaderLibrary = NodeLoaderLibrary::getInstance(); // プロローグシーンのローダーを追加 nodeLoaderLibrary->registerNodeLoader("PrologueScene", PrologueSceneLoader::loader()); - CCBReader* reader = new CCBReader(nodeLoaderLibrary); + // プロローグのccbiファイルを読み込む auto prologueNode = reader->readNodeGraphFromFile("ccbi/PrologueScene.ccbi"); // アニメーションマネージャーをセットする static_cast(prologueNode)->setAnimationManager(reader->getAnimationManager()); @@ -46,8 +61,30 @@ bool PrologueScene::init() SimpleAudioEngine::getInstance()->preloadBackgroundMusic(BGM_PROLOGUE); SimpleAudioEngine::getInstance()->preloadEffect(SE_TOUCH_NORMAL); - // シングルタップのみ受付 最初のアニメーションまではタップさせない - setTouchEnabled(false); + // プロローグの内容をセットする + _messageArray = Array::create( + ccs("お金持ちになりたい"), + ccs("それは多くの人が\n子供の頃に持つ夢。"), + ccs("ただ、多くの人は\n\nなれたらいいな\n\nという願望に留まってしまう。"), + ccs("お金は生きていく分だけ\nあれば良い。"), + ccs("その生きていく分をどのようにして取得するかを考え始める。"), + ccs("自分の好きなことをしたい。"), + ccs("人に喜んでもらいたい。"), + ccs("家族との時間を大切にしたい。"), + ccs("それぞれの想いから、\nみな仕事を選び働く。"), + ccs("その結果\n\n運良くお金持ちになれた。\n\nという人もいるかもしれない。"), + ccs("しかし"), + ccs("お金のことを再優先に考え"), + ccs("お金持ちになりたい\n\nという夢を実現するべく\n努力し続ける人もいる。"), + ccs("この物語は\n\nお金持ちになりたいと願い。"), + ccs("そして、その夢を追い続ける。"), + ccs("そんな\n\nある一人の少女のお話。"), + NULL); + // retainしてあげないとこのブロック抜けたら消えてしまう + _messageArray->retain(); + + // シングルタップのみ受付 + setTouchEnabled(true); setTouchMode(Touch::DispatchMode::ONE_BY_ONE); return true; @@ -65,6 +102,30 @@ void PrologueScene::onEnterTransitionDidFinish() bool PrologueScene::onTouchBegan(Touch *touch, Event *event) { CCLOG("PrologueScene::onTouchBegan()"); + switch (_state) + { + // 開始アニメーションが終了していれば開始の終了アニメーションを再生 + case State_StartAnimationEnd: + animationStartEnd(); + break; + // テキスト表示開始アニメーション中か終了していればテキスト表示終了アニメーションを再生 + case State_TextStartAnimation: + case State_TextStartAnimationEnd: + animationTextEnd(); + break; + // テキスト表示終了アニメーション中なら次のテキスト表示にスキップ + case State_TextEndAnimation: + // 最後はスルー + if (_messageIndex == _messageArray->count()) + { + return false; + } + animationTextStart(); + break; + // それ以外は何もしない + default: + return false; + } SimpleAudioEngine::getInstance()->playEffect(SE_TOUCH_NORMAL); return false; } @@ -78,17 +139,32 @@ void PrologueScene::animationStart() void PrologueScene::animationStartEnd() { CCLOG("PrologueScene::animationStartEnd()"); + _state = State_TouchIgnore; _animationManager->runAnimationsForSequenceNamedTweenDuration("StartEnd", 0.0f); } void PrologueScene::animationTextStart() { CCLOG("PrologueScene::animationTextStart()"); - _animationManager->runAnimationsForSequenceNamedTweenDuration("TextStart", 0.0f); + _state = State_TextStartAnimation; + // メッセージを更新してから表示する + String* message = static_cast(_messageArray->getObjectAtIndex(_messageIndex)); + _messageTTF->setString(message->getCString()); + + float duration = 0.0f; + // 初回だけディレイを取る + if (_messageIndex == 0) + { + duration = 0.3f; + } + _animationManager->runAnimationsForSequenceNamedTweenDuration("TextStart", duration); + // 次のメッセージを表示するようにカウントアップ + ++_messageIndex; } void PrologueScene::animationTextEnd() { CCLOG("PrologueScene::animationTextEnd()"); + _state = State_TextEndAnimation; _animationManager->runAnimationsForSequenceNamedTweenDuration("TextEnd", 0.0f); } @@ -117,8 +193,7 @@ void PrologueScene::completedAnimationSequenceNamed(const char *name) // タイムラインの名前によって処理を分ける。必要のあるものだけ指定する if(strcmp(name,"Start") == 0) { - setTouchEnabled(true); - animationStartEnd(); + _state = State_StartAnimationEnd; } else if(strcmp(name,"StartEnd") == 0) { @@ -126,10 +201,22 @@ void PrologueScene::completedAnimationSequenceNamed(const char *name) } else if(strcmp(name,"TextStart") == 0) { - animationTextEnd(); + _state = State_TextStartAnimationEnd; } else if(strcmp(name,"TextEnd") == 0) { - animationTextStart(); + // メッセージを表示。最後まで表示したら次のシーンへ + if (_messageIndex < _messageArray->count()) + { + animationTextStart(); + } + else + { + // TODO チュートリアルを作成後切り替える; + auto scene = SplashScene::createScene(); + // 0.5秒かけてブラックアウトしてシーンを切り替える + auto fade = TransitionFade::create(REPLASE_SCENE_TIME_DEFAULT, scene, Color3B::BLACK); + Director::getInstance()->replaceScene(fade); + } } } diff --git a/cocos2d-x-3.0alpha0/projects/ichi_okuman_yen/Classes/Opening/PrologueScene.h b/cocos2d-x-3.0alpha0/projects/ichi_okuman_yen/Classes/Opening/PrologueScene.h index 17f1473..9edc099 100644 --- a/cocos2d-x-3.0alpha0/projects/ichi_okuman_yen/Classes/Opening/PrologueScene.h +++ b/cocos2d-x-3.0alpha0/projects/ichi_okuman_yen/Classes/Opening/PrologueScene.h @@ -14,14 +14,23 @@ class PrologueScene { public: PrologueScene(); - virtual ~PrologueScene() {}; + virtual ~PrologueScene(); + + // 処理の状態 + enum State { + State_TouchIgnore, + State_StartAnimationEnd, + State_TextStartAnimation, + State_TextStartAnimationEnd, + State_TextEndAnimation, + }; static cocos2d::Scene* createScene(); virtual bool init() override; // シーン切り替え後にBGMを再生 virtual void onEnterTransitionDidFinish() override; - // タップでゲーム開始させる + // タップでテキストを更新する virtual bool onTouchBegan(cocos2d::Touch* touch, cocos2d::Event* event) override; // 開始のアニメーション void animationStart(); @@ -41,6 +50,13 @@ class PrologueScene CREATE_FUNC(PrologueScene); private: + // 現在の処理状態 + State _state; + // メッセージのインデックス + unsigned int _messageIndex; + // メッセージの配列 + cocos2d::Array* _messageArray; + // メッセージラベル cocos2d::LabelTTF* _messageTTF; cocos2d::extension::CCBAnimationManager* _animationManager; };