310 likes | 421 Views
SDL Programming. Introduction. Initialization. The first thing you must do is initialize SDL i nt SDL_Init ( SDL_INIT_EVERYTHING ) This will return -1 if it fails Various flags can be OR’ed together to enable various features In this case, we enable all features. Surfaces.
E N D
SDL Programming Introduction
Initialization • The first thing you must do is initialize SDL • intSDL_Init( SDL_INIT_EVERYTHING ) • This will return -1 if it fails • Various flags can be OR’ed together to enable various features • In this case, we enable all features
Surfaces • A surface is an area where you can draw • The screen is one such surface • You can create other surfaces to hold images or to draw on • You can copy one surface to another • Surfaces have properties • Height • Width • Number of bits per pixel
Creating the Screen • After initializing SDL, you create the screen • SDL_Surface *screen; • screen = SDL_SetVideoMode( winWidth, winHeight, screenDepth, SDL_HWSURFACE | SDL_DOUBLEBUF); • The screen depth is usually 32 • If the screen cannot be created, NULL will be returned • When a surface is no longer needed it should be freed • SDL_FreeSurface(surface);
Setting a Window Title • You can set the title in the top of the window • SDL_WM_SetCaption( “Title", NULL ); • The title will be displayed in the window decoration area, usually at the top of the window
SDL Coordinates (100, 0) (0, 0) (0, 100) (100, 100) • The origin of a window is the top-left corner • Y coordinates increase as we go down
Loading Images • SDL can load images in the BMP format • There are extensions which can load other formats • These extensions must be downloaded and installed into your SDL directories • Loaded images are stored on surfaces • Remember, the screen itself is a surface • You can then copy them from one surface to another to make them appear on the screen
Loading Images • To load an image • SDL_Surface *image = SDL_LoadBMP(“file.bmp”); • This will either load the image or return NULL if it cannot be loaded • The trouble is that the image might not have the same format as the screen you want to display it on • You can convert it to the correct format as follows • SDL_Surface *displayImage = SDL_DisplayFormat(image);
Loading Images • These steps are done often enough to warrant creating a function or method for loading an image SDL_Surface* loadImage(const char* fileName) { SDL_Surface *tmp = NULL, *image = NULL; tmp = SDL_LoadBMP(fileName); if(tmp) { image = SDL_DisplayFormat(tmp); SDL_FreeSurface(tmp);} return image; }
Rendering Images • When you load an image • It is stored on a surface • This does not make the image visible • The image must be copied to the screen to be visible • We move an image using bit blitting • Bit block image transfer • This is done with the function SDL_BlitSurface
SDL_BlitSurface • intSDL_BlitSurface(SDL_Surface *src, SDL_Rect *srcrect, SDL_Surface *dst, SDL_Rect *dstrect) • Src – source surface • Srcrect – rectangle delimiting areas to copy or NULL for entire image • Dst – the destination surface • Dstrect – position to place on destination surface. If NULL image will be placed at top-left corner • Returns 0 on success
SDL_Rect • This is a common structure used to indicate the size and position of rectangular areas typedefstruct{ Sint16 x, y; Uint16 w, h; } SDL_Rect;
Event Handling • Many events happen while a program is running • Key presses • Mouse movement • Window resizing • Window closing • Games are interested in these events and need to be able to find out when they occur • This can be done using • SDL_PollEvent(& event)
SDL_Event typedef union{ Uint8 type; SDL_ActiveEvent active; SDL_KeyboardEvent key; SDL_MouseMotionEvent motion; SDL_MouseButtonEvent button; SDL_JoyAxisEventjaxis; SDL_JoyBallEventjball; SDL_JoyHatEventjhat; SDL_JoyButtonEventjbutton; SDL_ResizeEvent resize; SDL_ExposeEvent expose; SDL_QuitEvent quit; SDL_UserEvent user; SDL_SysWMEventsyswm; } SDL_Event; • This is used for all event types • Note that it is a union • The type field indicates which member of the union is to be used
SDL_KeyboardEvent typedefstruct{ Uint8 type; Uint8 state; SDL_keysymkeysym; } SDL_KeyboardEvent;
SDL_keysym typedefstruct{ Uint8 scancode; SDLKey sym; SDLMod mod; Uint16 unicode; } SDL_keysym;
Event Processing Loop while(SDL_PollEvent(&event)){ switch(event.type){ case SDL_KEYDOWN: if(event.key.keysym.sym==SDLK_LEFT) move_left(); break; . . . } } Poll for events and process each of the events
The Game Loop bool quit = false; SDL_Event event; while( quit == false ) { if( SDL_PollEvent( &event ) ) { if( event.type == SDL_QUIT ) { quit = true; } if( SDL_Flip( screen ) == -1 ) { //return 1; } } } This processes eventsand keeps the windowon the screen untilthe X in the top rightof the window is clicked.
Drawing Text • SDL does not support TTF fonts as distributed • You can download the extension from • http://www.libsdl.org/projects/SDL_ttf/ • Get the file • SDL_ttf-devel-2.0.10-VC.zip • Open the zip file and • Copy the file in include to the include directory for your SDL • Copy the files in lib to the lib directory for your SDL • You will need to copy the new DLLs to any project that wants to use text
Preparing to Use Text • Set the text color SDL_ColortextColor; textColor.r = textColor.g = textColor.b = 255; • Initialize the TTF extension if( TTF_Init() == -1 ) { return false; } • Load the font if( NULL == (font = TTF_OpenFont( "lazy.ttf", 28 )) ) { return false; }
Rendering the Text • text is rendered to a newly created surface • You then copy this surface onto the surface where the text should appear textSurface = TTF_RenderText_Solid( font, "A-Maze-ing", textColor ); • This surface is then blitted onto the destination surface
Colors • Colors are specified as • RGB with each value from 0 – 255 • There are two different structures • An unsigned 32 bit int • An SDL_Color structure • SDL_Color has members • r, g, b • To create the 32 bit int unsigned int color = SD_MapRGB(screen->format, 255, 255, 255);
Drawing Lines & Rectangles intSDL_DrawLine(SDL_Surface* dst, int x1, int y1, int x2, int y2, Uint32 color) intSDL_FillRect(SDL_Surface *dst, SDL_Rect *dstrect, Uint32 color) • Both functions return 0 on success