【问题标题】:SDL Create window not creating window on Mac os XSDL 创建窗口不在 Mac os X 上创建窗口
【发布时间】: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 等复合窗口系统上。

标签: c sdl


【解决方案1】:

它不起作用的原因是我没有设置事件循环。

我是documentation on how to draw a line,并在那里找到了一个例子。

SDL_Event event;

while (SDL_PollEvent(&event)) {
  if (event.type == SDL_QUIT) {
    done = SDL_TRUE;
  }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-07
    • 1970-01-01
    • 1970-01-01
    • 2015-04-30
    • 2012-05-24
    相关资源
    最近更新 更多