So, following the lazyfoo.net tutorials on SDL, and with the help of a friend/team member who created some neat images for me, I tried to make a simple program that shows a menu with some text, and after a key press (I didn't implement that part yet) goes into the 'main game' (in reality, just another background) and after a short delay shuts down. Here's my code - I know it's not optimal writing all of it in a single source file, but I'm trying to keep things simple before moving into multiple files:
#include "SDL/SDL.h"
#include "SDL/SDL_ttf.h"
#include <string>
//The attributes of the screen
const int SCREEN_WIDTH = 640;
const int SCREEN_HEIGHT = 480;
const int SCREEN_BPP = 32;
//Surfaces to be used
SDL_Surface* screen = NULL;
SDL_Surface* backImage = NULL;
SDL_Surface* batImage = NULL;
SDL_Surface* backMenu = NULL;
SDL_Surface* messageMenu = NULL;
//Fonts to be used
TTF_Font* menuFont = NULL;
//Function definitions
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;
}
//Set the window caption
SDL_WM_SetCaption( "TTF Test", NULL );
//If everything initialized fine
return true;
}
SDL_Surface* load_image(std::string filename)
{
//Temporary storage for the image that's loaded
SDL_Surface* loadedImage = NULL;
//The optimized image that will be used
SDL_Surface* optimizedImage = NULL;
loadedImage = SDL_LoadBMP( filename.c_str());
if( loadedImage != NULL )
{
//Create an optimized image
optimizedImage = SDL_DisplayFormat( loadedImage );
//Free the old image
SDL_FreeSurface( loadedImage );
}
//Return the optimized image
return optimizedImage;
}
void apply_surface( int x, int y, SDL_Surface* source, SDL_Surface* destination )
{
//Make a temporary rectangle to hold the offsets
SDL_Rect offset;
//Give the offsets to the rectangle
offset.x = x;
offset.y = y;
//Blit the surface
SDL_BlitSurface( source, NULL, destination, &offset );
}
/*
void MainMenu()
{
SDL_Surface* bg_menu = NULL;
SDL_Surface* msg_menu = NULL;
TTF_Font* text_menu = NULL;
SDL_Color textColor = { 255, 255, 255 };
//load necessary files
bg_menu = load_image("menu_background.bmp")
}
*/
int main( int argc, char* args[] )
{
init();
// --------------- MAIN MENU START ---------------
//Load necessary menu files
backMenu = load_image("menu_background.bmp");
menuFont = TTF_OpenFont( "lazy.ttf", 28 );
SDL_Color menuTextColor = {255,255,255};
messageMenu = TTF_RenderText_Solid( menuFont, "Press Any Key To Continue", menuTextColor );
//If there was an error in rendering the text
if( messageMenu == NULL )
{
return 1;
}
//Render menu
apply_surface (0,0,backMenu,screen);
apply_surface (100,600,messageMenu,backMenu);
SDL_Flip(screen);
SDL_Delay(4000);
// --------------- MAIN MENU END ---------------
//Free surfaces
SDL_FreeSurface(backMenu);
SDL_FreeSurface(messageMenu);
TTF_CloseFont( menuFont );
SDL_Quit();
return 0;
}
I think it is a rather simple program but unfortunately it is giving me trouble. When I execute it, I get a brief black screen, the program shuts down and I get a status 3 error. I suspected it has something to do with the newly-installed TTF extension library, so I started commenting lines. Apparently, when I comment the
messageMenu = TTF_RenderText_Solid( menuFont, "Press Any Key To Continue", menuTextColor );
line, the program runs, I just only see the menu background, so I guess the glitch is isolated in that line of code.
I strongly believe that I installed the library correctly - else, would it be going up to that point? Of course I can't take an oath as I'm a beginner, but I don't think that's the problem.
Any ideas, folks? I'm really eager to implement some events, so I need to get over this!