Почему окно SFML не отображается, когда окно находится в классе? - PullRequest
0 голосов
/ 20 января 2019

Я пытаюсь создать класс Screen для SFML, однако по какой-то причине приложение работает при использовании примера Xcode, но как только я помещаю окно в его собственный класс, оно не работает. Почему это так и как мне это исправить?

Вот мой код (адаптированный из примера):

Edit:

После прочтения комментариев я изменился на следующий код. Это все еще не показывает экран, и программа все еще закрывается.

#include <SFML/Audio.hpp>
#include <SFML/Graphics.hpp>
#include "ResourcePath.hpp"

class Screen{
public:
  sf::RenderWindow window;
  Screen(){
    sf::RenderWindow window(sf::VideoMode(800, 600), "SFML window");
  }
};


int main(int, char const**)
{


  Screen* screen = new Screen();
  // Set the Icon
  sf::Image icon;
  if (!icon.loadFromFile(resourcePath() + "icon.png")) {
    return EXIT_FAILURE;
  }
  screen->window.setIcon(icon.getSize().x, icon.getSize().y, icon.getPixelsPtr());

  // Load a sprite to display
  sf::Texture texture;
  if (!texture.loadFromFile(resourcePath() + "cute_image.jpg")) {
    return EXIT_FAILURE;
  }
  sf::Sprite sprite(texture);

  // Create a graphical text to display
  sf::Font font;
  if (!font.loadFromFile(resourcePath() + "sansation.ttf")) {
    return EXIT_FAILURE;
  }
  sf::Text text("Hello SFML", font, 50);
  text.setFillColor(sf::Color::Black);

  // Load a music to play
  sf::Music music;
  if (!music.openFromFile(resourcePath() + "nice_music.ogg")) {
    return EXIT_FAILURE;
  }

  // Play the music
  music.play();

  // Start the game loop
  while (screen->window.isOpen())
  {
    // Process events
    sf::Event event;
    while (screen->window.pollEvent(event))
    {
      // Close window: exit
      if (event.type == sf::Event::Closed) {
        screen->window.close();
      }

      // Escape pressed: exit
      if (event.type == sf::Event::KeyPressed && event.key.code == sf::Keyboard::Escape) {
        screen->window.close();
      }
    }

    // Clear screen
    screen->window.clear();

    // Draw the sprite
    screen->window.draw(sprite);

    // Draw the string
    screen->window.draw(text);

    // Update the window
    screen->window.display();
  }

  return EXIT_SUCCESS;
}

Ответы [ 2 ]

0 голосов
/ 21 января 2019

В вашем конструкторе есть логическая ошибка. Как вы его создали, вы оставляете Screen::window неинициализированным и создаете другой объект RenderWindow, который становится недоступным, как только выполнение покидает конструктор.

Вместо этого вы должны сделать

class Screen{
public:
  sf::RenderWindow window;
  Screen():
  window(sf::VideoMode(800, 600), "SFML window") {}
};

Все остальное должно работать как положено, если только у него нет других ошибок. Если вам интересно, какой синтаксис я использовал, вы можете посетить эту ссылку .

0 голосов
/ 21 января 2019

Трудно сказать. Может быть, вы обращаетесь к адресу памяти, который не является частью вашей программы? Попробуйте использовать уникальные указатели и make_unique, чтобы определить некоторые из ваших указателей.

Например:

std::unique_ptr<sf::RenderWindow> window;

window = std::make_unique<sf::RenderWindow>(sf::VideoMode(WIDTH, HEIGHT), "PushBlox",sf::Style::Default);

Я уже делал проект с использованием sfml, так что не стесняйтесь проверить мой код здесь -> https://github.com/FromAlaska/ComputerScience/tree/2017/Projects/Frontier

...