2016-06-09 94 views
-1

我正在关注SDL_net上的教程,对于我的程序崩溃的原因感到十分困惑。你可以找到教程here.我的客户端在服务器打开的情况下运行后崩溃。SDL_net没有opengl上下文

我只是想知道这是什么错误的手段(使用SDLNet_GetError()):我只是工作

no opengl context has been made 

关闭核心SDL与SDL_TTF,而且不知道这意味着什么。我遵循的教程示例使用了OpenGL,因此如果我猜测错误是因为我没有使用它而造成的?我只是假定它只需要SDL。

如果你想看看代码,你可以找到client code here,和server code here。我不打算把这个问题放在这个问题上,因为它很长,我只需简单地解释一下错误就可以了,我不想要求我的代码有什么问题的完整解释。

好了,所以我的初始化代码通过屏幕管理做到:

#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

如果您能指出哪个程序崩溃(服务器或客户端?)以及哪条线路,这将有所帮助。 – 2016-06-09 20:23:52

+0

这是我的客户,修改了我的问题。 – genfy

回答

3

你不是在创造OpenGL上下文并根据source调用SDL_GL_SetSwapInterval(1);将错误设置为No OpenGL context has been made current。然后在您的void network::send(Player *p)中,您没有明显的原因致电SDLNet_GetError(),并获得该错误。我想你应该在SDL_CreateWindow之后致电SDL_GL_CreateContext

+0

我认为这会解决我得到的崩溃,我太天真了。任何想法可能是在碰撞后面?我当然不会。 – genfy

+0

好吧,说实话,我主要是尝试和帮忙,但目前我没有时间去做这件事。你的代码有很多'new'调用和指针,看着它需要时间。我不想听起来不礼貌,但为什么你不能使用调试器?至少有一个崩溃点的堆栈轨迹会有所帮助。 –

+0

@genfy我快速浏览了你发布的客户代码 - 你需要重新修改它。对于批评抱歉,但它是可怕的 - 你正在使用'tmp [strlen(tmp - 1)]''这样的奇怪方式打印并访问全局'tmp'(假定是全局的,因为没有声明或定义) (我打电话这很奇怪,因为你实际上会在'tmp'开始之前传递一个字节到'strlen')。有太多事情可能会出错。 –