2017-07-16 16 views
1

私はGame State Systemを作ろうとしましたが、ウィンドウクラスを作って、私のGameStateでMainLoop関数を作っていましたが、最初はループがメインにないので、 。SDLウィンドウが開いた後に閉じます

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

そしてmain.cppにループです:ワットだから、

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

ここに問題がありますか?私は、私が間違っている詳細があると確信しています...

+0

あなたは明示的に 'Window'デストラクタを呼び出すべきではありません、それを変更する必要があります。 –

+1

あなたの問題については、少し詳しく教えてもらえますか?警告なく大丈夫ですか?プログラムを実行するとどうなりますか?デバッガでコードをステップ実行すれば、それはあなたが期待することすべてをしますか? –

答えて

3

あなたのメッセージがループを引っ張って間違っていると思います。すべてのイベントをプルしてスワップなどを実行する必要があります。ウィンドウが正しく表示されない可能性が最も高いのは、初期化メッセージの処理が完了していないためです。だから、あなたはそれが `main`リターンとしてスコープ外に出るとき` window`オブジェクトが破壊されたときに自動的に行われます

while(SDL_PollEvent(&E)) 
+0

ありがとう!今私は別の問題がある、私はウィンドウを閉じることができません... –

+0

これは 'break'が内部 'while'ループから壊れるためです。だから、外ループを 'while(!has_to_quit)'に置き換え、中ループの中で 'have_to_quit'を真に設定してから外してください。 – VTT

+0

今日私はとても愚かです、idkなぜ...おそらく睡眠不足 –

関連する問題