2017-07-16 2 views
1

J'ai essayé de créer un Game State System, j'ai créé la classe window et une fonction MainLoop dans mon GameState, au début je croyais que c'était parce que la boucle n'était pas en main, mais le même résultat .La fenêtre SDL se ferme après ouverture

Window.cpp:

#include "Window.h" 

using namespace std; 

Window::Window(char* title, int width, int height, Uint32 flags) 
{ 
    if (SDL_Init(SDL_INIT_EVERYTHING)) 
    { 
     cerr << "SDL failed to init: " << SDL_GetError() << endl; 
     throw; 
    } 

    SDL_GL_SetAttribute(SDL_GL_RED_SIZE, 8); 
    SDL_GL_SetAttribute(SDL_GL_GREEN_SIZE, 8); 
    SDL_GL_SetAttribute(SDL_GL_BLUE_SIZE, 8); 
    SDL_GL_SetAttribute(SDL_GL_ALPHA_SIZE, 8); 
    SDL_GL_SetAttribute(SDL_GL_BUFFER_SIZE, 32); 
    SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1); 

    window = SDL_CreateWindow("DirtyCraft", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, width, height, flags); 

    if (window == NULL) 
     throw; 

    context = SDL_GL_CreateContext(window); 


    GLenum error = glewInit(); 
    if (error != GLEW_OK) 
    { 
     cerr << "Glew: " << glewGetErrorString(error) << endl; 
     throw; 
    } 

} 


Window::~Window() 
{ 
    SDL_DestroyWindow(window); 

    SDL_Quit(); 
} 

Window.h:

#pragma once 
#include <iostream> 
#include <SDL.h> 
#define GLEW_STATIC 
#include <GL/glew.h> 

class Window 
{ 
public: 
    Window(char* title, int width, int height, Uint32 flags); 
    ~Window(); 
    SDL_Window *window; 
    SDL_GLContext context; 
}; 

Et main.cpp où est la boucle:

#include <iostream> 
#include <SDL.h> 
#define GLEW_STATIC 
#include <GL/glew.h> 

#include "Window.h" 
#include "MainGame.h" 

using namespace std; 

#define WIDTH 640 
#define HEIGHT 480 

int main(int argc, char* argv[]) 
{ 
    Window window("DirtyCraft", WIDTH, HEIGHT, SDL_WINDOW_OPENGL | SDL_WINDOW_ALLOW_HIGHDPI); 

    //MainGame MainGame(window); 

    //MainGame.MainLoop(); 
    while (true) 
    { 
     SDL_Event E; 
     if (SDL_PollEvent(&E)) 
     { 
      if (E.type == SDL_QUIT); 
       break; 
     } 

     glClear(GL_COLOR_BUFFER_BIT); 
     glClearColor(0.15f, 0.5f, 0.5f, 1.0f); 

     SDL_GL_SwapWindow(window.window); 
    } 

    window.~Window(); 

    return 0; 
} 

Alors w voici le problème? Je suis assez sûr qu'il y a un détail qui me manque ...

+0

Vous ne devriez pas appeler le destructeur 'Window' explicitement, cela se produira automatiquement quand l'objet' window' est détruit quand il sort de sa portée quand 'main' revient. –

+1

En ce qui concerne votre problème, pouvez-vous élaborer un peu dessus? Ça va bien, sans avertissements? Que se passe-t-il lorsque vous exécutez votre programme? Que se passe-t-il si vous parcourez le code dans un débogueur, fait-il tout ce que vous attendez de lui? –

Répondre

3

Je pense que votre message tirant la boucle est faux. Vous devriez tirer tous les événements et ensuite seulement effectuer le swap etc. À l'heure actuelle, il est fort probable que votre fenêtre ne s'affiche pas correctement car elle n'a pas fini de traiter les messages d'initialisation. Donc vous devriez le changer en

while(SDL_PollEvent(&E)) 
+0

Merci! Maintenant j'ai un autre problème, je ne peux pas fermer la fenêtre ... –

+0

Et c'est parce que 'break' ne sortira que de la boucle interne while. Donc vous devriez remplacer la boucle externe par 'while (! Have_to_quit)' et mettre 'must_to_quit' à true dans la boucle interne avant de sortir. – VTT

+0

Aujourd'hui, je suis si stupide, idk pourquoi ... peut-être le manque de sommeil –