2016-09-22 1 views
0

Я просто следуя СВД учебник lazyfoo, и я побежал пример кода, как показано здесь:Border/Titlebar не правильно отображать в SDL OSX

#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?

+0

Что произойдет, если вы избавиться от 'SDL_delay'? Добавьте простой цикл событий после инициализации окна, чтобы ваше приложение не сразу закрывалось: 'bool running = true; \t while (бег) \t { \t \t SDL_Event e; \t \t в то время как (SDL_PollEvent (& е)) \t \t { \t \t \t переключатель (e.type) \t \t \t { \t \t \t \t случай SDL_Quit: \t \t \t \t \t работает = ложь; \t \t \t \t \t break; \t \t \t} \t \t} \t} ' – SingerOfTheFall

+0

@SingerOfTheFall Да делает это работало, у вас есть объяснение, почему это происходит? – Hamish

ответ

1

Поскольку избавление от SDL_Delay, казалось, помогло, я постараюсь немного разработать. Если мы посмотрим на код SDL_Delay мы можем видеть, что это в основном делает две вещи:

  • если nanosleep() может быть использован, он делает сон в течение интервала времени;
  • else, он работает в бесконечном цикле while, проверяя, сколько времени прошло @ на каждой итерации, и break Выйти из цикла после того, как прошло достаточно времени.

Теперь, я должен сказать, что я никогда не был лично закодирован для osx, поэтому я не знаю, как именно он рисует его окна. Однако я могу предположить, что по какой-то причине SDL_Delay в вашем коду вызывается (и эффективно блокирует поток, из которого он вызван) до ОС удается нарисовать заголовок окна, и после завершения задержки вы немедленно уничтожаете окно самостоятельно, поэтому заголовок никогда не будет правильно нарисован.

+0

это странная проблема, но по крайней мере она исправлена – Hamish

1

Я знаю, что ответ уже решен, но для тех, кто хочет простого решения.

Пример:

SDL_Delay(4000); 

превратится в

for(int i = 0; i < 4000; i++){ 
    SDL_PumpEvents(); 
    SDL_Delay(1); 
} 
Смежные вопросы