SDL遊戲引擎是著名的跨平臺遊戲引擎,廣泛用於遊戲開發,模擬器開發,視頻播放器開發等。最新的SDL 2.0加入了對Android系統的支持,配合其他開發包,如SDL_Image,SDL_TTF,SDL_Net等庫,可實現真正的跨平臺開發,有數以萬計的桌面遊戲通過它開發,當然也有無數的開源代碼可以借鑑和學習,但實際某些應用要配合多窗口或菜單來實現,僅靠引擎本身無法實現所需功能,有時要將引擎界面融合到windows窗口或子窗口中,本文目的即在於此。
工具/原料
SDL 2.0.3遊戲開發包
VC編譯器(示例使用VC2010)
方法/步驟
官方下載SDL2.0開發包
使用VC嚮導工具,新建 Window 32工程,在此工程示例名為SDLWin32
設置工程屬性,添加對應頭文件和庫文件
在工程源文件SDLWin32.cpp中添加SDL 頭文件和庫文件
#include
#pragma comment (lib,"SDL2.lib")
添加變量:
SDL_Window *window;
SDL_Renderer *renderer;
SDL_Texture *sprite;
int window_w, window_h;
int sprite_w, sprite_h;
SDL_Event event;
添加函數LoadSprite,目的用來加載紋理圖片。
SDL_Texture * LoadSprite(SDL_Renderer *renderer, char *file)
{
SDL_Surface *temp;
SDL_Texture *sprite;
/* Load the sprite image */
temp = SDL_LoadBMP(file);
/* Set transparent pixel as the pixel at (0,0) */
if (temp->format->palette) {
SDL_SetColorKey(temp, 1, *(Uint8 *) temp->pixels);
}
/* Create textures from the image */
sprite = SDL_CreateTextureFromSurface(renderer, temp);
if (!sprite) {
SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "Couldn't create texture: %s\n", SDL_GetError());
SDL_FreeSurface(temp);
return 0;
}
SDL_FreeSurface(temp);
/* We're ready to roll. :) */
return sprite;
}
添加繪圖函數 Draw,該函數目的用來將加載的圖片紋理顯示,背景為純黑色。
void Draw(SDL_Renderer * renderer, SDL_Texture * sprite)
{
SDL_SetRenderDrawColor(renderer, 0x0, 0x0, 0x0, 0xFF);
SDL_RenderClear(renderer);
SDL_RenderCopy(renderer, sprite, NULL, NULL);
SDL_RenderPresent(renderer);
}
在WinMain函數首行加入SDL庫初始化函數。
SDL_VideoInit(NULL);
並替換消息循環函數為:
int done = 0;
while (!done) {
/* Check for events */
while (SDL_PollEvent(&event)) {
switch (event.type) {
case SDL_WINDOWEVENT:
switch (event.window.event) {
case SDL_WINDOWEVENT_EXPOSED:
SDL_SetRenderDrawColor(renderer, 0x0, 0x0, 0x0, 0xFF);
SDL_RenderClear(renderer);
break;
}
break;
case SDL_QUIT:
done = 1;
break;
default:
break;
}
}
Draw(renderer, sprite);
}
在WndProc函數中添加WM_CREATE消息,並添加以下代碼,目的是將當前窗口設置為引擎渲染窗口,並設置標題,加載圖片紋理。
case WM_CREATE:
window=SDL_CreateWindowFrom(hWnd);
SDL_SetWindowTitle(window, "SDL Native Window Test");
renderer = SDL_CreateRenderer(window, -1, 0);
SDL_SetRenderDrawColor(renderer, 0xA0, 0xA0, 0xA0, 0xFF);
SDL_RenderClear(renderer);
sprite = LoadSprite(renderer, "flower.bmp");
break;
同時修改WM_DESTROY消息,釋放資源,否則會出現內存洩露。
case WM_DESTROY:
SDL_VideoQuit();
PostQuitMessage(0);
exit(0);
break;
按F7編譯程序,在生成目錄加入SDL2.dll文件,並將實現準備好的flower.bmp文件放到程序所在文件夾下,雙擊exe程序,即可查看運行結果。