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

做遊戲,從SDL開始

Sponsored · Your Podcast. Everywhere. Effortlessly. Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
Avatar for thekk thekk
May 24, 2014
330

 做遊戲,從SDL開始

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

Avatar for thekk

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