SDL:Tutorials:2D Graphics

From GDWiki

Jump to: navigation, search
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 :)
Personal tools