[GameUIT] Hướng dẫn đưa âm thanh vào game console

Chào các bạn ! Mình là Ếch đến từ CLB GameUIT :salute: .Tình hình là hum nay đi train thấy phần âm thanh còn chưa hấp dẫn chỉ play được 1 file 1 lúc thì cũng chán. Nên mình sẽ hướng dẫn các bạn cách sử dụng 1 thư viện âm thanh để có thể play được nhiều âm thanh cùng một lúc. Tuy nhiên cách làm cũng có 1 chút phức tạp nên phần này không có sẵn trong framework của cuộc thi GameUIT Hackathon 2013 chính thức (thư viện này được phép sử dụng trong cuộc thi nhé ). Nếu bạn nào làm theo và hiểu cách thêm code thì có thể thêm vào và chắc chắn game của mình sẽ sinh động hẳn lên đúng ko nào và cũng có thể khác hẳn các đội khác rùi :sure:
Chúng ta bắt đầu nhé ! :happy:
**1/ Cài đặt thư viện FMOD **
Bước 1: Các bạn tải file cài đặt FMOD cho Windows ở địa chỉ sau : http://www.fmod.org/index.php/release/version/fmodapi44414win-installer.exe (31.2 MB)
Bước 2: Cài đặt vào máy file vừa down về .
2/ Add thư viện FMOD vào Project
Bước 1 : Mở project Framework của BTC đã up lên (https://console-game-cpp.googlecode.com/files/Framework%20Win%2032%20Console.rar)

Bước 2 : Phải chuột vào Project “Console Game” => Chọn Properties => Chọn “VC ++ Directories”

Bước 3 : Bên phải ở phần” Include Directories” các bạn chọn mũi tên trỏ xuống và chọn “Edit”

Tiếp theo ban nhấn vào icon có hình folder (được khoanh tròn như trong hình), sau đó click vào “…” tìm đến thư mục “inc” trong thư mục cài đặt FMOD trước đó ( VD : C:\Program Files (x86)\FMOD SoundSystem\FMOD Programmers API Windows\api\inc ) . Sau đó chọn Select Folder => OK là xong

*Bước 4 : *làm tương tự như bước 3 nhưng các bạn chọn “Library Directories” và tìm tới đường dẫn “C:\Program Files (x86)\FMOD SoundSystem\FMOD Programmers API Windows\api\lib”

Bước 5 : Các bạn copy file “FMODEX.DLL” ở thư mục cài đặt FMOD ( C:\Program Files (x86)\FMOD SoundSystem\FMOD Programmers API Windows\api ) vào folder của project Framework như hình dưới

Bước 6 : Các bạn xuống phần “ Linker” => “Input” => trong phần “Additional Dependencies” các bạn gõ thêm dòng chữ “fmodex_vc.lib;” như trong hình. Rùi chọn OK.

3/ Tạo Struct GSound và các hàm liên quan
Bước 1 : Include các thư viện cần thiết của FMOD
Ở bước này thì chúng ta sẽ thêm vào chỗ include các thư viện các dòng sau :

#include <iostream>
#include <cstdlib>
#include <fmod.h>
#include <fmod.hpp>
using namespace std;

Bước 2: Tạo biến quản lý âm thanh của game
Ở file Utils.cpp các bạn tạo 1 biến “soundSystem” biến này có tác dụng là sẽ quản lý về việc load,tạo file âm thanh trong game.

//biến cho quản lý âm thanh
FMOD::System* soundSystem;

Bước 3: Tạo struct GSound và enum GSoundType
Ở file Utils.h các bạn định nghĩa 1 kiểu enum GSoundType và 1 struct GSound trong đó chưa các biến cần thiết như ở dưới :

typedef enum GSoundType
{
BACKGROUND_SOUND,//kiểu nhạc nền lặp đi lặp lại
EFFECT_SOUND//kiểu nhạc hiệu ứng (bắn,nổ …) 1 lần duy nhất
}GSoundType;
typedef struct GSound
{
GSoundType type;//kiểu âm thanh …
char *soundPath;// đường dẫn tới file âm thanh
FMOD::Sound *sound; //biến chưa thông tin về âm thanh << QUAN TRỌNG
FMOD::Channel *soundChannel; // chứa thông tin về kênh âm thanh sẽ được phát
}GSound;

*Bước 4: *Tạo các hàm cần thiết đê xử lý âm thanh
Ở file Utils.h các bạn định nghĩa các hàm như sau:

void GInitSoundSystem(); // dùng để khởi tạo biến quản lý sound trong game => Xem cho biết
void GUpdateSoundSystem(); //hàm update trạng thái cho sound trong game => Xem cho biết
void GCreateSound(GSound &sound); => Tạo file 1 sound theo 1 biến struct GSound truyền vào
void GPlaySound(GSound &sound); => Phát âm thanh theo biến struct GSound

Ở file Utils.cpp các bạn viết chi tiết nội dung hàm đã định nghĩa bên Utils.h

void GInitSoundSystem()
{
FMOD_RESULT result = FMOD::System_Create(&soundSystem);
FMOD_RESULT fm_res = soundSystem->init(100,FMOD_INIT_NORMAL,0);
}
void GUpdateSoundSystem()
{
soundSystem->update();
}
void GCreateSound(GSound &sound)
{
switch(sound.type)
{
case GSoundType::BACKGROUND_SOUND:
soundSystem->createStream(sound.soundPath,FMOD_SOFTWARE | FMOD_LOOP_NORMAL,0,&sound.sound);
break;
case GSoundType::EFFECT_SOUND:
soundSystem->createSound(sound.soundPath, FMOD_SOFTWARE,0,&sound.sound);
break;
}
}
void GPlaySound(GSound &sound)
{
soundSystem->playSound(FMOD_CHANNEL_FREE, sound.sound, false, &sound.soundChannel);
switch(sound.type)
{
case GSoundType::BACKGROUND_SOUND:
soundSystem->playSound(FMOD_CHANNEL_FREE, sound.sound, false, &sound.soundChannel);
break;
case GSoundType::EFFECT_SOUND:
soundSystem->playSound(FMOD_CHANNEL_FREE, sound.sound, false,NULL);
break;
}
}

Giờ qua bên file DemoTank.cpp. trong hàm main sau khi gọi hàm “init()”để khởi tạo cửa sổ , chúng ta sẽ khởi
tạo biến quản lý sound :

//Khởi tạo biến quản lý sound
GInitSoundSystem();

Chúng ta copy các file âm thanh sử dụng đặt vào chung với folder của project như trong hình dưới đây :

Giờ ta sẽ tạo ra 1 biến GSound kiểu nhạc nền và sẽ được phát ngay khi tạo xong .

GSound soundBGMusic = {GSoundType::BACKGROUND_SOUND,"hbt.mp3"};
GCreateSound(soundBGMusic);
GPlaySound(soundBGMusic);

Tạo tiếp 1 biến kiểu GSound nhưng giờ sẽ là kiểu nhạc effect khi đạn bắn ra

GSound gunEffectSound = {GSoundType::EFFECT_SOUND,"Gun_Shot.mp3"};
GCreateSound(gunEffectSound);

Trong hàm update input các bạn sẽ tìm đến chỗ xử lý phím bắn đạn ra và thêm vào giống như bên dưới :

if((GIsKeyPress(GKeys::KEY_SPACE)))
{
if(tank.bullet.isLive == false)
{
GPlaySound(gunEffectSound);
tank.bullet.isLive = true;
tank.bullet.direction = tank.direction;
tank.bullet.x = tank.x;
tank.bullet.y = tank.y;
}
}

NHƯ VẬY LÀ XONG CÁC BẠN HÃY F5 VÀ THƯỞNG THỨC XEM CÓ GÌ KHÁC KHÔNG NHÉ ! :hellboy:
**
DEMO : http://www.mediafire.com/download/128sxl23n14b6bw/Demo_Console_Game_With_Sound_FMOD(2).rar**

the best gay của CLB cuối cùng cũng đã lên tiếng :brick:

Một cái tut rất chi là công phu :smiley:

:look_down: đẹp trai nhất clb đấy

mấy thằng đẹp trai thường bị gay!

[QUOTE=10520163;208159]mấy thằng đẹp trai thường bị gay![/QUOTE]
thế sao nó xấu mà nó lại gay m :angry:

Đổi tên CLB thành The best gay club đê :funny:

[QUOTE=10520245;208201]Đổi tên CLB thành The best gay club đê :funny:[/QUOTE]
vãi, cútttttttttttttttttttttttttttt :pudency:

:plaster: The hot gay club. Em thấy cái đó hay mà.

Cũng dễ nhỉ :smiley:

có ai chỉ lại cho em không… khó vờ lờ… đờ bét gay

Em chơi âm thanh effect đc có 16 lần liên tục thôi mấy anh ơi. lần 17 sao chơi không được. :((( :stick: ai chỉ em cách fix với

Đúng là chỉ chơi liên lục được khoảng x lần!
p.s: #define x 16 :smiley: