SDL2:第二個程序(Mac):顯示BMP位圖

繼上一個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_Init

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地址

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