我剛剛開始使用SDL2,閱讀了幾篇文章,並能夠編譯我在Arch Linux上成功編寫的測試程序。似乎正在發生的唯一問題是,正在創建的窗口不會呈現圖像。我試着在Mac上運行相同的代碼,這確實導致了預期結果。我使用CLION,它不是malefactor,因爲用g ++通過CLI進行編譯的結果相同。Arch Linux上的SDL2:窗口呈現它背後的屏幕
我的Arch Linux的安裝:
OS: Arch Linux x86_64
Kernel Release: 4.6.2-1-ARCH
這裏是我編譯代碼:
#include <iomanip>
#include <SDL2/SDL.h>
using namespace std;
const int WIDTH = 640;
const int HEIGHT = 480;
bool init();
bool loadMedia();
int close();
SDL_Window* window = NULL;
SDL_Surface* surface = NULL;
SDL_Surface* image = NULL;
int main(int argc, char** argv) {
if(init())
if(loadMedia())
printf("Media loaded");
SDL_BlitSurface(image, NULL, surface, NULL);
SDL_UpdateWindowSurface(window);
SDL_Delay(5000);
return close();
}
bool init() {
if(SDL_Init(SDL_INIT_EVERYTHING) < 0) {
printf("Error initializing SDL: %s", SDL_GetError());
return false;
} else {
window = SDL_CreateWindow("Hello World", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, WIDTH, HEIGHT, SDL_WINDOW_SHOWN);
if(window == NULL) {
printf("Error creating window: %s", SDL_GetError());
return false;
}
else
surface = SDL_GetWindowSurface(window);
}
return true;
}
bool loadMedia() {
image = SDL_LoadBMP("/home/me/ClionProjects/SDLTest/test.bmp");
if(image == NULL) {
printf("Error loading in image: %s", SDL_GetError());
return false;
}
return true;
}
int close() {
SDL_FreeSurface(surface);
SDL_FreeSurface(image);
SDL_DestroyWindow(window);
SDL_Quit();
return 0;
}
我的CMakeLists.txt文件(克利翁使用):
cmake_minimum_required(VERSION 3.5)
project(SDLTest)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -w -lSDL2")
set(SOURCE_FILES main.cpp)
add_executable(SDLTest ${SOURCE_FILES})
而且我用g ++編譯的Unix命令:
g++ main.cpp -w -lSDL2 -o prog
它看起來什麼拱上運行的代碼時,如:
我應該注意,僅複製什麼屏幕上的一次,並且不更新窗口內容。所以當我移動窗口時,窗口中呈現的內容保持不變。
在Mac:
已經找到了幾篇文章也暗示了這個問題,但這些條款的解決方案並不爲我工作。具體來說,我在談論這些文章。
SDL - window doesn't show anything
https://bbs.archlinux.org/viewtopic.php?id=188412
希望我提供足夠的信息,而且有人在那裏已經經歷了同樣的問題,已經能夠解決這個問題。提前致謝!
後編輯keltar's comment(還沒有做它應該):
#include <iomanip>
#include <SDL2/SDL.h>
using namespace std;
const int WIDTH = 640;
const int HEIGHT = 480;
bool init();
bool loadMedia();
//int close();
SDL_Window* window = NULL;
SDL_Surface* surface = NULL;
SDL_Surface* image = NULL;
int main(int argc, char** argv) {
if(init())
if(loadMedia())
printf("Media loaded");
SDL_BlitSurface(image, NULL, surface, NULL);
SDL_UpdateWindowSurface(window);
SDL_Delay(5000);
SDL_Quit();
return 0;
}
bool init() {
if(SDL_Init(SDL_INIT_EVERYTHING) < 0) {
printf("Error initializing SDL: %s", SDL_GetError());
return false;
} else {
window = SDL_CreateWindow("Hello World", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, WIDTH, HEIGHT, SDL_WINDOW_SHOWN);
if(window == NULL) {
printf("Error creating window: %s", SDL_GetError());
return false;
}
else
surface = SDL_GetWindowSurface(window);
}
return true;
}
bool loadMedia() {
image = SDL_LoadBMP("/home/me/ClionProjects/SDLTest/test.bmp");
if(image == NULL) {
printf("Error loading in image: %s", SDL_GetError());
return false;
}
return true;
}
//int close() {
// SDL_FreeSurface(surface);
// SDL_FreeSurface(image);
// SDL_DestroyWindow(window);
// SDL_Quit();
// return 0;
//}
1.不要自由的窗口表面,和2. - 在大多數情況下(通常與合成窗口管理器有關),你不能期望圖像通過簡單的等待出現。添加一個循環,刷新事件隊列,然後繪製圖像,然後重複。 – keltar
...我再次忘記了「關閉」功能。請不要這樣做。 http://stackoverflow.com/questions/31482117/sdl-event-handling-not-working – keltar
感謝提示,我會考慮他們,當我更流利的框架。現在,我只是按照本教程,因爲你可能已經扣除:http://lazyfoo.net/tutorials/SDL/02_getting_an_image_on_the_screen/index.php 改變你的建議並沒有改變一個事實,即沒有任何事實被呈現我所要求的。我現在要做的主要事情是修正在Arch Linux上運行此代碼並在OS X上運行它之間似乎存在的差異。 –