边框/标题栏未在SDL OSX中正确显示

时间:2016-09-22 11:31:29

标签: c macos sdl

我刚刚关注了lazyfoo的SDL教程,并运行了示例代码,如下所示:

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

//Screen dimension constants
const int SCREEN_WIDTH = 640;
const int SCREEN_HEIGHT = 480;

int main( int argc, char* args[] )
{
    //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 )
    {
        printf( "Failed to initialise SDL! SDL_Error: %s\n", SDL_GetError() );
    }
    else
    {
        //Create window
        window = SDL_CreateWindow( "SDL Tutorial", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, SCREEN_WIDTH, SCREEN_HEIGHT, SDL_WINDOW_SHOWN );
        if( window == NULL )
        {
            printf( "Failed to create window! 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, 255, 0, 0 ) );

            //Update the surface
            SDL_UpdateWindowSurface( window );

            //Wait two seconds
            SDL_Delay( 2000 );
        }
    }

    //Destroy window
    SDL_DestroyWindow( window );

    //Quit SDL subsystems
    SDL_Quit();

    return 0;
}

但由于某些原因,没有显示真正的边框或标题栏,它只显示一个白色的屏幕。我试过用     SDL_SetWindowBordered但它没有做任何事情。接下来,我将背景颜色设置为红色,从该图像中可以看到有一个标题栏,但没有关闭或最小化按钮。Window 有谁知道为什么会这样。这只是我还是mac的问题?

3 个答案:

答案 0 :(得分:3)

由于摆脱SDL_Delay似乎有所帮助,我将尝试详细说明。如果我们查看SDL_Delay的代码,我们可以看到它基本上做了两件事:

  • 如果可以使用nanosleep(),它会睡一段时间;
  • 否则,它在无限while循环中运行,检查每次迭代已经过了多少时间,并且在经过足够的时间后break退出循环。

现在,我必须说我从未亲自为osx编码,所以我不知道它是如何绘制窗口的。但是我可以假设由于某种原因,在操作系统设法绘制窗口的标题之前,代码中的SDL_Delay被调用(并且有效地阻止了它被调用的线程) ,并且在延迟结束后,您会立即自行销毁窗口,因此标题永远不会被正确绘制。

答案 1 :(得分:2)

我知道答案已经解决了,但对于想要简单解决方案的人来说。

示例:

import nltk
from nltk.corpus import wordnet
raw1 = 'Corpus linguistics proposes that reliable language analysis is more feasible with corpora collected in the field, in their natural contexts, and with minimal experimental-interference.'
tokens = nltk.word_tokenize(raw1)
wnl = nltk.WordNetLemmatizer()
lemmatized_tokens = [wnl.lemmatize(tk) for tk in tokens]
print(lemmatized_tokens)

会变成

SDL_Delay(4000);

答案 2 :(得分:1)

实际上,这与SDL_Delay()完全无关。

我对其进行了测试,似乎在OSX上,标题栏仅在每次轮询或抽取事件时才更新。

这意味着SDL_Delay()如果​​阻止了您发送事件,则会阻止标题栏呈现过程。

要解决此问题,只需每毫秒左右调用SDL_PumpEvents():

for(int i = 0; i < time_to_sleep; i++){
    SDL_PumpEvents();
    SDL_Delay(1);
}