在 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);