我正在尝试使用SFML创建一些包含纹理和精灵的类。 当我在我的类中的SFML库中创建类的对象时 - 我不能在main中使用该对象。 我想知道如何在main(例如)中显示精灵:
class MainMenu
{
public:
int DrawMenu(){
sf::Texture texture;
if (!texture.loadFromFile("idle.png"))
return EXIT_FAILURE;
sf::Sprite spritemenu(texture);
return 0;
}
};
int main()
{
// Create the main window
sf::RenderWindow app(sf::VideoMode(800, 600), "SFML window");
// Load a sprite to display
sf::Texture texture;
if (!texture.loadFromFile("cb.bmp"))
return EXIT_FAILURE;
sf::Sprite sprite(texture);
MainMenu menu;
// Start the game loop
while (app.isOpen())
{
// Process events
sf::Event event;
while (app.pollEvent(event))
{
// Close window : exit
if (event.type == sf::Event::Closed)
app.close();
}
// Clear screen
app.clear();
// Draw the sprite
app.draw(sprite);
menu.DrawMenu();
app.draw(spritemenu);
// Update the window
app.display();
}
return EXIT_SUCCESS;
}
答案 0 :(得分:0)
执行此操作的最佳方法可能是将app
作为参数传递给DrawMenu
,如下所示:
class MainMenu {
public:
int DrawMenu(sf::RenderWindow& app){
sf::Texture texture;
if(!texture.loadFromFile("idle.png"))
return EXIT_FAILURE;
sf::Sprite spritemenu(texture);
app.draw(spritemenu);
return 0;
}
};
然后拨打menu.DrawMenu(app)
而不是menu.DrawMenu()
。
请注意,从EXIT_FAILURE
以外的任何函数返回main()
毫无意义;我建议改为抛出异常。
此外,每次绘制菜单时重新加载菜单都很愚蠢。我建议将加载移动到MainMenu构造函数。
答案 1 :(得分:0)
您的DrawMenu
函数名称撒谎。它不会绘制任何东西。它加载纹理和精灵。
DrawMenu
应该只是绘制菜单精灵:
void DrawMenu(sf::RenderWindow& window) { // window = where to draw the menu
window.draw(spritemenu);
}
现在你在哪里加载spritemenu
?它在MainMenu
的生命周期内保持不变,因此它应该自然地在MainMenu
的构造函数中实例化:
class MainMenu
{
public:
MainMenu() {
if (!texture.loadFromFile("cb.bmp"))
abort(); // or throw exception
spritemenu.setTexture(texture); // "initialize" spritemenu with texture
}
…
private:
sf::Texture texture; // Store these as member data, so they will be
sf::Sprite spritemenu; // kept alive through the lifetime of MainMenu.
};
现在当你MainMenu menu;
时,纹理和精灵将被初始化一次,而不是每次调用绘图函数时都是。
当您需要绘制menu
时,只需拨打menu.DrawMenu(app);
而不是menu.DrawMenu(); app.draw(spritemenu);
。