SDL_Mixer Problem
Posted: Tue Aug 04, 2009 2:00 pm
Code: Select all
#include "SDL.h"
#include "SDL_mixer.h"
#include "SDL_ttf.h"
#include "SDL_image.h"
#include <string>
//Screen attributes
const int SCREEN_WIDTH = 640;
const int SCREEN_HEIGHT = 480;
const int SCREEN_BPP = 32;
//Score
int score = 0;
//Round
int round = 1;
//Sounds
Mix_Chunk *flap = NULL;
//The surfaces
SDL_Surface *background = NULL;
SDL_Surface *shotMessage = NULL;
SDL_Surface *screen = NULL;
SDL_Surface *shotBox = NULL;
SDL_Surface *duckBox = NULL;
SDL_Surface *scoreBox = NULL;
SDL_Surface *scoreMessage = NULL;
SDL_Surface *hitMessage = NULL;
SDL_Surface *ducks = NULL;
SDL_Surface *bullets = NULL;
SDL_Surface *scoreNumber = NULL;
SDL_Surface *roundNumber = NULL;
//The event structure
SDL_Event event;
//The font that's going to be used
TTF_Font *font = NULL;
TTF_Font *fontLarge = NULL;
//The colors of the fonts
SDL_Color green = { 188, 243, 27 };
SDL_Color blue = { 58, 195, 249 };
SDL_Color white = { 255, 255, 255 };
//The sounds
SDL_Surface *load_image( std::string filename )
{
//The image that's loaded
SDL_Surface* loadedImage = NULL;
//The optimized surface that will be used
SDL_Surface* optimizedImage = NULL;
//Load the image
loadedImage = IMG_Load( filename.c_str() );
//If the image loaded
if( loadedImage != NULL )
{
//Create an optimized surface
optimizedImage = SDL_DisplayFormat( loadedImage );
//Free the old surface
SDL_FreeSurface( loadedImage );
//If the surface was optimized
if( optimizedImage != NULL )
{
//Color key surface
SDL_SetColorKey( optimizedImage, SDL_SRCCOLORKEY, SDL_MapRGB( optimizedImage->format, 0xFF, 0, 0xFF ) );
}
}
//Return the optimized surface
return optimizedImage;
}
void apply_surface( int x, int y, SDL_Surface* source, SDL_Surface* destination, SDL_Rect* clip = NULL )
{
//Holds offsets
SDL_Rect offset;
//Get offsets
offset.x = x;
offset.y = y;
//Blit
SDL_BlitSurface( source, clip, destination, &offset );
}
bool init()
{
//Initialize all SDL subsystems
if( SDL_Init( SDL_INIT_EVERYTHING ) == -1 )
{
return false;
}
//Set up the screen
screen = SDL_SetVideoMode( SCREEN_WIDTH, SCREEN_HEIGHT, SCREEN_BPP, SDL_SWSURFACE );
//If there was an error in setting up the screen
if( screen == NULL )
{
return false;
}
//Initialize SDL_ttf
if( TTF_Init() == -1 )
{
return false;
}
//Initialize SDL_mixer
if( Mix_OpenAudio( 22050, MIX_DEFAULT_FORMAT, 2, 4096 ) == -1 )
{
return false;
}
//Set the window caption
SDL_WM_SetCaption( "Duck Hunt", NULL );
//If everything initialized fine
return true;
}
bool load_files()
{
//Load the images
background = load_image( "background.png" );
shotBox = load_image( "Shotbox_S.png" );
duckBox = load_image( "Duckbox_S.png" );
scoreBox = load_image( "Scorebox_S.png" );
ducks = load_image( "Duck.png" );
bullets = load_image( "Bullet.png" );
//Load the sounds
flap = Mix_LoadWAV( "Flap.wav" );
if ( flap = NULL )
{
return 1;
}
//Open the font
font = TTF_OpenFont( "dlxfont.ttf", 12 );
fontLarge = TTF_OpenFont( "dlxfont.ttf", 18 );
//If there was a problem in loading the background
if( background == NULL )
{
return false;
}
//If there was an error in loading the font
if( font == NULL )
{
return false;
}
if( fontLarge == NULL )
{
return false;
}
//If everything loaded fine
return true;
}
void clean_up()
{
//Free the surfaces
SDL_FreeSurface( background );
SDL_FreeSurface( shotMessage );
SDL_FreeSurface( scoreMessage );
SDL_FreeSurface( scoreNumber );
SDL_FreeSurface( hitMessage );
SDL_FreeSurface( ducks );
SDL_FreeSurface( bullets );
SDL_FreeSurface( roundNumber );
//Free the mixes
Mix_FreeChunk( flap );
//Quit SDL_mixer
Mix_CloseAudio();
//Close the font that was used
TTF_CloseFont( font );
TTF_CloseFont( fontLarge );
//Quit SDL_ttf
TTF_Quit();
//Quit SDL
SDL_Quit();
}
int main( int argc, char* args[] )
{
//Quit flag
bool quit = false;
//Initialize
if( init() == false )
{
return 1;
}
//Load the files
if( load_files() == false )
{
return 1;
}
//Render the text
shotMessage = TTF_RenderText_Solid( font, "SHOT", blue );
scoreMessage = TTF_RenderText_Solid( fontLarge, "SCORE", white );
hitMessage = TTF_RenderText_Solid( fontLarge, "HIT", green );
char text[255];
sprintf_s(text, "%d", score);
scoreNumber = TTF_RenderText_Solid(fontLarge, text, white);
sprintf_s(text, "R=%d", round);
roundNumber = TTF_RenderText_Solid(fontLarge, text, green);
//If there was an error in rendering the text
if( shotMessage == NULL )
{
return 1;
}
//Apply the images to the screen
apply_surface( 0, 0, background, screen );
apply_surface( 25, 420, shotBox, screen );
apply_surface( 140, 420, duckBox, screen );
apply_surface( 500, 420, scoreBox, screen);
apply_surface( 50, 460, shotMessage, screen );
apply_surface( 40, 440, bullets, screen );
apply_surface( 65, 440, bullets, screen );
apply_surface( 90, 440, bullets, screen );
apply_surface( 525, 455, scoreMessage, screen );
apply_surface( 595, 435, scoreNumber, screen );
apply_surface( 150, 430, hitMessage, screen );
apply_surface( 220, 432, ducks, screen );
apply_surface( 240, 432, ducks, screen );
apply_surface( 260, 432, ducks, screen );
apply_surface( 45, 390, roundNumber, screen );
Mix_PlayChannel( -1, flap, 0 );
//Update the screen
if( SDL_Flip( screen ) == -1 )
{
return 1;
}
//While the user hasn't quit
while( quit == false )
{
//While there's events to handle
while( SDL_PollEvent( &event ) )
{
//If the user has Xed out the window
if( event.type == SDL_QUIT )
{
//Quit the program
quit = true;
}
}
}
//Free surfaces and font then quit SDL_ttf and SDL
clean_up();
return 0;
}