2015-07-10 2 views
0

Я пытаюсь создать несколько классов, содержащих текстуры & спрайты, использующие SFML. Когда я создаю объект класса в библиотеке SFML в моем классе - я не могу использовать этот объект в основном. Интересно, как отобразить спрайт в основной (например):Использование объекта вне класса

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; 
} 
+1

Помните, что когда DrawMenu заканчивает, локальные переменные выходят за рамки. Может быть, вам нужны переменные-члены класса вместо локальных переменных (поэтому они существуют после завершения DrawMenu)? – drescherjm

+0

да, конечно. как заставить его работать? – Pawel

ответ

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

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.

+0

Обратите внимание, что ваш код не будет компилироваться, потому что вы возвращаете 'int' из функции' void' (я бы исправил его, но не уверен, намеренно ли вы выбрали 'void' возврат, чтобы создать резервную копию вопроса об исключении) – Tas

+0

Первоначально я изменил код, чтобы поддержать два дополнительных комментария. Затем я передумал, но забыл вернуть возвращаемый тип. – celticminstrel