【发布时间】:2019-11-23 23:03:19
【问题描述】:
我正在尝试制作一个程序,在一个窗口中呈现几个彩色矩形,然后在几秒钟后消失。基本上,应该会出现以下内容(尽管我遇到了问题,但我很快就会解释我是如何做到的):
我尝试运行的代码如下,显然包含
SDL_Window *window;
SDL_Renderer *renderer;
SDL_Init(SDL_INIT_VIDEO);
window = SDL_CreateWindow("Game Window", 0, 0, WINDOW_WIDTH, WINDOW_HEIGHT, 0);
if (window == NULL) {
// In the case that the window could not be made...
printf("Could not create window: %s\n", SDL_GetError());
return 1;
}
renderer = SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED);
SDL_RenderClear(renderer);
SDL_SetRenderDrawColor(renderer, 140, 0, 100, 100);
SDL_Rect rect = { 0, 0, 800, 640 };
SDL_RenderFillRect(renderer, &rect);
SDL_SetRenderDrawColor(renderer, 60, 0, 255, 100);
SDL_Rect rect2 = { 40, 40, 720, 560 };
SDL_RenderFillRect(renderer, &rect2);
SDL_SetRenderDrawColor(renderer, 50, 140, 0, 100);
SDL_Rect rect3 = { 80, 80, 640, 480 };
SDL_RenderFillRect(renderer, &rect3);
SDL_SetRenderDrawColor(renderer, 200, 50, 25, 0);
SDL_Rect rect4 = { 120, 120, 560, 400 };
SDL_RenderFillRect(renderer, &rect4);
SDL_RenderPresent(renderer);
SDL_Delay(2000);
SDL_DestroyWindow(window);
SDL_DestroyRenderer(renderer);
SDL_Quit();
return 0;
这段代码看起来应该可以正常工作,实际上对于上述视频中的人(他和我一样,在 MacOS 上使用 Xcode 运行此代码,尽管它的版本要旧得多)也能正常工作。然而,当我运行我的书面代码时,视频中发生的同样的事情似乎并没有发生在我身上。相反,窗口根本不会出现。代码本身确实可以运行,并且非常好,没有任何错误或警告,但是在延迟结束并且 SDL 窗口被破坏之前,带有彩色矩形的窗口根本不会出现。
我意识到这个问题之前已经在这个网站上提出过,并且每个问题都有非常相似的问题,我需要明确一点,是的,我已经尝试使用事件循环,它工作得非常好。例如,如果我运行以下代码,它与第一批代码相同,只是将“SDL_DELAY”替换为事件处理程序,该事件处理程序检测何时按下键盘或鼠标(并且还包括布尔值的
SDL_Window *window;
SDL_Renderer *renderer;
SDL_Init(SDL_INIT_VIDEO);
window = SDL_CreateWindow("Game Window", 0, 0, WINDOW_WIDTH, WINDOW_HEIGHT, 0);
if (window == NULL) {
// In the case that the window could not be made...
printf("Could not create window: %s\n", SDL_GetError());
return 1;
}
renderer = SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED);
SDL_RenderClear(renderer);
SDL_SetRenderDrawColor(renderer, 140, 0, 100, 100);
SDL_Rect rect = { 0, 0, 800, 640 };
SDL_RenderFillRect(renderer, &rect);
SDL_SetRenderDrawColor(renderer, 60, 0, 255, 100);
SDL_Rect rect2 = { 40, 40, 720, 560 };
SDL_RenderFillRect(renderer, &rect2);
SDL_SetRenderDrawColor(renderer, 50, 140, 0, 100);
SDL_Rect rect3 = { 80, 80, 640, 480 };
SDL_RenderFillRect(renderer, &rect3);
SDL_SetRenderDrawColor(renderer, 200, 50, 25, 0);
SDL_Rect rect4 = { 120, 120, 560, 400 };
SDL_RenderFillRect(renderer, &rect4);
SDL_RenderPresent(renderer);
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;
}
}
}
SDL_DestroyWindow(window);
SDL_DestroyRenderer(renderer);
SDL_Quit();
return 0;
然而,这与第一次尝试实现的目标不同,正如我所说的那样,它是一个窗口,它被渲染然后在短时间内被销毁。如果我不能使用上面显示的第一组代码,我应该如何做到这一点?此外,为什么使用 SDL_DELAY 的这种设置显然对视频中的人有效(为方便起见,可以再次找到 here)但当我尝试输入时却不行?
【问题讨论】: