Cocos2d-x ゲーム制作

ゲーム制作 Cocos2d-x関連 第11回 「音楽、効果音を鳴らす」

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

いつになったらゲームで音楽を流せるようになるの~

 

最初に書籍でcocos2dxの勉強をしていた時、こんなことを思っていた気がします・・・

 

 

今回はサウンド関連です。それでは早速やっていきます。

 

 

音素材のダウンロード

音楽は「魔王魂」様、効果音は「無料効果音で遊ぼう」様より配布されているものになります。ありがたく使用させていただきます。

 

音楽

魔王魂 様

・テーマ01

・フィールド09

・イベント-ジングル05

・イベント-ジングル10

ダウンロード

 

効果音

無料効果音で遊ぼう 様

・蹴り(重い打撃)

リンク先

 

・反射

リンク先

 

効果音についてはリンク先からダウンロードください。

 

ダウンロードした素材はXcodeのresources配下にドラッグアンドドロップしてください。

 

 

音を出すための下準備プログラム実装

サウンドを鳴らすための下準備をしてきます。下記のプログラムを記述してください。

 

HelloWorldScene.cpp

#include "SimpleAudioEngine.h"

 

HelloWorldScene.cpp HelloWorld::init

 // 音楽のプリロード
 CocosDenshion::SimpleAudioEngine::getInstance()->preloadBackgroundMusic("game_maoudamashii_4_field09.mp3"); // バトル曲
 CocosDenshion::SimpleAudioEngine::getInstance()->preloadBackgroundMusic("game_maoudamashii_9_jingle05.mp3"); // 勝利曲
 CocosDenshion::SimpleAudioEngine::getInstance()->preloadBackgroundMusic("game_maoudamashii_9_jingle10.mp3"); // 敗北曲

 // 効果音のプリロード
 CocosDenshion::SimpleAudioEngine::getInstance()->preloadBackgroundMusic("kick1.mp3"); // 打撃音
 CocosDenshion::SimpleAudioEngine::getInstance()->preloadBackgroundMusic("reflection.mp3"); // 反射音

 

 

プログラム実装

バトル音楽の再生

HelloWorldScene.cpp HelloWorld::init

    // 音楽の再生
    CocosDenshion::SimpleAudioEngine::getInstance()->playBackgroundMusic("game_maoudamashii_4_field09.mp3", true);

 

 

ボールとドロップがヒットしたタイミングでの反射音の再生

HelloWorldScene.cpp HelloWorld::update

void HelloWorld::update(float dt){
    if(_ball->_isBallMoving){
        float x = _ball->getPosition().x - _ball->_speed*cosf(CC_DEGREES_TO_RADIANS(_ball->_degree));
        float y = _ball->getPosition().y + _ball->_speed*sinf(CC_DEGREES_TO_RADIANS(_ball->_degree));
        _ball->setPosition(Vec2(x, y));
         
         
        // ドロップに接触した場合の跳ね返りの処理
        std::list<Sprite*>::iterator it;
        for(it = _dropList.begin(); it != _dropList.end(); it++){
            if(hitDetectionOval(_ball, (*it))){
                // 跳ね返り角度の更新
                _ball->_degree = getDegree(_ball->getPosition(), (*it)->getPosition());

                // 効果音
                CocosDenshion::SimpleAudioEngine::getInstance()->playEffect("reflection.mp3");
            }
        }
         
        // 画面端に接触した場合の跳ね返りの処理
        Size visibleSize = Director::getInstance()->getVisibleSize();
        // 画面下端
        if(_ball->getPosition().y - _ball->getContentSize().height / 2 <= 0){
            _ball->_degree = _ball->_degree * -1;
            y = _ball->getContentSize().height / 2;
        }
         
        // 画面上端
        if(_ball->getPosition().y + _ball->getContentSize().height / 2 >= visibleSize.height - _enemy->getContentSize().height){
            _ball->_degree = _ball->_degree * -1;
            y = visibleSize.height - _ball->getContentSize().width / 2 - _enemy->getContentSize().height;
        }
         
        // 画面左端
        if(_ball->getPosition().x - _ball->getContentSize().width / 2 <= 0){
            _ball->_degree = 180 - _ball->_degree;
            x = _ball->getContentSize().width / 2;
        }
         
        // 画面右端
        if(_ball->getPosition().x + _ball->getContentSize().width / 2 >= visibleSize.width){
            _ball->_degree = 180 - _ball->_degree;
            x = visibleSize.width - _ball->getContentSize().width / 2;
        }
         
        _ball->setPosition(Vec2(x, y));
         
         
 
        // 減速処理
        _ball->_speedDownCount++;
        // 一定回数をカウントしたら徐々に減速する
        if(_ball->_speedDownCount > 100){
            // スピードが0になったらムーブフラグをfalseにする。減速したスピードを元に戻し、スピードダウンカウントを0に初期化する
            if(_ball->_speed <= 0){
                // 減速していたスピードを元に戻す
                _ball->_speed = 50;
 
                // ボール移動中フラグを元に戻す
                _ball->_isBallMoving = false;
 
                // カウンタのリセット
                _ball->_speedDownCount = 0;
 
            }else{
                // 減速処理
                _ball->_speed -= 1;
  
            }
        }
    }
 
}

 

 

プログラム解説

Cocos2d-xではSimpleAudioEngineというものを使用してサウンドを鳴らします。この回ではバトル音楽と反射音のみ実装しています。残りは別の回で使用します。

 

基本的には鳴らしたい箇所に「playBackgroundMusic」もしくは「playEffect」を入れるだけですが、注意点もあります。プログラム実装にも記述しているように、サウンドファイルをプリロードしてオンメモリ状態にしておかないと、読み込み遅延などが発生し、音のズレが生じる場合があると言われています。

 

 

シミュレータの起動

それではシミュレータを起動してサウンドが流れていることを確認しましょう。

 

どうでしょうか?ぐっとゲームらしくなりましたよね!

次はボールがドロップにヒットした際に、ヒットエフェクトを表示するようにしましょう。

 

 

次回

第12話 「ヒットエフェクトの表示」

 

 

PrainGoogleAdSense

PrainGoogleAdSense

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

執筆者:


comment

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

関連記事

回復エフェクト

Cocos2d-x アニメーションを利用した回復エフェクトの表示方法

この記事では、Cocos2d-xのアニメーションを利用したエフェクトの表示方法について紹介します。     また、少し実践的なアニメーションの利用方法をシリーズ記事として全5回で予 …

エフェクトサムネ

ゲーム制作 Cocos2d-x関連 第12回 「ボールヒットエフェクトの表示」

派手なヒットエフェクトが欲しい!   この回では、派手では無いですが、ボールがドロップにヒットしたタイミングでヒットエフェクトを表示していきたいと思います。 一口にエフェクトと言っても色々な …

エフェクト

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

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

cocos2dx

Cocos2d-x サーバ側の処理とデータ送信(Httpレスポンス)

この記事は「Cocos2d-x セーブデータをサーバに送信して保存する」の続きになります。 ・第1回 : サーバにデータを保存したい理由と全体の流れ ・第2回 : クライアント側の処理とデータ送信(H …

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

勝利演出、敗北演出を実装していきます。今回で最終回です!     仕様の検討 1.バトル中、プレイヤーのHPが0になった場合 → 勝利演出 → 勝利演出中に画面をタップするとスター …