SDL:Tutorials:2D Graphics
From GPWiki
The wiki is now hosted by GameDev.NET at wiki.gamedev.net. All gpwiki.org content has been moved to the new server. However, the GPWiki forums are still active! Come say hello. -- Work In Progress -- #include <cstdlib> // For some useful functions such as atexit :) #include "SDL.h" // main SDL header #define SCREEN_WIDTH 640 #define SCREEN_HEIGHT 480 #define true 1 #define false 0 //You might have to declare True and False. #define COLORKEY 255, 0, 255 //Your Transparent colour SDL_Surface *screen; //This pointer will reference the backbuffer int InitVideo(Uint32 flags = SDL_DOUBLEBUF | SDL_FULLSCREEN) { // Load SDL if (SDL_Init(SDL_INIT_VIDEO) != 0) { fprintf(stderr, "Unable to initialize SDL: %s\n", SDL_GetError()); return false; } atexit(SDL_Quit); // Clean it up nicely :) // fullscreen can be toggled at run time :) any you might want to change the flags with params? //set the main screen to SCREEN_WIDTHxSCREEN_HEIGHT with a colour depth of 16: screen = SDL_SetVideoMode(SCREEN_WIDTH, SCREEN_HEIGHT, 16, flags); if (!screen) { fprintf(stderr, "Unable to set video mode: %s\n", SDL_GetError()); return false; } return true; } Loading an Image: (Bitmap) SDL_Surface* LoadImage(char *file, int exitstate) { SDL_Surface *tmp; tmp = SDL_LoadBMP(file); if (!tmp) { fprintf(stderr, "Error: '%s' could not be opened: %s\n", file, SDL_GetError()); exitstate = false; return NULL; } else { if(SDL_SetColorKey(tmp, SDL_SRCCOLORKEY | SDL_RLEACCEL, SDL_MapRGB(tmp->format, COLORKEY)) == -1) fprintf(stderr, "Warning: colorkey will not be used, reason: %s\n", SDL_GetError()); } exitstate = true; return tmp; } Loading an Image: (bmp,pnm,xpm,xcf,pcx,gif,jpg,tif,png,tga,lbm) in order to use these images in your program you must include the SDL_image library. NB: This library converts the images into a SDL_Surface layer, where as the bitmap one above just copies the data across to a SDL_Surface. It is also NOT advised putting a LoadImage into a eventloop, and to precache your images you're going to use. #include "SDL_image.h"
SDL_Surface* LoadImage(char *file, int exitstate) { SDL_Surface *tmp; tmp = IMG_Load(file); if (!tmp) { fprintf(stderr, "Error: '%s' could not be opened: %s\n", file, IMG_GetError()); exitstate = false; return NULL; } else { if(SDL_SetColorKey(tmp, SDL_SRCCOLORKEY | SDL_RLEACCEL, SDL_MapRGB(tmp->format, COLORKEY)) == -1) fprintf(stderr, "Warning: colorkey will not be used, reason: %s\n", SDL_GetError()); } exitstate = true; return tmp; } Drawing An Image: void DrawImage(SDL_Surface *srcimg, int sx, int sy, int sw, int sh, SDL_Surface *dstimg, int dx, int dy, int alpha = 255) { if ((!srcimg) || (alpha == 0)) return; //If theres no image, or its 100% transparent. SDL_Rect src, dst; src.x = sx; src.y = sy; src.w = sw; src.h = sh; dst.x = dx; dst.y = dy; dst.w = src.w; dst.h = src.h; //if (alpha != 255) SDL_SetAlpha(srcimg, SDL_SRCALPHA, alpha); // - This is incorrect, if alpha is 10, then set to 255, the image alpha will still be 10. SDL_SetAlpha(srcimg, SDL_SRCALPHA, alpha); SDL_BlitSurface(srcimg, &src, dstimg, &dst); } Clean Up Your Image: ... SDL_FreeSurface(img_name); ... It's that simple! Want it easier? Well, you can just copy everything below into a file: // SDL_Functions: Copied from gpwiki.org. #include <cstdlib> // For some useful functions such as atexit :) #include "SDL.h" // main SDL header #include "SDL_image.h" // image library, if your only using BMP's, get ride of this. #define SCREEN_WIDTH 640 #define SCREEN_HEIGHT 480 #define true 1 #define false 0 //You might have to declaire True and False. #define COLORKEY 255, 0, 255 //Your Transparent colour SDL_Surface *screen; //This pointer will reference the backbuffer //I have set the flag SDL_SWSURFACE for a window :) int InitVideo(Uint32 flags = SDL_DOUBLEBUF | SDL_SWSURFACE) { // Load SDL if (SDL_Init(SDL_INIT_VIDEO) != 0) { fprintf(stderr, "Unable to initialize SDL: %s\n", SDL_GetError()); return false; } atexit(SDL_Quit); // Clean it up nicely :) // fullscreen can be toggled at run time :) any you might want to change the flags with params? //set the main screen to SCREEN_WIDTHxSCREEN_HEIGHT with a colour depth of 16: screen = SDL_SetVideoMode(SCREEN_WIDTH, SCREEN_HEIGHT, 16, flags); if (screen == NULL) { fprintf(stderr, "Unable to set video mode: %s\n", SDL_GetError()); return false; } return true; } //--------------------------- Drawing Stuff ------------------------- SDL_Surface* LoadImage(char *file, int &exitstate) { SDL_Surface *tmp; tmp = IMG_Load(file); exitstate = false; if (tmp == NULL) { fprintf(stderr, "Error: '%s' could not be opened: %s\n", file, IMG_GetError()); } else { if(SDL_SetColorKey(tmp, SDL_SRCCOLORKEY | SDL_RLEACCEL, SDL_MapRGB(tmp->format, COLORKEY)) == -1) fprintf(stderr, "Warning: colorkey will not be used, reason: %s\n", SDL_GetError()); exitstate = true; } return tmp; } void DrawImage(SDL_Surface *srcimg, int sx, int sy, int sw, int sh, SDL_Surface *dstimg, int dx, int dy, int alpha = 255) { if ((srcimg == NULL) || (alpha == 0)) return; //If theres no image, or its 100% transparent. SDL_Rect src, dst; src.x = sx; src.y = sy; src.w = sw; src.h = sh; dst.x = dx; dst.y = dy; dst.w = src.w; dst.h = src.h; if (alpha != 255) SDL_SetAlpha(srcimg, SDL_SRCALPHA, alpha); SDL_BlitSurface(srcimg, &src, dstimg, &dst); } //------------------------ The Game ----------------------- int main() { int res = 0; //Results if (InitVideo() == false) return 1; SDL_Surface *tux = LoadImage("tux.bmp",res); if (res == false) return 1; DrawImage(tux, 0,0, tux->w, tux->h, screen, 10, 10, 128); SDL_Flip(screen); //Refresh the screen SDL_Delay(2500); //Wait a bit :) //cleanup SDL_FreeSurface(tux); return 0; } //Remember the blank line at the end! gcc always bugs me about it :) |


