这是一段我尝试在我的Linux计算机上运行的SDL2示例代码,我的操作系统是Ubuntu 18.04,并且使用了KDE Plasma桌面环境(我安装了多个桌面环境以备不时之需)。
#include<iostream>
#include<SDL2/SDL.h>
int main(int argc, char** argv)
{
if(SDL_Init(SDL_INIT_VIDEO) != 0){
std::cerr << "SDL_Init() Error: " << SDL_GetError() << std::endl;
return 1;
}
SDL_Window* win = SDL_CreateWindow(
"Hello world",
SDL_WINDOWPOS_CENTERED,
SDL_WINDOWPOS_CENTERED,
640,480,
0
);
if(win == nullptr){
std::cerr << "SDL_CreateWindow() Error: " << SDL_GetError() << std::endl;
return 1;
}
//Create and init the renderer
SDL_Renderer* ren = SDL_CreateRenderer(win, -1, 0);
if(ren == nullptr){
std::cerr << "SDL_CreateRenderer() Error: " << SDL_GetError() << std::endl;
SDL_DestroyWindow(win);
return 1;
}
//Render something
SDL_RenderSetLogicalSize(ren,640,480);
//Set colour of renderer
SDL_SetRenderDrawColor(ren,255,0,0,255);
//Clear the screen to the set colour
SDL_RenderClear(ren);
//Show all the has been done behind the scenes
SDL_RenderPresent(ren);
//Delay so that we can see what is on the screen
SDL_Delay(5000);
//Clean Up
SDL_DestroyRenderer(ren);
SDL_DestroyWindow(win);
SDL_Quit();
return 0;
}
当我第一次运行程序时,应该出现的红窗口只出现了一次。所有后续执行都会产生一个透明的空窗口,并将背景中的任何内容拖动到窗口中。我在
SDL_CreateWindow()
中尝试使用SDL_WINDOW_SHOWN
标志以及SDL_CreateRenderer()
中的SDL_RENDER_ACCELERATED
标志。唯一再次出现红屏幕的方法是重新启动系统。即使我使用IDE(CodeLite)编译并运行此代码,仍然得到相同的结果。这个SO上的问题与此类似,但OP不使用Linux,问题也不完全相同。这个网站上的其他帖子提到事件处理,但我还没有深入了解。如果必要的话,我会感激一些关于它的资源,因为文档没有解释得很清楚。 更新:该程序在另一台运行Lubuntu 18.10的计算机上可以正常运行。
sleep()
中阻塞5秒钟:)),否则系统会认为您的程序已经死亡或变得无响应。 - genpfaultSDL_PollEvent()
/SDL_WaitEvent()
事件循环来响应用户输入和重新绘制。 - genpfault