勝利演出、敗北演出を実装していきます。今回で最終回です!
仕様の検討
1.バトル中、プレイヤーのHPが0になった場合 → 勝利演出 → 勝利演出中に画面をタップするとスタート画面(SCN01_StartScene)に画面遷移
2.バトル中、敵キャラのHPが0になった場合 → 敗北演出 → 敗北演出中に画面をタップするとスタート画面(SCN01_StartScene)に画面遷移
仕様のイメージ
バトル中にプレイヤー、および敵キャラのHPが0になった場合の状態変更(勝利状態に移行、もしくは敗北状態に移行)は、すでにガワとして実装済みですので、今回はその中身を実装していくことになります。それではやっていきましょう。
リソースの追加
いつものように画像を追加します。勝利画像、敗北画像を下記のリンクからダウンロードしてResoucesへ格納してください。
プログラム実装
HelloWorldScene.h
// コンストラクタ HelloWorld(); // デストラクタ virtual ~HelloWorld();
HelloWorldScene.cpp ヘッダ部
#include "SCN01_StartScene.hpp"
HelloWorldScene.cpp HelloWorld::HelloWorld
HelloWorld::HelloWorld(){ // do nothing }
HelloWorldScene.cpp HelloWorld::~HelloWorld
HelloWorld::~HelloWorld(){ // シーンを移動するときに子をすべてremoveする removeAllChildrenWithCleanup(true); }
HelloWorldScene.cpp HelloWorld::update
void HelloWorld::update(float dt){ // プレイヤーのターン if(_state == TYPE_PLAYER_TURN){ 中略 } // 敵のターン else if(_state == TYPE_ENEMY_TURN){ 中略 } // 勝利イベント else if(_state == TYPE_WIN){ if(!_gameEndEvent){ _gameEndEvent = true; // 現在流れている音楽を停止 CocosDenshion::SimpleAudioEngine::getInstance()->stopBackgroundMusic(); // 勝利音楽を演奏 CocosDenshion::SimpleAudioEngine::getInstance()->playBackgroundMusic("game_maoudamashii_9_jingle05.mp3"); // 勝利演出を表示 Sprite* win = Sprite::create("win.png"); Size visibleSize = Director::getInstance()->getVisibleSize(); win->setPosition(Vec2(visibleSize.width / 2, visibleSize.height / 2)); this->addChild(win, 30, 100); auto scaleBig = ScaleTo::create(1.2, 1.5); auto scaleSmall = ScaleTo::create(1.2, 1.0); auto seq = Sequence::create(scaleBig, scaleSmall, nullptr); auto rep = RepeatForever::create(seq); win->runAction(rep); } } // 敗北イベント else if(_state == TYPE_LOSE){ if(!_gameEndEvent){ _gameEndEvent = true; // 現在流れている音楽を停止 CocosDenshion::SimpleAudioEngine::getInstance()->stopBackgroundMusic(); // 敗北音楽を演奏 CocosDenshion::SimpleAudioEngine::getInstance()->playBackgroundMusic("game_maoudamashii_9_jingle10.mp3"); // 敗北演出を表示 Sprite* lose = Sprite::create("lose.png"); Size visibleSize = Director::getInstance()->getVisibleSize(); lose->setPosition(Vec2(visibleSize.width / 2, visibleSize.height / 2)); this->addChild(lose, 30, 100); auto scaleBig = ScaleTo::create(1.2, 1.5); auto scaleSmall = ScaleTo::create(1.2, 1.0); auto seq = Sequence::create(scaleBig, scaleSmall, nullptr); auto rep = RepeatForever::create(seq); lose->runAction(rep); } } }
・RepeatForever
cocos2dxのメソッドで、セットしたアクションを無限に繰り返し続けます。
HelloWorldScene.cpp HelloWorld::onTouchBegan
bool HelloWorld::onTouchBegan(Touch* pTouch, Event* pEvent){ // ゲームが終了したらタイトル画面に戻る if(_state == TYPE_WIN || _state == TYPE_LOSE){ Director::getInstance()->replaceScene(TransitionFade::create(2.5 , SCN01_StartScene::createScene() , Color3B::WHITE)); } // ボールが動いている状態でない、かつプレイヤーのターンであればタップ可能 if(!_ball->_isBallMoving && _state == TYPE_PLAYER_TURN){ // タップした座標を取得 Vec2 touchPoint = convertTouchToNodeSpace(pTouch); // タップした座標がボール画像の中に入っているかどうかを判断 if(_ball->boundingBox().containsPoint(touchPoint)){ // タップした座標とボール画像の座標の二点間の角度の取得 _ball->_degree = getDegree(_ball->getPosition(), touchPoint); // 矢印オブジェクトの角度を設定 _allow = Sprite::create("allow.png"); _allow->setPosition(Vec2(_ball->getPosition().x, _ball->getPosition().y)); _allow->setRotation(_ball->_degree); this->addChild(_allow, 0, 7); // パワーゲージカウント開始、パワーゲージカウントをリセット _isPowerGaugeCounting = true; _powerGaugeCount = 0; return true; } } return false; }
プログラム解説
HelloWorld::update
本メソッド中で勝利演出、敗北演出を表示します。アクション「RepeatForever」を利用することで、画像の拡大、縮小を無限に繰り返す演出としています。その際、「_gameEndEvent」フラグをtrueにします。アクションの使い方については第12回 「ボールヒットエフェクトの表示」をご覧ください。
HelloWorld::onTouchBegan
「_gameEndEvent」フラグがtrueの場合、画面遷移する記述を追加しています。また、プレイヤーのターンでしかボールにタップできないよう、タップ条件を追記しています。
HelloWorld::~HelloWorld
前回と同様、画面遷移をするときには、メモリリーク防止のため子ノードをすべてremoveしておきます。
シミュレータの起動
それではシミュレータを起動して動作確認してみましょう。
成功していれば仕様に示した通りの振る舞いになると思います。
終わりに
いかがでしたでしょうか。簡単なゲーム作りの一連の流れがわかるような記事にしてみたつもりですが、これからゲームを作ろうと思っている方の一助となれば幸いです。また、これからもCocos2d-xに限らず、役に立つゲーム制作系の記事を書いていく予定です。
ここまでご覧いただき、ありがとうございました!
お世話に鳴っております。
こちらのサイトを参考に、最初から最後までプログラムをさせていただきました。
おかげさまでCocos2d-xのゲームづくりの勉強に、非常に役に立ちました。
ありがとうございました!
コメントに関しても真摯にご対応いただき、ありがとうございました。
Cocos2d-xでゲームを作り始めるにあたり、色々な資料を探したのですが、こちらのサイトが一番勉強になりました。
書籍で考えてもこちらのレベルの資料はなかなか無いので、もう少し加筆して書籍化しても良いと思いました。
ありがとうございました。これからも、ゲーム作りを志す人達の役に立つようなBlogを書き続けていただけることを期待しています。