2016-09-08 2 views
-2

Я застрял в большой ошибке с моим кодом, который я не могу открыть в первом окне своей игры после запуска! он просто открывает пробел на несколько секунд, а затем автоматически закрывается. Я не знаю, что случилось с моим кодом, потому что я следую серии обучающих программ, и мой код выглядит как код в учебниках. вот мой код:Не удается открыть окно с SDL/C++

#include "stdafx.h" 
#include "FirstClass.h" 


FirstClass::FirstClass(void){ 

bool quit = false; 
window = NULL; 
window = SDL_CreateWindow("Snaykie v1.0",350, 150, 800, 500, SDL_WINDOW_SHOWN); 
if (window == NULL){ 
    std::cout << "Can not open the game!" << std::endl; 
} 
renderer = NULL; 
renderer = SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED); 
evt = new SDL_Event(); 
//background image 
txt = NULL; 
txt = IMG_LoadTexture(renderer, "mainview.bmp"); 

rct.x = 0 ; 
rct.y = 0; 
rct.h = 500; 
rct.w = 800; 
//button start 
sbutt = NULL; 
sbutt = IMG_LoadTexture(renderer, "startbutton.bmp"); 

startrct.x = 0 ; 
startrct.y = 0; 
startrct.h = 100; 
startrct.w = 100; 
} 


FirstClass::~FirstClass(void) 
{ 
SDL_DestroyTexture(txt); 
SDL_DestroyTexture(sbutt); 
SDL_DestroyWindow(window); 
SDL_DestroyRenderer(renderer); 
delete evt; 
} 
//the code below is the loops that let the window stucks forever to keep  opened 
void FirstClass :: GameStart(void){ 
while (!quit && evt->type != SDL_QUIT){ 

    SDL_PollEvent(evt); 
    SDL_RenderClear(renderer); 
    SDL_RenderCopy(renderer, txt, NULL, &rct); 
    SDL_RenderCopy(renderer, sbutt, NULL, &startrct); 
    SDL_RenderPresent(renderer); 

} 
} 

Пожалуйста, помогите мне и спасибо, что у меня действительно большая проблема.

ответ

1

Вы обрабатываете переменную evt в плохом режиме. Он выделяется, но не инициализируется, и вы сравниваете неинициализированное значение с SDL_QUIT. Вы должны переупорядочить код внутри FirstClass::GameStart и предпочтительно использовать локальную переменную (так как нет необходимости использовать динамически выделенную) и удалить выделение и удаление существующего evt из конструктора и деструктора. Вот лучший вариант FirstClass::GameStart:

void FirstClass::GameStart(void){ 
    SDL_Event evt; 
    while (SDL_PollEvent(&evt)){ 
     if (evt.type == SDL_QUIT) { 
      // a user requested termination has been received, exit the loop 
      break; 
     } 
     else { 
      // filter the event? 
      SDL_RenderClear(renderer); 
      SDL_RenderCopy(renderer, txt, NULL, &rct); 
      SDL_RenderCopy(renderer, sbutt, NULL, &startrct); 
      SDL_RenderPresent(renderer); 
     } 
    } 
} 

Кроме того, убедитесь, что вы на самом деле вызова FirstClass::GameStart несильно от main, может быть, вы просто не работает цикл событий вообще.

+0

Большое спасибо, что это работает отлично, но есть что-то отсутствующее, которое «пока (SDL_PollEvent (& evt)! = SDL_QUIT)« Я уже исправил это. – The1Dev

+0

@ The1Dev 'SDL_PollEvent (& evt)! = SDL_QUIT' какой это вздор? Возможно, вам следует прочитать [documentation] (https://wiki.libsdl.org/SDL_PollEvent), особенно раздел «Возвращаемое значение» и пример использования. Ваш «фиксированный» звук больше похож на «сломан». – keltar

Смежные вопросы