在 class 之外使用对象
Using object outside class
我正在尝试使用 SFML 创建一些包含纹理和精灵的 classes。
当我在 class 的 SFML 库中创建 class 的对象时 - 我无法在 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;
}
最好的方法可能是将 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()
。
请注意,除了 main()
之外的任何函数对 return EXIT_FAILURE
都是无意义的;我建议改为抛出异常。
此外,每次绘制菜单时都重新加载菜单,这很愚蠢。我建议将加载移动到 MainMenu 构造函数。
您的 DrawMenu
函数名称是 谎言 。它 不绘制 任何东西。它加载纹理和精灵。
DrawMenu
应该简单地 绘制 菜单精灵:
void DrawMenu(sf::RenderWindow& window) { // window = where to draw the menu
window.draw(spritemenu);
}
现在你在哪里加载spritemenu
?它在 MainMenu
的生命周期内保持不变,因此它自然应该在 MainMenu
:
的 constructor 中实例化
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);
。
我正在尝试使用 SFML 创建一些包含纹理和精灵的 classes。 当我在 class 的 SFML 库中创建 class 的对象时 - 我无法在 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;
}
最好的方法可能是将 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()
。
请注意,除了 main()
之外的任何函数对 return EXIT_FAILURE
都是无意义的;我建议改为抛出异常。
此外,每次绘制菜单时都重新加载菜单,这很愚蠢。我建议将加载移动到 MainMenu 构造函数。
您的 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);
。