SDL:Tutorials:2D Graphics
From GDWiki
- This article is a stub. You can help out by expanding it.
-- 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 argc, char *argv[]) { 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 :)

