プロジェクト演習Ⅱ インタラクティブゲーム制作 第6回 はじめての3Dプログラミング 鳴らしちゃうよ編
今日の内容 鳴らしたい! サウンドプログラミングの基礎 鳴れ!とにかく鳴れ! 音量には注意してね
今週のプロジェクト 授業資料ページからダウンロードします 今週のFKUT更新情報 落としたZipファイルを解凍して、出てきたフォルダを好きなところに配置 今週のFKUT更新情報 サウンド関連の機能を追加
今日のサンプル BGMを鳴らします SEを鳴らします 3Dサラウンドにも挑戦してみたりなんかしちゃったりなんかしちゃったりなんかして
音のデータの扱い方 音は波形のデータです 様々なファイル形式があります 波の形をものすごい細かく記録したデータ 生の音声データ 高音質で再生処理が軽いが長時間のデータが肥大化 Waveファイル(.wav) 圧縮した音声(音楽)データ できるだけ音質を保ちつつコンパクト でも再生が重い MP3ファイル(.mp3) Oggファイル(.ogg)
とにかくサイズが大きくなりがち BGMは圧縮データ 効果音はWaveデータ フリー素材を探してみよう 変換ツールをゲットしておこう ここではOggファイルを扱うことにする 効果音はWaveデータ Windows標準のサウンドレコーダでも 作れる フリー素材を探してみよう 「ザ・マッチメイカァズ」などが有名 変換ツールをゲットしておこう
ぽいーん、は手元にないですが キー操作にあわせて 鳴らしてみよう
効果音用のすごい変数 fk_AudioWavBuffer 手順 Waveファイルを効果音として再生できる openでWaveファイルを読み込む playで再生 だけど毎ループ呼び続けないと止まってしまう ちょっと工夫が必要
こんな感じ… fk_AudioWavBuffer se1; bool se1_play = false; se1.open(“hogehoge.wav”); se1_play = se1.play(); // ループ内では if(se1_play == true) { }
YesかNoかを覚える変数 bool型という変数 Javaだと”boolean”という名前なので注意 true(Yesの状態)とfalse(Noの状態)をとる いわゆる「フラグ」に使われることが多い play()命令は再生に成功したらtrueが、 失敗あるいは最後まで到達したらfalseが帰ってくる なので結果をbool型の変数で捕まえておくと効率的に条件分岐ができる
キー操作に合わせるには // ループ中にて if(キーが押された瞬間か?) { 再生したい音のフラグ = true; } // フラグの操作と、状態による分岐を 分けて考えるのがCoolなプログラム if(再生したい音のフラグはtrue?) { (前略)音のフラグ = すごい音変数.play();
やることはだいたい一緒です BGMの再生
BGM再生用のすごい変数 fk_AudioStream 手順 Oggファイルってどう作るのさ? OggファイルをBGMとして再生 openで読み込み playで再生 Oggファイルってどう作るのさ? XRECORDというフリーソフトがかなり最強 MP3からの変換もできる
BGMと効果音の再生形式の違い BGMはファイルサイズが大きい SEはファイルサイズが小さい 少しずつ読み込みながら再生する ストリーミング再生処理と呼ぶ Waveは大きすぎるのでOggのみにしてある SEはファイルサイズが小さい 一気にメモリ上に読み込んで再生する WaveでもOggでも使用可 短めのOggを効果音として扱いたい場合は fk_AudioOggBuffer型の変数を使う
命令は共通、かつ単純 open play pause seek tell setGain setLoopMode ファイルを読み込む 読み込みの正否をboolで返す play 鳴らす 鳴らし続けたい間 呼び続ける必要がある 再生中ならtrue、末端まで再生したらfalseが返る pause 止める、playで再開可 seek 指定位置へ頭出し 単位は秒(double) tell 現在再生位置を取得 ちょっと不正確 setGain 音量調整(0.0~1.0) setLoopMode trueを渡すと末端まで 再生したら自動的に 最初に巻き戻って 再生を続ける
イヤホンじゃないと分かりづらいかもしれないけど サラウンドに挑戦してみよう
サラウンドとは? ドルビー5.1chとかのアレ 空間の中に実際にいるように音が 聞こえてくるアレ 特殊な機材やスピーカを揃えなくても、ある程度それっぽく再生できるように なってきた
3Dサラウンド 効果音再生用のすごい変数は3次元座標を 与えることでサラウンド表現が可能 setPosition()で定点指定 setModel()で与えたモデルの位置に追従 setReferenceDist()で音の届く距離を設定 setListenerModel()でリスナー (多くの場合はカメラモデル)を設定
カメラモデルって? 今まではWindowに内蔵のカメラを使っていた カメラも本来「位置」と「向き」を持つfk_Model型の変数で表される そのカメラモデルを「サラウンドでリスナーのいる位置」として渡してやる
今日の課題 BASIC ADVANCED EXTREME ジャンプに効果音を付けてみよう BGMを鳴らして、キー操作で音量を上げ下げ できるようにしてみよう EXTREME 特定の場所から聞こえてくる音を配置してみよう