-
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!
-
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
-
Moved to game programming forum.
SDL is for game programming therefore this belongs on the game programming forum.
-
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! :)
-
I immediately saw that apply_surface() doesn't give any proper return value. Start there.
-
I don't know what you mean? Why should it return something? :)
-
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.
-
Ok, i added "return 0;" to apply_surface() but it still doesn't work. The piece stays at it's position. Why? :o
-
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? :o
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;
}
-
-
Weird... Anyone? :rolleyes:
-
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".
-
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.
-
Helpneeded.please.com :) pleeeeeease :D
-
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