Taylor
Taylor

Reputation: 51

SDL basic program does not work but the code is fine

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

Answers (2)

Taylor
Taylor

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

Lan Pac
Lan Pac

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

Related Questions