Как я могу объявить окно SFML для всех моих функций класса? - PullRequest
2 голосов
/ 08 марта 2019

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

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

Ответы [ 2 ]

1 голос
/ 08 марта 2019

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

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::RenderWindow& 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)
            }
        }
    }
};
0 голосов
/ 09 марта 2019

Хорошо, что вы можете сделать для окна, это создать класс и добавьте в него окно, затем включите .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" является открытым, каждый файл, имеющий заголовок с открытым "окном sf :: RenderWindow", может использовать это окно, поскольку оно не является закрытым. Я думаю, вы это знаете, но в любом случае добавьте его.

...