Я следую учебному пособию по SDL_net и совершенно не понимаю, почему моя программа дает сбой. Вы можете найти учебник Вот. Мой клиент падает после запуска с открытым сервером.
Мне просто интересно, что означает эта ошибка (с помощью SDLNet_GetError ()):
no opengl context has been made
Я просто работаю над ядром SDL с SDL_TTF и понятия не имею, что это значит. В учебном примере, которому я следовал, использовался OpenGL, так что если я угадаю, ошибка в том, что я его не использую? Я просто предположил, что требуется только SDL.
Если вы хотите посмотреть на код, вы можете найти код клиента здесь, и код сервера здесь. Я не собираюсь помещать все это в этот вопрос, так как он довольно длинный, и я буду в порядке с простым объяснением ошибки, я не хочу просить полное объяснение того, что не так с моим кодом.
Итак, мой код инициализации выполняется через 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);
}
Вы нигде не создаете контекст OpenGL и не вызываете SDL_GL_SetSwapInterval(1);
который в соответствии с источник устанавливает ошибку в No OpenGL context has been made current
, И тогда в вашем void network::send(Player *p)
ты звонишь SDLNet_GetError()
без видимой причины и получите эту ошибку. Я полагаю, вам следует позвонить SDL_GL_CreateContext после SDL_CreateWindow
,
Других решений пока нет …