【问题标题】:Window not displaying SDL2窗口不显示 SDL2
【发布时间】:2022-01-27 11:24:57
【问题描述】:

我是第一次使用 SDL2,当我尝试创建一个窗口时,它没有显示。唯一能看到窗口的是在我的 Dock 中生成的图标(Image of the icon,SDLTest.out 是我的可执行文件的名称)。我发现它是在调用 SDL_INIT() 时生成的。

我尝试更新窗口、更改其颜色并添加标志SDL_WINDOW_SHOWN,但这些解决方案均无效。我什至从网上粘贴了一段代码,但效果并不好。

这是我粘贴的代码:

#include <SDL2/SDL.h>
#include <stdio.h>
#include <stdlib.h>


int main(int argc, char *argv[])
{
    SDL_Window *window = NULL;
    SDL_Renderer *renderer = NULL;
    int status = EXIT_FAILURE;
    SDL_Color orange = {255, 127, 40, 255};
    
    if(0 != SDL_Init(SDL_INIT_VIDEO))
    {
        fprintf(stderr, "Error SDL_Init : %s", SDL_GetError());
        goto Quit;
    }
    window = SDL_CreateWindow("SDL2", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED,
                              640, 480, SDL_WINDOW_SHOWN);
    if(NULL == window)
    {
        fprintf(stderr, "Error SDL_CreateWindow : %s", SDL_GetError());
        goto Quit;
    }
    renderer = SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED);
    if(NULL == renderer)
    {
        fprintf(stderr, "Error SDL_CreateRenderer : %s", SDL_GetError());
        goto Quit;
    }
    
    if(0 != SDL_SetRenderDrawColor(renderer, orange.r, orange.g, orange.b, orange.a))
    {
        fprintf(stderr, "Error SDL_SetRenderDrawColor : %s", SDL_GetError());
        goto Quit;
    }
    
    if(0 != SDL_RenderClear(renderer))
    {
        fprintf(stderr, "Error SDL_SetRenderDrawColor : %s", SDL_GetError());
        goto Quit;
    }
    
    SDL_Delay(500);
    SDL_RenderPresent(renderer);
    SDL_Delay(500);
    
    status = EXIT_SUCCESS;

Quit:
    if(NULL != renderer)
        SDL_DestroyRenderer(renderer);
    if(NULL != window)
        SDL_DestroyWindow(window);
    SDL_Quit();
    return status;
}

我的操作系统是 MacOS 11.6,我的编译器是 GCC,我的电脑有一个显卡 Intel Iris Pro Graphics 6200,我使用 Homebrew 安装了 SDL2。

有人可以帮我吗?

【问题讨论】:

  • 我在我的 Linux 中测试了您的代码,它可以正常工作:显示一个空窗口,然后将其填充为橙色,然后关闭。
  • 这是它应该做的,但这在我的电脑上不起作用;(
  • 你需要一个事件循环。在某些平台上,没有一个东西就无法工作。继续阅读您的教程,它应该在某个地方。
  • 它工作正常,非常感谢您的回答!

标签: c sdl-2


【解决方案1】:

我只需要一个事件循环。我添加了这段代码,它起作用了:

    SDL_bool quit = SDL_FALSE;
    while(!quit)
    {
        SDL_RenderPresent(renderer);
        SDL_WaitEvent(&event);
        if(event.type == SDL_QUIT)
            quit = SDL_TRUE;
    }

感谢HolyBlackCat 的评论!

【讨论】:

    猜你喜欢
    • 2023-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-04
    • 1970-01-01
    相关资源
    最近更新 更多