sdl

advertisement
MAEK GAEM III: SDL
●
Simple DirectMedia Layer
●
Input/Graphics/Audio using OpenGL
●
Not nearly as difficult as OpenGL
●
Cross Platform and Open Sauce
●
Bindings for over 20 languages
Download/Setup
●
●
●
http://www.libsdl.org/download-1.2.php
How to get it all set up will depend on your
IDE.
Once you build your game, you (usually) just
need to package it with SDL.dll
Get it Up
●
●
●
We have to do some initialization before we can
do anything serious
SDL_Init( SDL_INIT_VIDEO );
That was easy
You can initialize a number of subsystems with
this method (video, audio, timer, etc.)
Screen Initialization
●
●
●
●
●
●
Nearly every video-oriented method using SDL
requires passing in a pointer to a surface object.
SDL_Surface* screen = SDL_SetVideoMode(
WINDOW_WIDTH, WINDOW_HEIGHT, 0, SDL_HWSURFACE
| SDL_DOUBLEBUF );
But what does that mean?
Firstly, the screen resolution's width and height
Then the bits per pixel. Cool! 0 is the current
default for the user's computer
All the extra flags go last. You can look 'em up
Drawing Boring Rectangles
●
●
●
●
●
You can fill simple rectangles with color
SDL_FillRect(SDL_Surface *dst, SDL_Rect
*dstrect, Uint32 color)
First arg: Your surface from earlier
Second Arg: The Rectangle you where you want to
color the screen. NULL will fill the entire screen in
Third Arg: Use SDL_MapRGB (or SDL_MapRGBA if
you want to do alpha blending). I'll go into detail in a sec.
SDL_MapRGB
●
●
●
Uint32 SDL_MapRGB(SDL_PixelFormat *fmt, Uint8
r, Uint8 g, Uint8 b);
Last three arguments are pretty obvious. Just
enter the Red Green and Blue values (from 0 to
255) to get the color you want.
What's this PixelFormat shit?
It's an attribute of your screen object. Just pass
in a screen->format and you'll be good to
go.
Rectangle Elaboration
●
There's not too much to talk about. You need
rectangles for drawing to the screen, but you can use
them for whatever you want, be it collisions, keeping
track of player position, whatever.
●
Make one like this: SDL_Rect rectongle;
●
Has an attribute for x & y position, and width & height
●
rectongle.x = 200; rectongle.y = 30;
●
rectongle.w = 20; rectongle.h = 20;
Fuck Colors, I Want Pictures!
●
●
●
●
You can add textures as surface objects, but
load in pictures using SDL_LoadBMP.
LoadBMP just takes a filepath. Pretty easy,
yeah?
Ex: SDL_Surface*
pic = SDL_LoadBMP(“poop.bmp”)
There's a couple things to do now: Set
transparency, and draw it to our surface
Sprite Sheet
●
●
A spritesheet is a collection of pictures in a
single image used in animation to simulate
movement.
When drawing to the screen, you
select a rectangular area on the
sheet you wish to draw
●
You should also select a color for
the background to make transparent
Transparency
●
Here's How: SDL_SetColorKey(SDL_Surface
*surface, Uint32 flag, Uint32 key);
●
As you know by now, pass in the surface pointer
●
Pass in SDL_SRCCOLORKEY to the second arg (const)
●
●
●
That just means that the next argument is going
to be the color we want to be transparent
For the last arg, use MapRGB to pick a
transparent color. Pick something that you aren't
using in the actual image.
Magenta is a common one (RGB 255, 0, 255)
Shit it to the Screen
●
●
●
●
SDL_BlitSurface(SDL_Surface *src, SDL_Rect
*srcrect, SDL_Surface *dst, SDL_Rect
*dstrect);
*src is a pointer to the source surface (your
image) and *dst is the desination surface
(screen object)
*srcrect is the source Rectangle. This is the area
inside the image that you want to draw.
*dstrect is the destination Rectangle. This is
where you want to draw it on the screen
Quick Notes
●
●
If using doublebuffering, make sure to call
SDL_Flip(SDL_Surface* screen) after every time
you draw to the screen. This swaps the video
buffers.
Also call SDL_FreeSurface(SDL_Surface* surface)
to cleanup after use. Do this for every surface
you create
Input
●
SDL sends KEY_DOWN and KEY_UP events, so here's
what we're going to do:
SDL_Event event;
if (SDL_PollEvent(&event)) //poll for a key event
{
if (event.type == SDL_KEYDOWN) //if key is pressed or released, handle it
{
HandleEvent(event);
}
if (event.type == SDL_KEYUP)
{
HandleEvent(event);
}
}
Download