Prainブログ

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

*

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

      2016/07/13

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

 

最初に書籍で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話 「ヒットエフェクトの表示」

 

 

 - ,

        

Message

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

  関連記事

マップイメージ
ゲーム制作 Cocos2d-x関連 第14回 「プレイヤー攻撃によるダメージ計算、ターン交代」

今回はプレイヤーのターン、敵のターンを交互に行うようにしていきます。また、それぞ …

cocos2dx
Cocos2d-x カスタムイベントを利用してソースコードの可読性をあげる

こんにちは、akiです。 この記事ではカスタムイベントの使い方について説明します …

cocos2dx
Cocos2d-x セーブデータをサーバに送信して保存する

こんにちは、akiです。 この記事ではクライアントからサーバにセーブデータを送信 …

cocos2dx
Cocos2d-x クライアント側のHttpレスポンス処理

この記事は「Cocos2d-x セーブデータをサーバに送信して保存する」の続きに …

スプライトシート作成
Cocos2d-x スプライトシートを作成して画像を楽に管理したい

Cocos2d-x スプライトシートを作成して画像を楽に管理したい この記事では …