Search code examples
c++sdl

SDL window closes after opening


I tried to make a Game State System, I made the window class, and a MainLoop function in my GameState, at first I believed it was because the loop isn't in main, but the same result.

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;
};

And main.cpp where is the loop:

#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;
}

So where is the problem? I'm pretty sure there is a detail that I miss...


Solution

  • I think your message polling loop is wrong. You should poll all the events and only then perform swap, etc. Right now most likely your window is not getting displayed properly because it did not finish processing initialization messages. So you should change it to

    while(SDL_PollEvent(&E))