Cocos2d-x ゲーム制作

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

投稿日:2016年7月19日 更新日:

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

 

 

仕様の検討

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つの要素」

 

 

PrainGoogleAdSense

PrainGoogleAdSense

-Cocos2d-x, ゲーム制作
-,

執筆者:


  1. さとよし より:

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

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

comment

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

関連記事

狼ちゃんボール

ゲーム制作 Cocos2d-x関連 第2回 「Cocos2d-xで作ろう!!~画像の表示処理」

いきなり知らない単語が!Cocos2d-x?Cocos2d-xで画像を表示しよう!     Cocos2d-xって? 今回はCocos2d-xを使用してゲームを作ります。 Coco …

エフェクト

Cocos2d-x 加算合成を利用して、背景が黒い画像をアニメーションで使えるようにする方法

アニメーションを利用してエフェクト表示するときに、以下のようなエフェクト素材を目にすることはよくあると思います。背景が透過処理されているものではなく、黒く塗りつぶされているものです。 元になる素材は「 …

cocos2dx

Cocos2d-x カスタムイベントを削除するタイミング

こんにちは、akiです。 この記事ではカスタムイベントを削除するタイミングについて説明します。   掲題の通り、カスタムイベントを登録した場合、不要になった際に明示的に削除してやる必要があり …

状態遷移

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

ゲームの操作感がわかってきたところで、ゲーム全体の流れの大枠を作っていきましょう。     今回のゲームはターン制を想定しています。つまり、プレイヤーのターンと敵のターンです。 な …

エフェクト

Cocos2d-x エフェクトアニメーションの終了と同時にエフェクトを消す方法

この記事では、アニメーションを表示し終わった後に、アニメーション表示を消す方法を紹介します。   ゲーム中であれば、アニメーションが1ループしたら消してしまいたいことも多いと思います。 方法 …