Upgrade to Pro — share decks privately, control downloads, hide ads and more …

做遊戲,從SDL開始

thekk
May 24, 2014
310

 做遊戲,從SDL開始

簡單介紹SDL,並且談談其優劣之處

thekk

May 24, 2014
Tweet

Transcript

  1. SDL是什麼 - Simple Directmedia Layer - 提供低階的聲音,事件,圖片等控制函式 - 自由軟體! (zlib

    licence) - C寫成,跨平臺,簡單易用 - GNU/Linux, Mac OS, Windows, iOS, Android, PSP, Raspberry Pi - http://www.libsdl.org/
  2. SDL2.0 APIs - 影像 - 事件 - 多執行緒 - 音訊

    - 計時 - 控制器 - 震動 - 檔案系統 - 電源管理 - CPU資訊 - etc
  3. SDL2.0新功能 - 多視窗 - 多螢幕 - 多音效輸出 - 全螢幕功能更完善 -

    繪圖功能預設爲硬體繪圖(OpenGL, OpenGL ES或是DirectX) - 支援IOS & Android - ...
  4. SDL基礎API (以下說的都是SDL2.0) - SDL_Init() → 啓動SDL subsystem - SDL_Window →

    製作一個視窗 - SDL_Surface → 繪製視窗裏的內容,只能靠軟體繪圖 - SDL_Renderer → 也是繪製視窗內容,支援硬體加速 - SDL_Event → 傳送事件內容的容器 - SDL_Quit() → 離開SDL subsystem
  5. - SDL_Init() //開啓SDL的subsystem SDL_Init(SDL_INIT_FLAG_YOU_WANT); /* Flags you can use SDL_INIT_TIMER

    timer subsystem SDL_INIT_AUDIO audio subsystem SDL_INIT_VIDEO video subsystem SDL_INIT_JOYSTICK joystick subsystem SDL_INIT_HAPTIC haptic (force feedback) subsystem SDL_INIT_GAMECONTROLLER controller subsystem SDL_INIT_EVENTS events subsystem SDL_INIT_EVERYTHING all of the above subsystems SDL_INIT_NOPARACHUTE don't catch fatal signals */
  6. - SDL_Window //作出一個視窗 SDL_Window* mainWindow = SDL_CreateWindow( "Your window title

    here", //視窗名稱 SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, //視窗出現的位 置 500, 500, //視窗大小 SDL_WINDOW_SHOWN //視窗的flags };
  7. - SDL_Window /* Window flags you can use SDL_WINDOW_FULLSCREEN fullscreen

    window SDL_WINDOW_FULLSCREEN_DESKTOP fullscreen window at the current desktop resolution SDL_WINDOW_OPENGL window usable with OpenGL context SDL_WINDOW_HIDDEN window is not visible SDL_WINDOW_BORDERLESS no window decoration SDL_WINDOW_RESIZABLE window can be resized SDL_WINDOW_MINIMIZED window is minimized SDL_WINDOW_MAXIMIZED window is maximized SDL_WINDOW_INPUT_GRABBED window has grabbed input focus SDL_WINDOW_ALLOW_HIGHDPI window should be created in high-DPI mode if supported (>= SDL 2.0.1) */
  8. - SDL_Renderer //作出一個渲染器 SDL_Renderer* mainRenderer = SDL_CreateRenderer( mainWindow, //給哪個SDL_Window用的 -1,

    //要初始化的繪圖裝置 (-1表示用第一個找到的 ) SDL_RENDERER_ACCELERATED //一些flags ); /* Flags you can use SDL_RENDERER_SOFTWARE the renderer is a software fallback SDL_RENDERER_ACCELERATED the renderer uses hardware acceleration SDL_RENDERER_PRESENTVSYNC present is synchronized with the refresh rate SDL_RENDERER_TARGETTEXTURE the renderer supports rendering to texture */
  9. - SDL_Renderer //你會需要用上的其他函數 //設定Render繪圖的顏色,這裏設定成 r = g = b =

    204,透明度是255 SDL_SetRenderDrawColor(mainRenderer, 204, 204, 204, 255); //把設定好的顏色,拿來清理該 Renderer的內容 SDL_RenderClear(mainRenderer); //把剛剛畫的東西顯示出來 (圖學的玩意兒) SDL_RenderPresent(mainRenderer);
  10. - 斷開電腦圖學的牽連 用現代OpenGL來畫紅色正方形: //前置作業 寫一份Vertex shader,寫一份Fragment shader 讀入vertex shader並編譯,讀入fragment sader並編譯

    把上面兩個shader包成一個shader program,然後手動連接並啓動這個 shader program 作出model matrix, viewport matrix跟projection matrix,連接上shader program //設定繪製內容 先作出一份vertex array object(VAO)存下設定 再作出一份vertex buffer object(VBO)存下點座標位置 你可能還會需要一份 normal buffer object去存下各點的法向量 //畫圖 終於可以畫出"一個""紅色正方形
  11. - 斷開電腦圖學的牽連 用SDL的內建API來畫紅色正方形: … SDL_Rect redSquare = {10, 10, 10,

    10}; //設定紅色正方形的位置和長寬 SDL_SetRenderDrawColor(mainRenderer, 255, 0, 0, 255); //設定成紅色 SDL_RenderFillRect(mainRenderer, &redSquare); //畫出實心的正方形 SDL_RenderPresent(mainRenderer); //結束 …
  12. - 還有其他選擇 LÖVE - 使用Lua作爲腳本的2D遊戲製作工具 - Mac OS X, GNU/Linux,

    Windows - zlib/libpng授權 Ren'Py - 使用Python作爲腳本的文字冒險(ADV)製作工具 - Mac OS X, GNU/Linux, Android, Windows - MIT授權(by維基百科) MariO(免費) Juniper’s Knot(免費)
  13. - 還有其他選擇 - C++寫成 - Mac OS X, GNU/Linux, Windows

    - zlib/libpng授權 - 支援多種語言(C, .NET, Python, D, Ruby, Java, Rust, OCaml)
  14. - 還有其他選擇 使用其他語言來SDL - C - C++ - C# -

    Pascal - Lua http://www.libsdl.org/languages.php