无法激活窗口的上下文

时间:2017-04-17 21:06:03

标签: c++ multithreading sfml

我为我的学习编写了一个项目,我必须尽可能地使用线程。我在绘制迷宫以及游戏中发生的一切时遇到了问题。我已尝试在线程中执行此操作。

window.setActive(false);
thread drawingThr(&Game::drawingGameElements, &window, iterWall, wallArray, iterPrWall, projWallArray, iterPic, pickupArray, iter, projectileArray, iterEn, enemyArray, iterTex, textDisplayArray, ref(player1), score);    
//window.setActive(true);

这就是我在游戏循环(while(true))中执行此操作的方法。在游戏循环开始时,我用方法清除窗口:

window.clear(sf::Color::Cyan);

我不知道该怎么做,因为Console中的Visual Studio 15只写

  

"无法激活OpenGL上下文:   无法激活窗口的上下文"

(是的,游戏正在编译)。

最后,我向您展示了函数代码,我在线程中使用了它:

  void Game::drawingGameElements(sf::RenderWindow *window, vector<Wall>::const_iterator iterWall, vector<Wall> wallArray, vector<ProjWall>::const_iterator iterPrWall,
    vector<ProjWall> projWallArray, vector<Pickup>::const_iterator iterPic, vector<Pickup> pickupArray, vector<Projectile>::const_iterator iter, vector<Projectile> projectileArray,
    vector<Enemy>::const_iterator iterEn, vector<Enemy> enemyArray, vector<TextDisplay>::const_iterator iterTex, vector<TextDisplay> textDisplayArray, Player &player1, sf::Text score)
{
    //Draw Walls
    int counter = 0;
    for (iterWall = wallArray.begin(); iterWall != wallArray.end(); iterWall++)
    {
        window->draw(wallArray[counter].rect);

        counter++;
    }    

    //Draw Projectile Walls
    counter = 0;
    for (iterPrWall = projWallArray.begin(); iterPrWall != projWallArray.end(); iterPrWall++)
    {
        //projWallArray[counter].update();
        window->draw(projWallArray[counter].rect);
        //window.draw(pickupArray[counter].sprite);

        counter++;
    }    

    //Draw Pickup Items
    counter = 0;
    for (iterPic = pickupArray.begin(); iterPic != pickupArray.end(); iterPic++)
    {
        pickupArray[counter].update();
        window->draw(pickupArray[counter].rect);
        //window.draw(pickupArray[counter].sprite);

        counter++;
    }    

    //Draw projectiles
    counter = 0;
    for (iter = projectileArray.begin(); iter != projectileArray.end(); iter++)
    {
        projectileArray[counter].update();
        //window.draw(projectileArray[counter].rect);
        window->draw(projectileArray[counter].sprite);
        counter++;
    }    

    //Draw Enemies
    counter = 0;
    for (iterEn = enemyArray.begin(); iterEn != enemyArray.end(); iterEn++)
    {
        enemyArray[counter].update();
        enemyArray[counter].updateMovement();
        window->draw(enemyArray[counter].rect);
        //window.draw(enemyArray[counter].sprite);

        counter++;
    }    

    //Draw Text
    counter = 0;
    for (iterTex = textDisplayArray.begin(); iterTex != textDisplayArray.end(); iterTex++)
    {
        textDisplayArray[counter].update();
        window->draw(textDisplayArray[counter].text);

        counter++;
    }    

    //Update score
    score.setString("Score: " + to_string(player1.score));
    window->draw(score);

    //Update player
    player1.text.setString("Hp: " + to_string(player1.hp) + "/" + to_string(player1.maxHp));
    player1.update();
    player1.updateMovement();

    //Update window
    window->draw(player1.text);
    window->draw(player1.rect);
    window->display();
}

感谢您的帮助! :d

0 个答案:

没有答案