Как я могу объявить окно SFML для всех функций моего класса?

#c #class #sfml #variable-declaration

#c #класс #sfml #объявление переменной

Вопрос:

Это может быть вопрос новичка, но я пытаюсь заставить простого игрока перемещаться по 2D-сетке в SFML. Я создаю цикл while для рендеринга происходящего, и я могу заставить его работать, но я хочу использовать классы для сетки и игроков и т.д. Проблема в том, что когда я создаю окно с именем ‘window’, я не знаю, как реализовать классы, поскольку они не знают, что такое ‘window’. Я надеюсь, что я достаточно описал свою проблему, и я хотел бы получить какие-либо ответы о том, как заставить это работать, или если мой метод выполнения этого уже плох и должен быть изменен на другой метод. Вот фрагмент моего кода для класса и ошибка необъявленного окна.

 class myEvents {
public:
    //Variables
    int tSize = 40;
    int tileCount = 20;
    int width = tileCount * tSize;
    int height = tileCount * tSize;

    //Function to create a grid with RectangleShapes
    void grid() {
        for (int i = 0; i < tileCount; i  ) 
        {
            for (int j = 0; j < tileCount; j  ) 
            {
                sf::RectangleShape tile(sf::Vector2f(40, 40));
                tile.setFillColor(sf::Color::Magenta);
                tile.setPosition(i*tSize, j*tSize);
                window.draw(tile); //Problem occurs here, 'window' is not declared, it is in the next function
                                    //window.draw(tile); must execute in the loop to render a full grid
            }
        }
    }

    //Includes while loop for rendering and events. Could be written without class, but I'd still like a class for the grid and later on a player.
    //So I need the window to work with my classes.
    void loop() {
        sf::RenderWindow window(sf::VideoMode(width, height), "Game"); //'window' declared here. Can I move this statement
                                                                        //somewhere so that my funcions know where it comes from?
        while (window.isOpen) {

            sf::Event event;
            while (window.pollEvent(e))
            {
                //to be further developed
            }
        }
    }
};
  

Комментарии:

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

2. Передайте окно своим классам.

Ответ №1:

Попробуйте сделать окно членом класса:

 class myEvents {
public:
    //Variables
    int tSize = 40;
    int tileCount = 20;
    int width = tileCount * tSize;
    int height = tileCount * tSize;
    sf::RenderWindow window{sf::VideoMode(width, height), "Game"};

    void grid() {
        for (int i = 0; i < tileCount; i  ) 
        {
            for (int j = 0; j < tileCount; j  ) 
            {
                sf::RectangleShape tile(sf::Vector2f(40, 40));
                tile.setFillColor(sf::Color::Magenta);
                tile.setPosition(i*tSize, j*tSize);
                window.draw(tile); 
            }
        }
    }

    void loop() {
        while (window.isOpen) {

            sf::Event event;
            while (window.pollEvent(e))
            {
                //to be further developed
            }
        }
    }
};
  

В качестве альтернативы, передайте окно по кругу:

 class myEvents {
public:
    //Variables
    int tSize = 40;
    int tileCount = 20;
    int width = tileCount * tSize;
    int height = tileCount * tSize;

    void grid(sf::RenderWindowamp; window) {
        for (int i = 0; i < tileCount; i  ) 
        {
            for (int j = 0; j < tileCount; j  ) 
            {
                sf::RectangleShape tile(sf::Vector2f(40, 40));
                tile.setFillColor(sf::Color::Magenta);
                tile.setPosition(i*tSize, j*tSize);
                window.draw(tile); 
            }
        }
    }

    void loop() {
        sf::RenderWindow window{sf::VideoMode(width, height), "Game"};

        while (window.isOpen) {

            sf::Event event;
            while (window.pollEvent(e))
            {
                //to be further developed
                // call grid(window)
            }
        }
    }
};
  

Ответ №2:

Что ж, для window вы можете сделать простую вещь — создать класс и добавить в него окно, затем включить .h, где находится класс, как вы установили sf::window в общедоступном разделе. Теперь я покажу вам, как вы можете это использовать

у нас есть файл .h с именем window.h (вы можете назвать его так, как вам удобно)

 #include <SFML/Grpahics.hpp>
class window
{
public:
  sf::RenderWindow window;
}
  

и у вас есть main.cpp (или любой другой файл, который вы хотите)

 #include "window.h"
window w;

int main()
{
  w.window.create(sf::VideoMode(800,600),"Title");
}
  

int main () может быть любой функцией, которую вы хотите, она просто должна быть
вызывается как можно скорее, чтобы окно отображалось.
Я надеюсь, это поможет вам с вашей проблемой =)
[EDID]:
Поскольку «sf::RenderWindow window» является общедоступным, каждый файл, у которого есть заголовок с общедоступным «sf :: RenderWindow window», может использовать окно, поскольку оно не является закрытым. Я думаю, вы это знаете, но в любом случае добавьте его.

Комментарии:

1. Хорошо, спасибо! Это кое-что прояснило для меня, но мне придется протестировать это, когда я вернусь домой к компьютеру. Спасибо!

2. Я надеюсь, это то, что вам нужно =)