Home > Ryan C. Gordon icculus.org Game Development with SDL 2.0

Ryan C. Gordon icculus.org Game Development with SDL 2.0

Page 1
Ryan C. Gordon
icculus.org Game Development with SDL 2.0

Page 2
A few notes��
• Feel free to interrupt! • Slides are at https://icculus.org/SteamDevDays/ • Today is a high-level overview. • Feel free to tweet at @icculus

Page 3
Who am I?
• Hacker, game developer, porter • Port games, build tools • Freelance • 15 years experience

Page 4

Page 5

Page 6
What is SDL?
• Simple Directmedia Layer • Open source answer to DirectX. • Cross-platform, powerful, fast, easy. • 15 years of development. • Many games, millions of gamers. • https://www.libsdl.org/

Page 7
History
• Started by Sam Lantinga for Executor. • Used by Loki Software for Linux titles. • Now a de facto standard. • SDL 2.0 is the new hotness.

Page 8
Features
• Modern OSes and devices • Portable game framework • Multiple API targets • Makes hard things easy • Written in C • zlib licensed

Page 9
Simple DirectMedia Layer Copyright (C) 1997-2014 Sam Lantinga <slouken@libsdl.org> This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages arising from the use of this software. Permission is granted to anyone to use this software for any purpose, including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions: 1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. 2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. 3. This notice may not be removed or altered from any source distribution.

Page 10
Platforms
• Linux • Mac OS X • Windows • Unix • Android • iOS • Haiku • Raspberry Pi • Other interesting places
64-bit clean, endian clean

Page 11
Subsystems


• Events • Rendering • Joystick • Game Controllers • Haptic • Shared Libraries • CPU Info • Stdlib • Timers • Threads • RWops
Filesystems

Page 12
Pick Your Target
• Runtime choice with dlopen() • X11, Wayland, Mir�� • ALSA, PulseAudio, OSS, esd, arts, nas�� • winmm, DirectSound, XAudio2��

Page 13
Dirt-simple Direct3D example

Page 14

MSG uMsg; memset(&uMsg,0,sizeof(uMsg)); winClass.lpszClassName = "MY_WINDOWS_CLASS"; winClass.cbSize = sizeof(WNDCLASSEX); winClass.style = CS_HREDRAW | CS_VREDRAW; winClass.lpfnWndProc = WindowProc; winClass.hInstance = hInstance; winClass.hIcon = LoadIcon(hInstance, (LPCTSTR)IDI_DIRECTX_ICON); winClass.hIconSm = LoadIcon(hInstance, (LPCTSTR)IDI_DIRECTX_ICON); winClass.hCursor = LoadCursor(NULL, IDC_ARROW); winClass.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH); winClass.lpszMenuName = NULL; winClass.cbClsExtra = 0; winClass.cbWndExtra = 0; if( RegisterClassEx(&winClass) == 0 ) return E_FAIL; g_hWnd = CreateWindowEx( NULL, "MY_WINDOWS_CLASS", "Direct3D (DX9) - Full Screen", WS_POPUP | WS_SYSMENU | WS_VISIBLE, 0, 0, 640, 480, NULL, NULL, hInstance, NULL ); if( g_hWnd == NULL ) return E_FAIL; ShowWindow( g_hWnd, nCmdShow ); UpdateWindow( g_hWnd );

Page 15

if( g_pD3D == NULL ) { // TO DO: Respond to failure of Direct3DCreate8 return; } // // For the default adapter, examine all of its display modes to see if any // of them can give us the hardware support we desire. // int nMode = 0; D3DDISPLAYMODE d3ddm; bool bDesiredAdapterModeFound = false; int nMaxAdapterModes = g_pD3D->GetAdapterModeCount( D3DADAPTER_DEFAULT, D3DFMT_X8R8G8B8 ); for( nMode = 0; nMode < nMaxAdapterModes; ++nMode ) { if( FAILED( g_pD3D->EnumAdapterModes( D3DADAPTER_DEFAULT, D3DFMT_X8R8G8B8, nMode, &d3ddm ) ) ) { // TO DO: Respond to failure of EnumAdapterModes return; } // Does this adapter mode support a mode of 640 x 480? if( d3ddm.Width != 640 || d3ddm.Height != 480 ) continue; // Does this adapter mode support a 32-bit RGB pixel format? if( d3ddm.Format != D3DFMT_X8R8G8B8 ) continue; // Does this adapter mode support a refresh rate of 75 MHz? if( d3ddm.RefreshRate != 75 ) continue; // We found a match! bDesiredAdapterModeFound = true; break; } if( bDesiredAdapterModeFound == false ) { // TO DO: Handle lack of support for desired adapter mode... return; }

Page 16
// Can we get a 32-bit back buffer? if( FAILED( g_pD3D->CheckDeviceType( D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, D3DFMT_X8R8G8B8, D3DFMT_X8R8G8B8, FALSE ) ) ) { // TO DO: Handle lack of support for a 32-bit back buffer... return; } // Can we get a z-buffer that's at least 16 bits? if( FAILED( g_pD3D->CheckDeviceFormat( D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, D3DFMT_X8R8G8B8, D3DUSAGE_DEPTHSTENCIL, D3DRTYPE_SURFACE, D3DFMT_D16 ) ) ) { // TO DO: Handle lack of support for a 16-bit z-buffer... return; } // // Do we support hardware vertex processing? if so, use it. // If not, downgrade to software. // D3DCAPS9 d3dCaps; if( FAILED( g_pD3D->GetDeviceCaps( D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, &d3dCaps ) ) ) { // TO DO: Respond to failure of GetDeviceCaps return; } DWORD flags = 0; if( d3dCaps.VertexProcessingCaps != 0 ) flags = D3DCREATE_HARDWARE_VERTEXPROCESSING; else flags = D3DCREATE_SOFTWARE_VERTEXPROCESSING;

Page 17
// // Everything checks out - create a simple, full-screen device. // D3DPRESENT_PARAMETERS d3dpp; memset(&d3dpp, 0, sizeof(d3dpp)); d3dpp.Windowed = FALSE; d3dpp.EnableAutoDepthStencil = TRUE; d3dpp.AutoDepthStencilFormat = D3DFMT_D16; d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD; d3dpp.BackBufferWidth = 640; d3dpp.BackBufferHeight = 480; d3dpp.BackBufferFormat = D3DFMT_X8R8G8B8; d3dpp.PresentationInterval = D3DPRESENT_INTERVAL_IMMEDIATE; if( FAILED( g_pD3D->CreateDevice( D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, g_hWnd, flags, &d3dpp, &g_pd3dDevice ) ) ) { // TO DO: Respond to failure of CreateDevice return; }

Page 18
// TO DO: Respond to failure of Direct3DCreate8

Page 19
Really hard SDL version

Page 20
SDL_Init(SDL_INIT_VIDEO); SDL_CreateWindow( ��Hello��, 0, 0, 640, 480, SDL_WINDOW_FULLSCREEN | SDL_WINDOW_OPENGL );

Page 21
Video API
• Multiple windows, multiple displays • Drawing: Software, OpenGL, GLES, Direct3D • Makes OpenGL context management easy • Exposes system GUI events • Message boxes

Page 22
Video API Concepts
• Windows • Surfaces • Textures • OpenGL, etc.

Page 23
Render API
• Simple 2D API • Backed by GPU • Sprites, color ops, blending, primitives, scaling, rotation • Write simple games fast • Make legacy games amazing! • Need more power? Use OpenGL.

Page 24
Dungeons of Dredmor vs SDL2.

Page 25

Page 26

Page 27

Page 28
Disclaimer
Gaslamp Games is not shipping these things, or planning to at the moment. It was Just For Fun.

Page 29
Using OpenGL
SDL_Init(SDL_INIT_VIDEO); SDL_Window *win = SDL_CreateWindow( ��Hello��, 0, 0, 640, 480, SDL_WINDOW_OPENGL); SDL_GL_CreateContext(win); // START MAKING OPENGL CALLS HERE. SDL_GL_SwapWindow(win);

Page 30
Events
• OS Events (mouse, keyboard, window) • Relative mouse mode • Touch API • Gestures • Joysticks and Game Controllers • Timers

Page 31
Event loop
SDL_Event event; while (SDL_PollEvent(&event)) { switch (event.type) { case SDL_MOUSEMOTION: // blah case SDL_KEYDOWN: // blah blah case SDL_QUIT: // bloop bleep } }

Page 32
Joystick API
• Multiple sticks • Polling or events • Query axes, buttons, hats, names • Connect and disconnect notifications

Page 33
Game Controller API
• Everything wants an XBox controller. ( :( ) • Automatic configuration. • Steam Big Picture support • Crowd-sourced configurations • Less flexible, but Just Works really well.

Page 34
Haptic API
• ��Haptic�� == ��Force feedback�� • Supports controllers and mice! • Complex effects, simple rumble, left/right • Fire and forget

Page 35
Audio API
• VERY low-level. Maybe too low-level. • Multiple devices, connect/disconnect • Mono, Stereo, Quad, 5.1 • 8/16/32 bit, (un)signed, little/big, int/float • On-the-fly conversion/resampling • You feed us uncompressed PCM data in a callback.

Page 36
Really, it��s low-level.
• Only a relentless stream of PCM. • You mix, you spatialize, you manage. • Try SDL_mixer or OpenAL.

Page 37
Threading API
• SDL_CreateThread() • Mutexes • Semaphores • Conditions • Atomics

Page 38
Other APIs


• Message Boxes • Clipboard • syswm • CPU Info • Stdlib • Timers • RWops • Filesystems • Power
Asserts

Page 39
The (Near) Future
• Multiple mice • Audio capture, video capture • 7.1 audio • Wayland, Mir, libdrc • WinRT and Windows Store apps • sdl12_compat • The Dynamic API • Your requests here!

Page 40
Getting involved
• Mailing lists! https://lists.libsdl.org/ • Forums! https://forums.libsdl.org/ • Wiki! https://wiki.libsdl.org/ • Bugs! https://bugzilla.libsdl.org/ • Buildbot! https://buildbot.libsdl.org/ • Everything else! https://www.libsdl.org/

Page 41
That��s all folks.
• Questions? Answers! • Hire me. • https://icculus.org/SteamDevDays/ • Ryan C. Gordon: icculus@icculus.org • https://twitter.com/icculus • http://gplus.to/icculus

Set Home | Add to Favorites

All Rights Reserved Powered by Free Document Search and Download

Copyright © 2011
This site does not host pdf,doc,ppt,xls,rtf,txt files all document are the property of their respective owners. complaint#nuokui.com
TOP