在课堂外使用对象

时间:2015-07-10 03:30:12

标签: c++ class sfml

我正在尝试使用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;
}

2 个答案:

答案 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);