簡體   English   中英

SDL 窗口不顯示

[英]SDL window does not show

這是我的代碼:

#include <iostream>
#include <SDL2/SDL.h>

int main(int argc, const char * argv[]) {

SDL_Init(SDL_INIT_VIDEO);

SDL_Window *_window;
_window = SDL_CreateWindow("Game Engine", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, 700, 500, SDL_WINDOW_RESIZABLE);

SDL_Delay(20000);

SDL_DestroyWindow(_window);
SDL_Quit();

return 0;

}

我在 Xcode 工作。 我已經下載了 SDL2 並將庫導入到項目構建階段。 我已經測試過 SDL2 工作正常。

問題是窗口永遠不會出現。 我只是得到一個“spinning-mac-wheel”,然后程序在延遲后退出。 我已經確保窗戶沒有藏在某個地方。

想法?

您必須讓系統有機會運行它的事件循環。

最簡單的是自己輪詢事件:

SDL_Event e;
bool quit = false;
while (!quit){
    while (SDL_PollEvent(&e)){
        if (e.type == SDL_QUIT){
            quit = true;
        }
        if (e.type == SDL_KEYDOWN){
            quit = true;
        }
        if (e.type == SDL_MOUSEBUTTONDOWN){
            quit = true;
        }
    }
}

而不是等待循環

--- 附錄

由於這個答案仍然在幫助人們,如果我還添加更多關於為什么它起作用的信息而不是僅僅發布解決方案,那也許很好。

當在 Mac 上(實際上與 Windows 相同)程序啟動時,它僅從“主線程”開始。 這是用於設置 UI 內容的線程。 'main thead' 與其他線程的不同之處在於它帶有一個事件處理系統。 該系統捕獲諸如鼠​​標移動、按鍵按下、按鈕點擊等事件,然后將這些事件排入隊列,讓您的代碼對其做出響應。 Mac(和 Windows)上的所有 UI 事物都依賴於這個事件泵的存在和運行。 這就是為什么如果你在代碼中做任何 UI 相關的事情,你需要確保你不在不同的線程上。

現在,在您的代碼中初始化窗口和 UI,然后執行 SDL_Delay。 這只是阻塞線程並暫停它 20 秒,所以什么都不做。 並且由於您在主線程上執行此操作,因此即使處理帶有事件的隊列也會被阻止。 所以在 Mac 上顯示為旋轉的 macwheel。

所以我發布的解決方案實際上一直在輪詢事件並處理它們。 通過這種方式,您實際上也處於“空閑”狀態,但是在發布事件(例如鼠標單擊和按鍵)時,線程將再次喚醒並處理內容。

您必須加載位圖圖像,或在窗口上顯示某些內容,Xcode 才能開始顯示窗口。

#include <SDL2/SDL.h>
#include <iostream>

using namespace std;

int main() {
    SDL_Window * window = nullptr;

    SDL_Surface * window_surface = nullptr;
    SDL_Surface * image_surface = nullptr;

    SDL_Init(SDL_INIT_VIDEO);

    window = SDL_CreateWindow("Window", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, 640, 480, SDL_WINDOW_SHOWN);

    window_surface = SDL_GetWindowSurface(window);
    image_surface = SDL_LoadBMP("image.bmp");

    SDL_BlitSurface(image_surface, NULL, window_surface, NULL);

    SDL_UpdateWindowSurface(window);

    SDL_Delay(5000);

    SDL_DestroyWindow(window);
    SDL_FreeSurface(image_surface);
    SDL_Quit();
}

在創建窗口之前,您需要使用SDL_Init(SDL_INIT_VIDEO)初始化 SDL。

請刪除sdl_delay()並將其替換為下面提到的代碼。 我沒有任何理由,但我自己嘗試過並且有效

bool isquit = false;
SDL_Event event;
while (!isquit) {
    if (SDL_PollEvent( & event)) {
        if (event.type == SDL_QUIT) {
            isquit = true;
        }
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM