我刚刚关注了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但它没有做任何事情。接下来,我将背景颜色设置为红色,从该图像中可以看到有一个标题栏,但没有关闭或最小化按钮。 有谁知道为什么会这样。这只是我还是mac的问题?
答案 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);
}