Bu bölümde sdl de ses dosyalarının açılması ve kullanılması konusu kısaca işlenecektir.
Ses dosyalarının sdl de işlenebilmesi için üçüncü parti bir kütüphanenin projemize eklenmesi gerekir.SDL_mixer.lib kütüphanesi önceki bölümlerde yapıldığı gibi aynen indirilmeli ve
kütüphane yükleme yöntemlerimize göre aynı şekilde projemize eklenmelidir.[...]
Aşağıda görüldüğü üzere eklenen yeni kütüphane kullanılarak, ses dosyaları üzerinde çalışmamızı sağlayacak olan .h eklenmiştir.Ses verisini tutacak olan tipimiz Mix_Music ile Mix_Chunk tipleridir.
Mix_music müzik verisini tutar,mix_chunk ise müzik efektleri için kullanılır.
Diğer bilgiler comment olarak yeni olan bölümlere eklenmiştir.
Kaynak kod:
CODE:
#include <SDL.h>
#include <SDL_image.h>
#include <SDL_ttf.h>
#include <SDL_mixer.h>
#include <string>
#define WIDTH 640
#define HEIGHT 480
#define BPP 32
typedef SDL_Surface * surfacePtr;
surfacePtr screen = NULL;
surfacePtr message = NULL;
surfacePtr background = NULL;
SDL_Event event;
TTF_Font * font = NULL;
SDL_Color color = {0,0,0};
Mix_Music * music = NULL;
Mix_Chunk * scratch = NULL;
Mix_Chunk * high = NULL;
Mix_Chunk * low = NULL;
Mix_Chunk * med = NULL;
surfacePtr loadimage(std::string filename)
{
surfacePtr loaeded,optimized;
loaeded = IMG_Load(filename.c_str());
if(loaeded)
{
optimized = SDL_DisplayFormat(loaeded);
SDL_FreeSurface(loaeded);
if(optimized)
{
SDL_SetColorKey(optimized,SDL_SRCCOLORKEY,SDL_MapRGB(optimized->format,0,0xFF,0xFF));
}
}
return optimized;
}
void apply_surface(int x,int y,surfacePtr src,surfacePtr dest,SDL_Rect * clip = NULL)
{
SDL_Rect rect;
rect.x = x;
rect.y = y;
SDL_BlitSurface(src,clip,dest,&rect);
}
bool init()
{
if(SDL_Init(SDL_INIT_EVERYTHING) == -1)
return false;
screen = SDL_SetVideoMode(WIDTH,HEIGHT,BPP,SDL_SWSURFACE);
if(screen == NULL)
return false;
if(TTF_Init() == -1)
return false;
//Ses verilerinin ilk yüklendiği metod.
//İlk parametre kullanılacak frekans.
//ikinci parametre ses formatı.default seçildi.
//Üçüncüsü ses verileri için kaç kanal kullanılacak ? 1-mono 2-stereo
//Dördüncüde kullanılacak veri boyutu...
if(Mix_OpenAudio(22050,MIX_DEFAULT_FORMAT,2,4096) == -1)
return false;
return true;
}
bool loadfiles()
{
background = loadimage("background.png");
font = TTF_OpenFont("lazy.ttf",30);
if(background == NULL)
return false;
if(font == NULL)
return false;
//Ses dosyalarını yüklemek için kullanılır.Yüklenmezse dönüş tipi null dır.
music = Mix_LoadMUS("beat.wav");
if(music == NULL)
return false;
//Ses efektlerini yüklemek için kullanılır.Yüklenmezse dönüş tipi null dır.
scratch = Mix_LoadWAV("scratch.wav");
high = Mix_LoadWAV("high.wav");
med = Mix_LoadWAV("medium.wav");
low = Mix_LoadWAV("low.wav");
if( ( scratch == NULL ) || ( high == NULL ) || ( med == NULL ) || ( low == NULL ) )
{
return false;
}
return true;
}
void cleanup()
{
SDL_FreeSurface(background);
//Ses bilgilerinin temizlenmesi.
Mix_FreeChunk(scratch);
Mix_FreeChunk(low);
Mix_FreeChunk(high);
Mix_FreeChunk(med);
Mix_FreeMusic(music);
TTF_CloseFont(font);
Mix_CloseAudio();
TTF_Quit();
SDL_Quit();
}
int main(int argc,char *argv[])
{
if(init() == false)
return 1;
bool quit = false;
if(loadfiles() == false)
return 1;
apply_surface(0,0,background,screen);
message = TTF_RenderText_Solid(font,"press 1 2 3 4 ",color);
if(message == NULL)
return 1;
apply_surface((WIDTH - message->w)/2,100,message,screen);
SDL_FreeSurface(message);
message = TTF_RenderText_Solid(font,"press 9 to pause",color);
if(message == NULL)
return 1;
apply_surface((WIDTH - message->w)/2,200,message,screen);
SDL_FreeSurface(message);
message = TTF_RenderText_Solid(font,"press 0 to stop",color);
if(message == NULL)
return 1;
apply_surface((WIDTH- message->w)/2,300,message,screen);
if(SDL_Flip(screen) == -1)
return 1;
while(quit == false)
{
while(SDL_PollEvent(&event))
{
if(event.type == SDL_KEYDOWN)
{
if(event.key.keysym.sym == SDLK_1)
{
//Ses efekti olarak seçilen çalınacak.
if(Mix_PlayChannel(-1,scratch,0) == -1)
return 1;
}
else if(event.key.keysym.sym == SDLK_2)
{
//Ses efekti olarak seçilen çalınacak.
if(Mix_PlayChannel(-1,high,0) == -1)
return 1;
}
else if(event.key.keysym.sym == SDLK_3)
{
//Ses efekti olarak seçilen çalınacak.
if(Mix_PlayChannel(-1,med,0) == -1)
return 1;
}
else if(event.key.keysym.sym == SDLK_4)
{
//Ses efekti olarak seçilen çalınacak.
if(Mix_PlayChannel(-1,low,0) == -1)
return 1;
}
else if(event.key.keysym.sym == SDLK_9)
{
//Müzik çalınacak
if(Mix_PlayingMusic() == 0)
{
if(Mix_PlayMusic(music,-1) == -1)
return 1;
}
else
{
//Müzik durdurulacak veya devam edilecek.
if(Mix_PausedMusic())
{
Mix_ResumeMusic();
}
else
{
Mix_PauseMusic();
}
}
}//Müzik kapatılacak.
else if(event.key.keysym.sym == SDLK_0)
{
Mix_HaltMusic();
}
}
if(event.type == SDL_QUIT)
quit = true;
}
}
cleanup();
return 0;
}
hgedek
hgedek@gmail.com
17 Eylul 2007 19:16