【发布时间】:2020-10-22 06:28:10
【问题描述】:
我正在关注 SDL 上的Lazy Foo tutorial。
使用SDL_WINDOW_SHOWN 创建窗口并运行二进制文件时,会出现菜单栏,但窗口不会出现。需要一些关于我可以做些什么来进一步调试的指导。
我也尝试过手动设置窗口位置,但没有成功。
SDL_CreateWindow("SDL Tutorial", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED,
SCREEN_WIDTH, SCREEN_HEIGHT, SDL_WINDOW_SHOWN);
SDL_CreateWindow("SDL Tutorial", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED,
SCREEN_WIDTH, SCREEN_HEIGHT, SDL_WINDOW_SHOWN);
SDL_CreateWindow("SDL Tutorial", 100, 100, SCREEN_WIDTH, SCREEN_HEIGHT, SDL_WINDOW_SHOWN);
一切编译成功,SDL_GetError() 不会产生任何错误。我登录到一个文件来确认。
#include <SDL2/SDL.h>
#include <stdio.h>
//Screen dimension constants
const int SCREEN_WIDTH = 640;
const int SCREEN_HEIGHT = 480;
int main(int argc, const char * argv[]) {
FILE *log_file;
log_file = fopen("log.log", "a+");
//The window we'll be rendering to
SDL_Window* window = NULL;
//The surface contained by the window
SDL_Surface* screenSurface = NULL;
//Initialize SDL
if (SDL_Init(SDL_INIT_VIDEO) < 0 )
{
fprintf(log_file, "SDL could not initialize! SDL_Error: %s\n", SDL_GetError());
}
else
{
//Create window
window = SDL_CreateWindow("SDL Tutorial", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED,
SCREEN_WIDTH, SCREEN_HEIGHT, SDL_WINDOW_SHOWN);
if (window == NULL)
{
fprintf(log_file, "Window could not be created! SDL_Error: %s\n", SDL_GetError());
}
else
{
//Get window surface
screenSurface = SDL_GetWindowSurface(window);
//Fill the surface white
SDL_FillRect(screenSurface, NULL, SDL_MapRGB(screenSurface->format, 0xFF, 0xFF, 0xFF));
//Update the surface
SDL_UpdateWindowSurface(window);
fprintf(log_file, "SDL_Error: %s\n", SDL_GetError());
//Wait two seconds
SDL_Delay(2000);
}
}
//Destroy window
SDL_DestroyWindow(window);
//Quit SDL subsystems
SDL_Quit();
return 0;
}
【问题讨论】:
-
抽出事件循环会更好吗?
-
screenSurface可以吗? (不是NULL) -
@genpfault 抽水有效,我继续画一条线并查看他们在
while循环中使用SDL_PollEvent()的documentation for SDL_RenderDrawLine。我切换到那个。现在我面临着看不到画线的问题。 -
奇怪... IIRC 在屏幕上绘图应该可以在没有事件循环的情况下工作。
-
@DanielJour:也许在旧的非合成系统上。在 SO 上定期出现此类问题,几乎总是在 macOS 或 Windows 的 DWM 等复合窗口系统上。