2. Who Am I ?
● Eric Basile
– Engineer at Hitpoint Studios.
● Worked On Win8 & iOS titles
– Graduated From Champlain College in Burlington VT
● Game Programming BS
– SDL has been my side project for the last year.
– Website
● Portfolio : EricBasile.com
● Blog : FaceKeyboard.com
– Contact
● Email : eric@ericbasile.com
● Twitter : @Samurai336
3. What Is SDL ?
● SDL stands for Simple Directmedia Layer
– Multimedia library that provides access to :
● Graphics, Sound, and Input devices.
– Cross Platform
● Set up to be a layer for interfacing with platform &
operating-system-specific functions.
– Written in C
● Supported Platforms include :
– Windows, Linux, OSX, Android, iOS
– Open Source
● SDL2 uses zlib license
4. History of SDL
● Created by Sam Lantinga at Loki Games 1998
– Used to port Doom to BeOS
– SMPEG and OpenAL developed to work along side.
● SDL 1.3 Announced in 2008 (This would become
2.0)
– Would use zlib license
● 1.2 and older use GNU LGPL
● SDL 2.0 officially announced July 14 2012
– Sam also announces he is joining valve software
5. Whats new in 2
● SDL v2.0.0 stable Released in August 11 2013
– Not backwards compatible with SDL 1.2
● Most repos only have 1.2 right now
– SDL2 Hardware accelerated
● 2D rendering using Direct3D, OpenGL or OpenGL ES
or software rendering in background.
– Official Android and iOS support
– Support for multiple windows
– Much Much more.
● Over view at: http://wiki.libsdl.org/MigrationGuide
8. Talk About Build Systems
● Cmake great for cross platform build systems
– Allows people to more or less use development
environment of choice.
– Cross Platform (Duh!)
– Fairly straightforward scripting.
10. Using Cmake
● Create Directory for your Project Build
– Avoid creating folder in Source Directory
● Run cmake
– Run cmake with path to directory containing
CmakeLists.txt
– $ cmake Path/to/folder/With/Cmake/List/
13. Initializing SDL
● SDL_Init(uint32 flags) ;
– We can pick and choose what parts of SDL we want to
use (IE just Audio or just input).
● Available flags
– SDL_INIT_TIMER, SDL_INIT_AUDIO, SDL_INIT_VIDEO,
SDL_INIT_JOYSTICK, SDL_INIT_HAPTIC,
SDL_INIT_GAMECONTROLLER, SDL_INIT_EVENTS,
SDL_INIT_EVERYTHING.
● Use or for multiple flags (SDL_INIT_TIMER|SDL_INIT_AUDIO)
● We will use SDL_INIT_EVERYTHING.
– Check things Started ok.
if(SDL_Init(SDL_INIT_EVERYTHING) < 0)
{
printf("failed to initin");
}
14. Create a window
● SDL_Window * MainWindow ;
– Pointer to what will be our main window
● SDL_Window* SDL_CreateWindow(const char* title, int x,int y,int
w,int h,Uint32 flags)
– Will give us a pointer to a created window at with specified
width, height, positon and title.
– Flags for windows include: SDL_WINDOW_FULLSCREEN,
SDL_WINDOW_BORDERLESS, SDL_WINDOW_RESIZABLE
and more.
MainWindow = SDL_CreateWindow("SDL2_PONG",
SDL_WINDOWPOS_CENTERED,
SDL_WINDOWPOS_CENTERED,
800, 600,
SDL_WINDOW_RESIZABLE );
15. Create Render Context
● SDL_Renderer* Renderer ;
– Pointer to our Renderer
● SDL_Renderer* SDL_CreateRenderer(SDL_Window*
window, int index, Uint32 flags);
– Creates a 2D rendering context for a windows
● Pointer to the window
● the index of the rendering driver to initialize (-1 to
initialize the first one supporting the requested
flags)
● Enumerated flags to specify rendering context.
– Example : SDL_RENDERER_ACCELERATED
for hardware accelerated
SDL_CreateRenderer(MainWindow , -1, SDL_RENDERER_ACCELERATED );
16. Extensions
● SDL Has Several Extensions Libraries
– Used to Abstract lower level but common SDL
functionality (Ex : Loading Compressed Image
formats)
– Extension Libraries Available: SDL_image,
SDL_mixer,SDL_net, SDL_rtf, SDL_ttf.
– We will be Covering: SDL_image & SDL_mixer.
17. Starting Extensions
● Initializing Extensions
– Image
● IMG_Init(int flags)
– What format libs to load for Decoding Ex : IMG_INIT_JPG for jpg
● We will be using png
– Mixer
● Mix_OpenAudio(int frequency, Uint16 format, int channels, int
chunksize);
– We will use 44100 for frequency
– MIX_DEFAULT_FORMAT for our format
– 2 channels
– Chunk size of 4096
● More or less whats Default in the Documentation :P
Mix_OpenAudio(44100, MIX_DEFAULT_FORMAT, 2, 4096)
IMG_Init(IMG_INIT_PNG);
19. SDL_Event
● SDL_Event Handling
– Popular for abstracting input and other system
messages across OS's and platforms
● Can Be used independently
– SDL_Init(SDL_INIT_EVENTS);
● Used for :
– SDL_KeyboardEvent SDL_MouseButtonEvent
SDL_MouseMotionEvent SDL_WindowEvent
SDL_TouchFingerEvent and more...
20. Getting Events
● Use SDL_PollEvent(SDL_Event* event) to get
currently pending event.
– Works nicely with while loops in the main loop.
while (SDL_PollEvent(&event)) {
// handle your event here
}
21. Check Event Type
● Get event type
– Event->type
● Will tell you what this event is.
– Ex: SDL_CommonEvent,SDL_QuitEvent,
SDL_MouseButtonEvent, SDL_TouchEvent
● Works great in a Switch Statement
switch(test_event->type) {
case SDL_MOUSEMOTION:
printf("We got a motion event.n");
printf("Current mouse position is: (%d, %d)n",
test_event.motion.x, test_event.motion.y);
break;
default:
printf("Unhandled Event!n");
break;
}
}
22. Handling Event
● Use data from event Based on type
– Event->key.keysym.sym == SDLK_DOWN
● Handles down arrow.
– Keysym A structure that contains key information and sym is an
SDL virtual key code.
if(sym == SDLK_DOWN)
{
Player2.SetY(Player2.GetY() + 25);
}
else if(sym == SDLK_UP)
{
Player2.SetY(Player2.GetY() - 25);
}
25. Loading an Image as a texture
● SDL_texture*
– Is a structure that contains an efficient, driver-specific
representation of pixel data.
● Using SDL_image
– SDL_Texture* IMG_LoadTexture(SDL_Renderer
*renderer, const char *file)
● Pointer to the render context where we will display our image.
● Path to our file.
● 1.2 used SDL_Surface*
OurTexture = IMG_LoadTexture(Renderer, "./ImageFile.png");
26. Drawing Images With
SDL_Renderer
● Will copy a portion of the texture to the
current rendering target
SDL_RenderCopyEx(Renderer, OurTexture, NULL, &DestR, 0.0, NULL,
SDL_FLIP_NONE);
DestR = {128,128,128,128}
27. Sprite Sheet Animated Image
Drawing
● Two SDL Rects
● SDL_Rects are just struct's with int's for X, Y Width and
Height.
– One for where on the sprite sheet and one for
where to display in the windows render context.
Here's our source rect parameter
would be {128,128,128,128}
SDL_RenderCopyEx(Renderer, OurTexture, &SrcR, &DestR, 0.0, NULL,
SDL_FLIP_NONE);
29. Drawing to The Screen
● SDL_RenderPresent(SDL_Renderer*
renderer)
– update the screen with rendering performed.
● SDL_RenderClear(SDL_Renderer* renderer)
– clear the current rendering target with the drawing
color.
● These Need to be done every frame to see
what we have drawn on screen.
SDL_RenderPresent(Renderer);
SDL_RenderClear(Renderer);
30. Drawing Simple shapes
● SDL_SetRenderDrawColor(SDL_Renderer*
renderer,Uint8 r,Uint8 g,Uint8 b,Uint8 a)
– Set our renderer's rgb draw color.
● SDL_RenderFillRect(SDL_Renderer* renderer,const
SDL_Rect* rect)
– Draws a rect in the passed render context
● Also Available in SDL are :
– SDL_RenderDrawLine, SDL_RenderDrawLines,
SDL_RenderDrawPoint, SDL_RenderDrawPoints,
SDL_RenderDrawRect, SDL_RenderDrawRects.
SDL_RenderFillRect(Renderer, &DestR);
32. Loading A sound File
● Using SDL_mixer
– Mix_Chunk* SoundFile;
● Pointer to Audio Data in memory
– Mix_Chunk *Mix_LoadWAV(const char *fname);
● Will load fname file into memory and return a pointer to
it.
Mix_Chunk* SoundFile = Mix_LoadWAV("./SoundFIle.wav") ;
33. Playing Sounds
● Mix_PlayChannel (int channel, Mix_Chunk
*chunk, int loops);
– Channel we want to play on
● -1 to let SDL choose it for you
– Pointer to our sound file
– How many times to loop
● 0 for once and -1 for infinite.
Mix_PlayChannel(-1, SoundFile, 0);
34. Clean up
● Its Important to Clean all the assets you have
loaded into memory.
● Assets
– images
● SDL_DestroyTexture(OurTexture);
– Sounds
● Mix_FreeChunk(SoundFile) ;
36. SDL2 Demo using Everything
Discussed.
Get It NOW !!
$ git clone https://github.com/Samurai336/SDL2_PONG.git
37. Reasons to use SDL beyond 2D
games.
● Able to pick and choose parts of SDL to use
– Input handler, Audio handler.. etc
● Used for 3D games
– Great for creating OpenGL OpenGLes 1.0 & 2.0 and
DirectX render contexts
– Now you have a way to handle cross platform input
● Works on just about anything
– Open source can compile it anywhere and add support
yourself
– Works on Windows, Linux, Mac OS X, iOS, Android
– Sorta works on PSP and Raspberry Pi
38. Resources
● Official website
– http://www.libsdl.org/
– Documentation → http://wiki.libsdl.org/
● SDL 1.2 tutorials and information
– http://lazyfoo.net/SDL_tutorials/index.php
– http://www.sdltutorials.com/
● History
– http://en.wikipedia.org/wiki/Simple_DirectMedia_Layer
● Game and company logos from
– http://store.steampowered.com/