SFML绘图对象在另一个对象之上

时间:2017-12-13 09:59:56

标签: c++ sfml

我正在编写简单的游戏,首先我制作像这样的背景图像(游戏板)

sf::RectangleShape backgroundRec(sf::Vector2f(710, 710));
sf::Texture backgroundTexture;

if (!backgroundTexture.loadFromFile("background.png"))
    std::cout << "Couldnt load image\n";
backgroundRec.setTexture(&backgroundTexture);

然后我得到了骰子,这是以同样的方式创造的

sf::RectangleShape diceOne(sf::Vector2f(70, 70)); 
sf::Texture diceOneTexture;

if (!diceOneTexture.loadFromFile("dice1.png"))
        std::cout << "Couldnt load image\n";
    diceOne.setTexture(&diceOneTexture);

并在while循环中完成

while (mainWindow.isOpen()) {       

        sf::Event evnt;
        while (mainWindow.pollEvent(evnt)) {

            if (evnt.key.code == sf::Keyboard::R) {
                diceSound.play();                           
                mainWindow.draw(diceOne);                           
                mainWindow.display();
            }           
        }                   

        mainWindow.clear();
        mainWindow.draw(backgroundRec);
        mainWindow.display();       

    }
}

而且我不知道如何在backgroundRec之上绘制diceOne ...我试图将绘图背景放在其他地方(在while循环的开始,在它之前,在if循环内)但似乎没有任何效果。当我按下这个R时,这个骰子图像有时会出现短暂的瞬间并消失,我如何使它成为永久性的背景?

1 个答案:

答案 0 :(得分:2)

如果您clear进入窗口,则需要绘制每个框架的骰子。绘制调用应在clear之后和backgroundRec之后进行:

bool drawDice = false;

while(mainWindow.isOpen())
{
    sf::Event evnt;
    while(mainWindow.pollEvent(evnt))
    {
        if(evnt.key.code == sf::Keyboard::R)
        {
            diceSound.play();
            drawDice = true;
        }
    }

    mainWindow.clear();
    mainWindow.draw(backgroundRec);

    if(drawDice)
    {
        mainWindow.draw(diceOne);
    }

    mainWindow.display();
}

为了在按下R后才开始绘制骰子,你可以使用上面的drawDice这样的布尔标志。