第一章 認識SDL

第一章 認識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次執行,這也是遊戲的幀數本質所在。當然,由於每一個步驟執行也是需要時間的,爲了穩定幀數,還得做一些其他的操作。


歡迎關注個人公衆號,閱讀更多的原創文章
歡迎關注個人公衆號,閱讀更多的原創文章。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章