Thread: SDL + Keys

  1. #1
    Registered User
    Join Date
    Jan 2007
    Posts
    188

    SDL + Keys

    Hi peeps!

    My program, which i'm about to post, doesn't work. Why is that?
    It sais: 142 C:\Users\Fredrik\Desktop\Saker\Projekt\C++\SDL\Lea rn 1\main.cpp void value not ignored as it ought to be

    And it's not the only error of that sort. There is like 4 errors of that sort, and thats the only errors. Why am i getting theese errors?

    Code:
    //The headers
    #include "SDL/SDL.h"
    #include <string>
    
    //Screen attributes
    const int SCREEN_WIDTH = 640;
    const int SCREEN_HEIGHT = 480;
    const int SCREEN_BPP = 32;
    
    //The surfaces
    SDL_Surface *background = NULL;
    SDL_Surface *message = NULL;
    SDL_Surface *screen = NULL;
    SDL_Surface *piece = NULL;
    SDL_Surface *up = NULL;
    SDL_Surface *down = NULL;
    SDL_Surface *left = NULL;
    SDL_Surface *right = NULL;
    
    //The event structure
    SDL_Event event;
    
    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 = SDL_LoadBMP( 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 );
        }
        
        //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 in error in setting up the screen
        if( screen == NULL )
        {
            return false;    
        }
        
        //Set the window caption
        SDL_WM_SetCaption( "Walk-around-game", NULL );
        
        //If everything initialized fine
        return true;
    }
    
    bool load_files()
    {
        //Load the background image
        background = load_image( "bg.bmp" );
        piece = load_image( "piece.bmp" );
        
        //If there was a problem in loading the background
        if( background == NULL )
        {
            return false;    
        }
        
        //If there was a problem in loading the background
        if( piece == NULL )
        {
            return false;    
        }
        
        //If everything loaded fine
        return true;
    }
    
    void clean_up()
    {
        //Free the surfaces
        SDL_FreeSurface( background );
        SDL_FreeSurface( message );
        SDL_FreeSurface( piece );
        SDL_FreeSurface( up );
        SDL_FreeSurface( down );
        SDL_FreeSurface( left );
        SDL_FreeSurface( right );
        
        //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;
        }
        
        apply_surface( 10, 10, piece, screen );
        
        //Generate the message surfaces
        up = apply_surface( 10, 0, piece, screen );
        down = apply_surface( 10, 20, piece, screen );
        left = apply_surface( 0, 10, piece, screen );
        right = apply_surface( 20, 10, piece, screen );
        
        //Apply the background
        apply_surface( 0, 0, background, screen );
        
        //While the user hasn't quit
        while( quit == false )
        {
            //If there's an event to handle
            if( SDL_PollEvent( &event ) )
            {
                //If a key was pressed
                if( event.type == SDL_KEYDOWN )
                {
                    //Set the proper message surface
                    switch( event.key.keysym.sym )
                    {
                        case SDLK_UP: message = up; break;
                        case SDLK_DOWN: message = down; break;
                        case SDLK_LEFT: message = left; break;
                        case SDLK_RIGHT: message = right; break;    
                    }
                }
                
                //If the user has Xed out the window
                else if( event.type == SDL_QUIT )
                {
                    //Quit the program
                    quit = true;
                }
            }
            
            //If a message needs to be displayed
            if( message != NULL )
            {
                //Apply the background to the screen
                apply_surface( 0, 0, background, screen );
                
                //Null the surface pointer
                message = NULL;
            }
        
            //Update the screen
            if( SDL_Flip( screen ) == -1 )
            {
                return 1;    
            }
        }
            
        //Clean up
        clean_up();
        
        return 0;    
    }
    I think it has to do with the key thing.

    Code:
        up = apply_surface( 10, 0, piece, screen );
        down = apply_surface( 10, 20, piece, screen );
        left = apply_surface( 0, 10, piece, screen );
        right = apply_surface( 20, 10, piece, screen );
    I really(!) need help! Ty!

  2. #2
    Registered User
    Join Date
    Apr 2007
    Location
    Sweden
    Posts
    41
    Well, up, down, right, left and message are pointers to SDL_Surface. First of all, the names you chose for the variables doesn't exactly make it easy to understand their type. The fact that a variable called "message" actually doesn't hold a message but an image is really confusing.

    Second, apply_surface returns void. It's quite easy to see that "void" != "SDL_Surface*". That's why you get errors.

    I've really got no clue what this is supposed to do, but maybe you meant to do something like this?
    Code:
    apply_surface(10, 0, piece, up);
    apply_surface(10, 20, piece, down);
    // and so on

  3. #3
    Registered User VirtualAce's Avatar
    Join Date
    Aug 2001
    Posts
    9,607
    Moved to game programming forum.

    SDL is for game programming therefore this belongs on the game programming forum.

  4. #4
    Registered User
    Join Date
    Jan 2007
    Posts
    188
    Ok, now it starting to get better. But i can't move the piece. Why is that? =)

    Code:
    //The headers
    #include "SDL/SDL.h"
    #include <string>
    
    //Screen attributes
    const int SCREEN_WIDTH = 640;
    const int SCREEN_HEIGHT = 480;
    const int SCREEN_BPP = 32;
    
    //The surfaces
    SDL_Surface *background = NULL;
    SDL_Surface *holder = NULL;
    SDL_Surface *screen = NULL;
    SDL_Surface *piece = NULL;
    SDL_Surface *up = NULL;
    SDL_Surface *down = NULL;
    SDL_Surface *left = NULL;
    SDL_Surface *right = NULL;
    
    //The event structure
    SDL_Event event;
    
    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 = SDL_LoadBMP( 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 );
        }
        
        //Return the optimized surface
        return optimizedImage;
    }
    
    SDL_Surface *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 in error in setting up the screen
        if( screen == NULL )
        {
            return false;    
        }
        
        //Set the window caption
        SDL_WM_SetCaption( "Walk-around-game", NULL );
        
        //If everything initialized fine
        return true;
    }
    
    bool load_files()
    {
        //Load the background image
        background = load_image( "bg.bmp" );
        piece = load_image( "piece.bmp" );
        
        //If there was a problem in loading the background
        if( background == NULL )
        {
            return false;    
        }
        
        //If there was a problem in loading the background
        if( piece == NULL )
        {
            return false;    
        }
        
        //If everything loaded fine
        return true;
    }
    
    void clean_up()
    {
        //Free the surfaces
        SDL_FreeSurface( background );
        SDL_FreeSurface( holder );
        SDL_FreeSurface( piece );
        SDL_FreeSurface( up );
        SDL_FreeSurface( down );
        SDL_FreeSurface( left );
        SDL_FreeSurface( right );
        
        //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;
        }
        
        //Generate the new way
        up = apply_surface( 10, 0, piece, screen );
        down = apply_surface( 10, 20, piece, screen );
        left = apply_surface( 0, 10, piece, screen );
        right = apply_surface( 20, 10, piece, screen );
        
        //Apply the background
        apply_surface( 0, 0, background, screen );
        
        //Apply the piece
        apply_surface( 10, 10, piece, screen );
        
        //While the user hasn't quit
        while( quit == false )
        {
            //If there's an event to handle
            if( SDL_PollEvent( &event ) )
            {
                //If a key was pressed
                if( event.type == SDL_KEYDOWN )
                {
                    //Set the proper holder surface
                    switch( event.key.keysym.sym )
                    {
                        case SDLK_UP: holder = up; break;
                        case SDLK_DOWN: holder = down; break;
                        case SDLK_LEFT: holder = left; break;
                        case SDLK_RIGHT: holder = right; break;    
                    }
                }
                
                //If the user has Xed out the window
                else if( event.type == SDL_QUIT )
                {
                    //Quit the program
                    quit = true;
                }
            }
            
            //If a holder needs to be displayed
            if( holder != NULL )
            {
                //Apply the background to the screen
                apply_surface( 0, 0, background, screen );
                
                //Null the surface pointer
                holder = NULL;
            }
        
            //Update the screen
            if( SDL_Flip( screen ) == -1 )
            {
                return 1;    
            }
        }
            
        //Clean up
        clean_up();
        
        return 0;    
    }
    Help please!

  5. #5
    Registered User
    Join Date
    Apr 2007
    Location
    Sweden
    Posts
    41
    I immediately saw that apply_surface() doesn't give any proper return value. Start there.

  6. #6
    Registered User
    Join Date
    Jan 2007
    Posts
    188
    I don't know what you mean? Why should it return something?

  7. #7
    Registered User
    Join Date
    Apr 2007
    Location
    Sweden
    Posts
    41
    Because you now declare a return type, namely SDL_Surface*. The fact that you don't have a return statements make assignments such as this undefined:
    Code:
    up = apply_surface( 10, 0, piece, screen );
    And undefined behaviour is bad.

    Just because something compiles doesn't mean it's properly done. Even less so in C and C++ than in other languages.
    Last edited by Oysterman; 05-03-2007 at 09:59 AM.

  8. #8
    Registered User
    Join Date
    Jan 2007
    Posts
    188
    Ok, i added "return 0;" to apply_surface() but it still doesn't work. The piece stays at it's position. Why?

  9. #9
    Registered User
    Join Date
    Jan 2007
    Posts
    188
    Now i almost got it. It's just that the piece stays at the postion AND makes a new one. So i added SDL_FreeSurface( piece ); but now the program shuts down when i touch a button. Why?

    Code:
    //The headers
    #include "SDL/SDL.h"
    #include <string>
    
    //Screen attributes
    const int SCREEN_WIDTH = 640;
    const int SCREEN_HEIGHT = 480;
    const int SCREEN_BPP = 32;
    
    //The surfaces
    SDL_Surface *background = NULL;
    SDL_Surface *screen = NULL;
    SDL_Surface *piece = NULL;
    
    //The event structure
    SDL_Event event;
    
    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 = SDL_LoadBMP( 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 );
        }
        
        //Return the optimized surface
        return optimizedImage;
    }
    
    SDL_Surface *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 );
        
        return 0;
    }
    
    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 in error in setting up the screen
        if( screen == NULL )
        {
            return false;    
        }
        
        //Set the window caption
        SDL_WM_SetCaption( "Walk-around-game", NULL );
        
        //If everything initialized fine
        return true;
    }
    
    bool load_files()
    {
        //Load the background image
        background = load_image( "bg.bmp" );
        piece = load_image( "piece.bmp" );
        
        //If there was a problem in loading the background
        if( background == NULL )
        {
            return false;    
        }
        
        //If there was a problem in loading the background
        if( piece == NULL )
        {
            return false;    
        }
        
        //If everything loaded fine
        return true;
    }
    
    void clean_up()
    {
        //Free the surfaces
        SDL_FreeSurface( background );
        SDL_FreeSurface( piece );
        
        //Quit SDL
        SDL_Quit();
    }
    
    int main( int argc, char* args[] )
    {
        int x = 50;
        int y = 50;
        //Quit flag
        bool quit = false;
        
        //Initialize
        if( init() == false )
        {
            return 1;
        }
        
        //Load the files
        if( load_files() == false )
        {
            return 1;
        }
        
        //Apply the piece
        apply_surface( x, y, piece, screen );
        
        //Apply the background
        apply_surface( 0, 0, background, screen );
        
        //While the user hasn't quit
        while( quit == false )
        {
            //If there's an event to handle
            if( SDL_PollEvent( &event ) )
            {
                //If a key was pressed
                if( event.type == SDL_KEYDOWN )
                {
                    //Set the proper holder surface
                    switch( event.key.keysym.sym )
                    {
                        case SDLK_UP: x = x - 10; SDL_FreeSurface( piece ); apply_surface( y, x, piece, screen ); break;
                        case SDLK_DOWN: x = x + 10; SDL_FreeSurface( piece ); apply_surface( y, x, piece, screen ); break;
                        case SDLK_LEFT: y = y - 10; SDL_FreeSurface( piece ); apply_surface( y, x, piece, screen ); break;
                        case SDLK_RIGHT: y = y + 10; SDL_FreeSurface( piece ); apply_surface( y, x, piece, screen ); break;    
                    }
                }
                
                //If the user has Xed out the window
                else if( event.type == SDL_QUIT )
                {
                    //Quit the program
                    quit = true;
                }
            }
        
            //Update the screen
            if( SDL_Flip( screen ) == -1 )
            {
                return 1;    
            }
        }
            
        //Clean up
        clean_up();
        
        return 0;    
    }

  10. #10
    Registered User
    Join Date
    Jan 2007
    Posts
    188
    Hmm... Anyone?

  11. #11
    Registered User
    Join Date
    Jan 2007
    Posts
    188
    Weird... Anyone?

  12. #12
    Frequently Quite Prolix dwks's Avatar
    Join Date
    Apr 2005
    Location
    Canada
    Posts
    8,057
    You call SDL_FreeSurface once, once you're done with it. You can't do anything with the surface after it has been freed with this function. You can't free it again and you certainly can't access it again (both of which could happen if you press a key).

    If you get rid of the SDL_FreeSurface calls in your switch statement, it will be closer to working.

    BTW, the term for that kind of crash is a "segmentation fault" or a "seg fault".
    dwk

    Seek and ye shall find. quaere et invenies.

    "Simplicity does not precede complexity, but follows it." -- Alan Perlis
    "Testing can only prove the presence of bugs, not their absence." -- Edsger Dijkstra
    "The only real mistake is the one from which we learn nothing." -- John Powell


    Other boards: DaniWeb, TPS
    Unofficial Wiki FAQ: cpwiki.sf.net

    My website: http://dwks.theprogrammingsite.com/
    Projects: codeform, xuni, atlantis, nort, etc.

  13. #13
    Registered User
    Join Date
    Jan 2007
    Posts
    188
    Yeah, i know that. But it doesn't remove the old pic. How can i remove the old pic? OR even better, change the pic's position.

  14. #14
    Registered User
    Join Date
    Jan 2007
    Posts
    188
    Helpneeded.please.com pleeeeeease
    Last edited by Livijn; 05-05-2007 at 12:12 PM.

  15. #15
    Malum in se abachler's Avatar
    Join Date
    Apr 2007
    Posts
    3,195

    Red face

    1. You need to read a book on beginner graphics
    2. You need to 'blank' the sprite or start with a fresh background each frame

Popular pages Recent additions subscribe to a feed

Similar Threads

  1. Simulate Keys with a Keyboard Hook
    By guitarist809 in forum Windows Programming
    Replies: 3
    Last Post: 11-14-2008, 08:14 PM
  2. Problems compiling this SDL app
    By Rider in forum C++ Programming
    Replies: 3
    Last Post: 03-27-2007, 12:22 PM
  3. SDL and MinGW Studio
    By Vicious in forum Tech Board
    Replies: 0
    Last Post: 07-30-2004, 09:59 PM
  4. SDL and Windows
    By nickname_changed in forum Windows Programming
    Replies: 14
    Last Post: 10-24-2003, 12:19 AM
  5. sdl in c++
    By Klinerr1 in forum C++ Programming
    Replies: 8
    Last Post: 07-07-2002, 07:46 AM