Reputation: 51
I downloaded the source zip file from this tutorial website and extracted the contents to a folder.
I then used Code::Blocks to run the source code as provided by the tutorial (so there should be no code errors) but the program exits without displaying the images or giving any errors.
I think the problem is with SDL_DisplayFormat(loadedImage);
since it seems to return NULL, but using SDL_GetError() I find no errors.
The images are in the same directory of the source file and are the valid bmp files downloaded from the tutorial website.
This is the source code:
//The headers
#include "SDL/SDL.h"
#include <string>
//The attributes of the screen
const int SCREEN_WIDTH = 640;
const int SCREEN_HEIGHT = 480;
const int SCREEN_BPP = 32;
//The surfaces that will be used
SDL_Surface *message = NULL;
SDL_Surface *background = NULL;
SDL_Surface *screen = NULL;
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;
//Load the image
loadedImage = SDL_LoadBMP( filename.c_str() );
//If nothing went wrong in loading the image
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 );
}
int main( int argc, char* args[] )
{
//Initialize all SDL subsystems
if( SDL_Init( SDL_INIT_EVERYTHING ) == -1 )
{
return 1;
}
//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 1;
}
//Set the window caption
SDL_WM_SetCaption( "Hello World", NULL );
//Load the images
message = load_image( "hello.bmp" );
background = load_image( "background.bmp" );
//Apply the background to the screen
apply_surface( 0, 0, background, screen );
apply_surface( 320, 0, background, screen );
apply_surface( 0, 240, background, screen );
apply_surface( 320, 240, background, screen );
//Apply the message to the screen
apply_surface( 180, 140, message, screen );
//Update the screen
if( SDL_Flip( screen ) == -1 )
{
return 1;
}
//Wait 2 seconds
SDL_Delay( 2000 );
//Free the surfaces
SDL_FreeSurface( message );
SDL_FreeSurface( background );
//Quit SDL
SDL_Quit();
return 0;
}
Upvotes: 1
Views: 327
Reputation: 51
Okay, I found my problem.
In my hand-typed code, I accidentally had if (screen = NULL)
instead of if (screen == NULL)
, which of course set the screen to NULL and made SDL_DisplayFormat
also return NULL.
The reason that the copy-pasted code from the tutorial was not working either was because I was accidentally still running my hand-typed code in Code::Blocks.
Thanks for the help anyways.
Upvotes: 0
Reputation: 375
Try putting the images in the same folder with the executable.Because the executable is the one that is gonna use them and therefore needs them in the same folder not the source file.So if it is in codeblocks I think it is in the folder: "YouProjectName"/bin/Debug. Of course you can always give the full path of the images so by doing this you can put the images in any folder you want.
Upvotes: 1