第一章 認識SDL
👉SDL 2.0 Roadmap
從SDL 2.0 Roadmap中可以獲取到SDL2當前的規劃路線以及功能支持情況。
👉Migrating SDL 1.2 extensions
以下的SDL擴展庫已經支持SDL2版本:
- SDL_image:一個圖片文件加載庫,支持BMP、GIF、PNG、TGA、PCX等。(SDL2的庫似乎只支持BMP格式的圖片文件。)
- SDL_net:一個跨平臺的網絡庫。
- SDL_mixer:一個音頻渲染庫,支持MP3、MIDI以及OGG。
- SDL_ttf:一個讓SDL程序支持TrueType字體的庫。
- SDL_rtf:一個RTF字體渲染庫。
另外一些可能不支持 SDL2 的庫集合:鏈接。
👉獲取 SDL2
在官方網頁中可獲取到當前穩定版本,包括源碼、運行二進制文件以及開發庫。
SDL2 源碼編譯請看這裏。
下載開發庫解壓後可看到三個文件夾:docs、include 以及 lib,將其引用到開發項目中就能正常使用。
👉Hello SDL
創建一個空項目,配置好 SDL2 的頭文件和庫的引用,接着創建一個 main.cpp 文件,將以下代碼複製到 main.cpp 文件中,編譯運行。
#include<SDL.h>
SDL_Window* g_pWindow = 0;
SDL_Renderer* g_pRenderer = 0;
int main(int argc, char* args[])
{
// initialize SDL
if(SDL_Init(SDL_INIT_EVERYTHING) >= 0)
{
// if succeeded create our window
g_pWindow = SDL_CreateWindow("Chapter 1: Setting up SDL",
SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, 640, 480,
SDL_WINDOW_SHOWN);
// if the window creation succeeded create our renderer
if(g_pWindow != 0)
{
g_pRenderer = SDL_CreateRenderer(g_pWindow, -1, 0);
}
}
else
{
return 1; // sdl could not initialize
}
// everything succeeded lets draw the window
// set to black // This function expects Red, Green, Blue and
// Alpha as color values
SDL_SetRenderDrawColor(g_pRenderer, 0, 0, 0, 255);
// clear the window to black
SDL_RenderClear(g_pRenderer);
// show the window
SDL_RenderPresent(g_pRenderer);
// set a delay before quitting
SDL_Delay(5000);
// clean up SDL
SDL_Quit();
return 0;
}
解剖 Hello SDL
1.首先,包含頭文件:#include<SDL.h>
2.第二步,創建一些全局變量:一個是 SDL_Window 變量,另一個是 SDL_Renderer 變量。前者是SDL2窗口對象,後者是SDL2渲染器對象。
SDL_Window* g_pWindow = 0;
SDL_Renderer* g_pRenderer = 0;
3.現在,可以初始化SDL2庫:SDL_Init(SDL_INIT_EVERYTHING)
。參數 SDL_INIT_EVERYTHING 是代表初始化全部子系統,當然,可以選擇用到的那些子系統進行初始化。
4.接下來,就是創建SDL2的窗口,使用 SDL_CreateWindow 函數。
g_pWindow = SDL_CreateWindow("Chapter 1: Setting up SDL", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, 640, 480,SDL_WINDOW_SHOWN);
5.假如SDL2的窗口創建成功,就將在其上面創建SDL2渲染器,調用 SDL_CreateRenderer 函數。
// if the window creation succeeded create our renderer
if(g_pWindow != 0)
{
g_pRenderer = SDL_CreateRenderer(g_pWindow, -1, 0);
}
else
{
return 1; // sdl could not initialize
}
6.假如SDL2渲染器創建成功,就可以在該窗口上使用該渲染器進行繪圖等操作。
// everything succeeded lets draw the window
// set to black
SDL_SetRenderDrawColor(g_pRenderer, 0, 0, 0, 255);
// clear the window to black
SDL_RenderClear(g_pRenderer);
// show the window
SDL_RenderPresent(g_pRenderer);
7.最後就是釋放資源,反初始化。
SDL_Quit();
👉SDL initialization flags
Flag | Initialized subsystem(s) |
---|---|
SDL_INIT_HAPTIC | Force feedback subsystem |
SDL_INIT_AUDIO | Audio subsystem |
SDL_INIT_VIDEO | Video subsystem |
SDL_INIT_TIMER | Timer subsystem |
SDL_INIT_JOYSTICK | Joystick subsystem |
SDL_INIT_EVERYTHING | All subsystems |
SDL_INIT_NOPARACHUTE | Don’t catch fatal signals |
可以使用(|)符號來初始化多個子系統。如:
SDL_Init(SDL_INIT_AUDIO | SDL_INIT_VIDEO);
可以用 SDL_WasInit()
函數來檢查某個子系統是否初始化完成。如:
if(SDL_WasInit(SDL_INIT_VIDEO) != 0)
{
cout << "video was initialized";
}
👉SDL renderer flags
當初始化一個SDL_Renderer標識的時候,可以改變渲染器的渲染行爲。
Flag | Purpose |
---|---|
SDL_RENDERER_SOFTWARE | Use software rendering |
SDL_RENDERER_ACCELERATED | Use hardware acceleration |
SDL_RENDERER_PRESENTVSYNC | Synchronize renderer update with screen’s refresh rate |
SDL_RENDERER_TARGETTEXTURE | Supports render to texture |
👉SDL_WindowFlags
在SDL_CreateWindow
函數的最後一個參數是表明SDL窗口的行爲。
Flag | Purpose |
---|---|
SDL_WINDOW_FULLSCREEN | Make the window fullscreen |
SDL_WINDOW_OPENGL | Window can be used with as an OpenGL context |
SDL_WINDOW_SHOWN | The window is visible |
SDL_WINDOW_HIDDEN | Hide the window |
SDL_WINDOW_BORDERLESS | No border on the window |
SDL_WINDOW_RESIZABLE | Enable resizing of the window |
SDL_WINDOW_MINIMIZED | Minimize the window |
SDL_WINDOW_MAXIMIZED | Maximize the window |
SDL_WINDOW_INPUT_GRABBED | Window has grabbed input focus |
SDL_WINDOW_INPUT_FOCUS | Window has input focus |
SDL_WINDOW_MOUSE_FOCUS | Window has mouse focus |
SDL_WINDOW_FOREIGN | The window was not created using SDL |
👉遊戲的基本流程
遊戲的基本流程在於中間那三個步驟:獲取輸入、物理計算、渲染輸出。然後以固定每秒循環n次執行,這也是遊戲的幀數本質所在。當然,由於每一個步驟執行也是需要時間的,爲了穩定幀數,還得做一些其他的操作。
歡迎關注個人公衆號,閱讀更多的原創文章。