SFML splash logo window透明

时间:2018-01-11 18:10:57

标签: c++ sfml

SFML只允许创建一个矩形(方形)形状的窗口,所有其他操作都在其中完成。我正在制作一个大富翁游戏,当用户点击可执行文件时,我基本上希望Monopoly Logo在屏幕上闪烁,并且它不必在任何窗口内(只有带透明背景的徽标)。徽标后,矩形窗口然后出现。有没有办法做到这一点?

1 个答案:

答案 0 :(得分:3)

SFML没有任何集成功能可以使窗口背景透明。

为了实现这一目标,您应该使用一些OS specific functions。但这也行不通。如果您将窗口属性更改为具有透明窗口,则SFML将正确呈现,但您将看不到任何内容,因为背景和前景的所有内容都将是透明的。

那么解决方案是什么?最简单的方法是没有任何背景,使您的徽标完全适合您的窗口。然后,您只需要使用sf::Style::None删除标题栏和边框。

这就是我达到这个目标的方式:

int main()
{
    // First, I load the logo and create an sprite
    sf::Texture logo;

    if (!logo.loadFromFile("monopoly.png")){
        exit(1);
    }

    sf::Sprite sp;
    sp.setTexture(logo);
    sp.scale(0.2, 0.2); // My logo is quite big in fact (1st google result btw)

    int logoWidth = sp.getGlobalBounds().width;
    int logoHeight = sp.getGlobalBounds().height;

    // With the logo loaded, I know its size, so i create the window accordingly
    sf::RenderWindow window(sf::VideoMode(logoWidth, logoHeight), "SFML", sf::Style::None); // <- Important!! Style=None removes title

    // To close splash window by timeout, I just suppose you want something like this, don't you?
    sf::Clock timer;
    sf::Time time = timer.restart();

    while (window.isOpen()){
        sf::Event event;
        while (window.pollEvent(event)){
            // event loop is always needed
        }
        // Window closed by time
        time += timer.restart();
        if (time >= sf::seconds(2.f)){
            window.close();
        }

        window.clear();
        window.draw(sp);
        window.display();
    }

    // Then, reuse the window and do things again
    window.create(sf::VideoMode(600, 400), "SFML");

    while (window.isOpen()){
        sf::Event event;
        while (window.pollEvent(event)){

        }

        window.clear();
        window.draw(sp);
        window.display();
    }

    return 0;
}

请注意,只需使用create方法重新创建,即可重新使用窗口。

结果:

enter image description here

然后是其他窗口:

enter image description here