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