2016-06-09 2 views
-1

Я следую учебнику по SDL_net и довольно смущен, почему моя программа рушится. Вы можете найти учебное пособие here. Сбой моего клиента после запуска с открытием сервера.SDL_net no opengl context был сделан

Я просто интересно, что это означает ошибка (с использованием SDLNet_GetError()):

no opengl context has been made 

Я просто отработкой ядро ​​SDL с SDL_TTF и понятия не имеют, что это значит. В примере с учебным пособием я использовал OpenGL, поэтому, если бы я предполагал, что ошибка связана с тем, что я не использую его? Я просто предположил, что требуется только SDL.

Если вы хотите, чтобы посмотреть код, вы можете найти client code here и server code here. Я не собираюсь вкладывать все это в этот вопрос, поскольку он довольно длинный, и мне будет хорошо с просто объяснением ошибки, я не хочу просить полное объяснение того, что не так с моим кодом.

Итак, мой код инициализации осуществляется через ScreenManager:

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

Который работает экран, это где сеть работает:

#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

Это поможет, если вы можете указать, какая программа сработает (сервер или клиент?) И на какой строке. –

+0

Это мой клиент, исправленный мой вопрос в редактировании. – genfy

ответ

3

Вы не создаете контекст OpenGL где угодно и звоните SDL_GL_SetSwapInterval(1);, который согласно source устанавливает ошибку No OpenGL context has been made current. И затем в вашем void network::send(Player *p) вы вызываете SDLNet_GetError() без видимой причины и получаете эту ошибку. Я предполагаю, что вы должны позвонить SDL_GL_CreateContext после SDL_CreateWindow.

+0

Я предположил, что это исправит крушение, которое я получаю, я был наивным. Любая идея, что может быть за крушением? Я, конечно, этого не делаю. – genfy

+0

Ну, честно говоря, я стараюсь и помогаю, но на данный момент у меня нет времени посвятить этому. В вашем коде много «новых» вызовов и указателей, и для этого требуется время. Я не хочу звучать невежливо, но почему вы не можете использовать отладчик? Помогла бы хотя бы трассировка стека точки крушения. –

+0

@genfy Я быстро посмотрел на код клиента, который вы опубликовали, и хорошо - вам нужно много переделать его. Извините за критику, но это ужасно - вы используете глобальный 'tmp' (предполагая глобальный, поскольку нет объявления или определения), которое печатается и выполняется с помощью таких странных способов, как' tmp [strlen (tmp-1)] ' (Я называю это странным, потому что вы фактически передадите один байт до начала 'tmp' в' strlen'). Есть слишком много вещей, которые могут пойти не так. –

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