2016-06-09 12 views
-1

Ich bin ein Tutorial auf SDL_net und bin ziemlich verwirrt, warum mein Programm abstürzt. Sie können das Tutorial finden here. Mein Client stürzt ab, nachdem es bei geöffnetem Server ausgeführt wurde.SDL_net kein OpenGL-Kontext wurde gemacht

frage ich mich, was gerade diese Fehlermittel (mit SDLNet_GetError()):

no opengl context has been made 

I Kern SDL mit SDL_ttf sind nur abarbeiten und haben keine Ahnung, was das bedeutet. Das Tutorial-Beispiel, dem ich folgte, verwendete OpenGL. Wenn ich also rate, dass der Fehler damit zu tun hat, dass ich ihn nicht verwende? Ich nahm nur an, dass es nur SDL benötigt.

Wenn Sie einen Blick auf den Code möchten, können Sie die client code here finden, und die server code here. Ich werde nicht alles in diese Frage schreiben, da es ziemlich lang ist und mir nur eine einfache Erklärung des Fehlers gut tun würde. Ich möchte nicht nach einer vollständigen Erklärung fragen, was mit meinem Code nicht stimmt.

Okay, so meine Initialisierungscode wird durch einen Screen getan:

#include "ScreenManager.h" 

ScreenManager &ScreenManager::GetInstance(){ 
    static ScreenManager instance; 
    return instance; 
} 

void ScreenManager::init(){ 
    SDL_Init(SDL_INIT_EVERYTHING); 
    TTF_Init(); 
    SDLNet_Init(); 

    window = SDL_CreateWindow("Game", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, 1920, 1080, SDL_WINDOW_BORDERLESS); 
    renderer = SDL_CreateRenderer(window, 0, SDL_RENDERER_ACCELERATED); 

    running = true; 

    ResourceManager::GetInstance().loadTexture(renderer, "res/Human.bmp", "player"); 
    ResourceManager::GetInstance().loadTexture(renderer, "res/space.bmp", "background"); 
    ResourceManager::GetInstance().loadTexture(renderer, "res/ship.bmp", "ship"); 
    ResourceManager::GetInstance().loadTexture(renderer, "res/interior.bmp", "interior"); 

    SDL_GL_SetSwapInterval(1); 

    GameManager::GetInstance().init(); 

    currentScreen = new MainScreen(); 
    currentScreen->init(); 
} 

void ScreenManager::close(){ 
    ResourceManager::GetInstance().close(); 
    currentScreen->close(); 

    SDL_DestroyWindow(window); 
    SDL_DestroyRenderer(renderer); 

    SDL_Quit(); 
    SDLNet_Quit(); 
    TTF_Quit(); 
} 

void ScreenManager::update(){ 
    currentScreen->update(); 
} 

void ScreenManager::render(){ 
    SDL_SetRenderDrawColor(renderer, 0, 0, 0, 0); 
    SDL_RenderClear(renderer); 

    currentScreen->render(renderer); 

    SDL_RenderPresent(renderer); 
} 

void ScreenManager::setScreen(GameScreen *screenToSet){ 
    currentScreen->close(); 
    currentScreen = screenToSet; 
    currentScreen->init(); 
} 

void ScreenManager::handleEvents(){ 
    SDL_Event e; 
    while(SDL_PollEvent(&e) > 0){ 
     switch(e.type){ 
      case SDL_QUIT: 
       running = false; 
      break; 
     } 
    } 
} 

bool ScreenManager::isRunning(){ 
    return running; 
} 

, die einen Bildschirm ausgeführt wird, ist dies, wenn die Netzwerk-Läufe:

#include "MainScreen.h" 

void MainScreen::init(){ 
    Network = new network(); 
    Network->init(); 

    player = new Player((1920/2) - 32, (1080/2) - 32); 
    background = new Background(); 
    entity_vector.push_back(new Ship(30, 30, 699*4, 444*4, 0, "ship", "interior")); 
} 

void MainScreen::close(){ 
    Network->close(); 
    for(unsigned i = 0; i < entity_vector.size(); i++){ 
     entity_vector[i]->close(); 
    } 
    player->close(); 
} 

void MainScreen::update(){ 
    for(unsigned i = 0; i < entity_vector.size(); i++){ 
     entity_vector[i]->update(); 
    } 
    player->update((1920/2) - 32, (1080/2) - 32); 

    GameManager::GetInstance().update(); 
    Network->recv(enemies, player); 
    Network->send(player); 
} 

void MainScreen::render(SDL_Renderer *renderer){ 
    for(unsigned i = 0; i < entity_vector.size(); i++){ 
     entity_vector[i]->render(renderer); 
    } 
    for(unsigned i = 0; i < enemies.size(); i++){ 
     enemies[i]->render(renderer); 
    } 
    background->render(renderer); 
    player->render(renderer); 
} 
+1

Es wäre hilfreich, wenn Sie angeben könnten, welches Programm abstürzt (Server oder Client?) Und in welcher Zeile. –

+0

Es ist mein Client, meine Frage in einer Bearbeitung behoben. – genfy

Antwort

3

Sie keine OpenGL-Kontext erstellen überall und rufen Sie SDL_GL_SetSwapInterval(1);, die nach der source den Fehler auf No OpenGL context has been made current setzt. Und dann in Ihrem void network::send(Player *p) rufen Sie SDLNet_GetError() ohne ersichtlichen Grund und erhalten Sie diesen Fehler. Ich nehme an, Sie sollten SDL_GL_CreateContext nach SDL_CreateWindow anrufen.

+0

Ich nahm an, dass dies den Absturz beheben würde, den ich bekomme, ich war naiv. Irgendeine Idee was könnte hinter dem Unfall sein? Ich jedenfalls nicht. – genfy

+0

Nun, um ehrlich zu sein, versuche ich meistens auszuhelfen, aber im Moment habe ich keine Zeit, mich dem zu widmen. Ihr Code hat viele "neue" Aufrufe und Zeiger und es braucht Zeit. Ich möchte nicht unhöflich klingen, aber warum können Sie keinen Debugger verwenden? Mindestens eine Stapelspur des Punktes des Unfalls würde helfen. –

+0

@genfy Ich habe mir einen kurzen Blick auf den von Ihnen geposteten Client-Code geworfen - und Sie müssen ihn viel nachbearbeiten. Entschuldigung für die Kritik, aber es ist schrecklich - Sie verwenden ein globales 'tmp' (global angenommen, da es keine Deklaration oder Definition gibt), das auf seltsame Weise wie' tmp [strlen (tmp - 1)] 'gedruckt und aufgerufen wird (Ich nenne das komisch, weil Sie tatsächlich ein Byte vor dem Start von 'tmp' nach' strlen' gehen). Es gibt einfach zu viele Dinge, die schief gehen könnten. –