Prainブログ

ゲーム開発とかIT小話とかその他雑記のブログ

*

ゲーム制作 Cocos2d-x関連 最終回 「勝利演出、敗北演出の追加」

      2016/08/02

勝利演出、敗北演出を実装していきます。今回で最終回です!

 

 

スポンサーリンク

 

 

仕様の検討

1.バトル中、プレイヤーのHPが0になった場合 → 勝利演出 → 勝利演出中に画面をタップするとスタート画面(SCN01_StartScene)に画面遷移

2.バトル中、敵キャラのHPが0になった場合 → 敗北演出 → 敗北演出中に画面をタップするとスタート画面(SCN01_StartScene)に画面遷移

 

仕様のイメージ

winlose

 

 

バトル中にプレイヤー、および敵キャラの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に限らず、役に立つゲーム制作系の記事を書いていく予定です。

 

 

ここまでご覧いただき、ありがとうございました!

 

 

おまけ 「ゲームを面白くするために意識する3つの要素」

 

 

 - ,

        

Comment

  1. さとよし より:

    お世話に鳴っております。
    こちらのサイトを参考に、最初から最後までプログラムをさせていただきました。
    おかげさまでCocos2d-xのゲームづくりの勉強に、非常に役に立ちました。
    ありがとうございました!
    コメントに関しても真摯にご対応いただき、ありがとうございました。
    Cocos2d-xでゲームを作り始めるにあたり、色々な資料を探したのですが、こちらのサイトが一番勉強になりました。

    書籍で考えてもこちらのレベルの資料はなかなか無いので、もう少し加筆して書籍化しても良いと思いました。
    ありがとうございました。これからも、ゲーム作りを志す人達の役に立つようなBlogを書き続けていただけることを期待しています。

Message

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

  関連記事

cocos2dx
ゲーム制作 Cocos2d-x関連 第1回 「ゲームを作ろう!!」

ゲーム制作をやってみたい!   誰もが一度はちらっと考えることなのでは …

ボールの進行方向
ゲーム制作 Cocos2d-x関連 第6回 「画面端でのボールの跳ね返り」

今回は画面端でのボールの跳ね返りを製作していきましょう。   前回では …

SDKBoxを使ってアプリ内課金をするやり方 インストール編

この記事では、アプリ課金のためのSDKBoxインストールのやり方を説明します。 …

状態遷移
ゲーム制作 Cocos2d-x関連 第13回 「ゲームの状態(プレイヤーのターン 敵のターン、etc・・・)の実装」

ゲームの操作感がわかってきたところで、ゲーム全体の流れの大枠を作っていきましょう …

シミュレータ
ゲーム制作 Cocos2d-x関連 第3回 「画像の表示処理 解説」

今回はCocos2d-xにおける画像表示コードの解説です。   スポン …