繼上一個SDL2程序(SDL2:第一個程序(Mac)),我們使用SDL2打開了一個黑色的窗口。
世界應該是彩色的,怎麼能讓黑色霸佔呢,是時候讓陽光驅逐黑暗了,今天,我要用SDL2顯示一張圖片。
爲此,我花重金請了位模特,拍了張照片。我待會兒就要讓小王子進入SDL的世界。
代碼
還是第一個程序的代碼,只不過在上面稍作修改。
首先是CMakeLists.txt文件
cmake_minimum_required(VERSION 3.10)
project(PlaySDL)
set(CMAKE_CXX_STANDARD 11)
set(SDL_DIR /usr/local/Cellar/sdl2/2.0.9_1/)
include_directories(${SDL_DIR}/include/)
link_libraries(${SDL_DIR}/lib/)
add_executable(PlaySDL main.cpp)
target_link_libraries(PlaySDL SDL2 SDL2_test SDL2main)
什麼都沒改,但爲了不讓你回到第一篇文章去看,我還是貼在這裏了。
下面是代碼部分,只做了點小修改:
#include <iostream>
extern "C" {
#include <SDL2/SDL.h>
#include <SDL2/SDL_test_images.h>
}
using namespace std;
const int WIDTH = 960, HEIGHT = 540;
int main() {
SDL_Surface *imageSurface = NULL; // 申明用於加載圖片的SDL_Surface
SDL_Surface *windowSurface = NULL; // 申明用於窗體相關的SDL_Surface
if (SDL_Init(SDL_INIT_EVERYTHING) < 0) {
cout << "SDL could not initialized with error: " << SDL_GetError() << endl;
}
SDL_Window *window = SDL_CreateWindow("Hello SDL world!", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, WIDTH, HEIGHT, SDL_WINDOW_ALLOW_HIGHDPI);
if (NULL == window) {
cout << "SDL could not create window with error: " << SDL_GetError() << endl;
}
windowSurface = SDL_GetWindowSurface(window);
imageSurface = SDL_LoadBMP("little_prince.bmp");
if (NULL == imageSurface) {
cout << "SDL could not load image with error: " << SDL_GetError() << endl;
}
SDL_Event windowEvent;
while(true) {
if (SDL_PollEvent(&windowEvent)) {
if (SDL_QUIT == windowEvent.type) {
cout << "SDL quit!!" << endl;
break;
}
}
SDL_BlitSurface(imageSurface, NULL, windowSurface, NULL);
SDL_UpdateWindowSurface(window);
}
imageSurface = NULL;
windowSurface = NULL;
SDL_DestroyWindow(window);
SDL_Quit();
return 0;
}
little_prince.bmp需要是真正的bmp格式圖片。SDL默認值支持bmp格式的,如果使用其他格式的圖片,你可能拿到的是些亂七八糟的東西。
至於怎麼使用SDL展示其它格式的圖片,下一篇文章中會講。
看一下運行效果:
加載出來了,小王子戰勝了黑暗世界。
代碼調用流程
代碼流程圖中,黃色部分函數調用,是從第一個程序copy過來的,它幾乎是所有SDL程序的必要流程了,要豐富SDL程序,都是在黃色框架之間擴充功能和代碼,相關函數解釋可以查看:
SDL2常用函數&結構分析:SDL_Window&SDL_CreateWindow
SDL_Window
SDL2常用函數&結構分析:SDL_Event&SDL_PollEvent
綠色部分,是本次代碼新增,用於顯示BMP位圖的極簡邏輯,相關函數解釋可以查看:
SDL2常用函數&結構分析:SDL_Surface&SDL_GetWindowSurface&SDL_LoadBMP
SDL2常用函數&結構分析:SDL_BlitSurface&SDL_UpdateWindowSurface
TODO:github地址