Как использовать текстуры SFML в качестве статических элементов данных? - PullRequest
1 голос
/ 10 июля 2019

Я пишу Space Invaders на c ++, используя SFML. Мой план - загрузить текстуру пули только один раз, а затем использовать ее для каждого спрайта. Таким образом, я начал изучать статические элементы данных, но не знаю, как загрузить текстуру.

Я пытался объявить элемент данных внутри класса, а затем загрузить его за пределы

class Lovedek
{
    sf::Sprite sprite;
    static sf::Texture texture;
};

sf::Texture Lovedek::texture.loadFromFile("bullet_graphics.png",sf::IntRect(0, 0, 2, 10));

Он продолжает говорить error: expected initializer before '.' token.

Теперь я знаю, что должен использовать оператор =, но не могу загрузить с этим. Или, если кто-нибудь знает лучший способ загрузки только один раз, я был бы признателен.

Ответы [ 2 ]

0 голосов
/ 11 июля 2019
sf::Texture Lovedek::texture.loadFromFile("bullet_graphics.png",sf::IntRect(0, 0, 2, 10));

Эта строка имеет некоторые синтаксические ошибки сама по себе, но в любом случае она не загружает текстуру в нужном месте.

Сначала вам нужно где-то инициализировать переменную статического класса, обычно в файле cpp для этого класса.

// In your header for Lovedek
class Lovedek
{
    ...
    static sf::Texture texture;    // Declare the static texture
    ...
};

// In your cpp file for Lovedek

sf::Texture Lovedek::texture;   // Initialize the static texture

Тогда подумайте о , когда вы хотите загрузить текстуру, возможно, в начале вашей функции main, или в какой-то функции настройки, верно?

Вы можете либо сделать Lovedek::texture общедоступной и загрузить текстуру вне класса, либо вы можете оставить ее закрытой и реализовать что-то вроде LoadAssets() статического метода для этого.

Для публичного подхода:

// Make Lovedek::texture a public class member

// Then put this somewhere in your game's setup (before starting the game loop)

Lovedek::texture.loadFromFile("bullet_graphics.png", sf::IntRect(0, 0, 2, 10));

Для частного подхода:

// Change your Lovedek class
class Lovedek
{
    static sf::Texture texture;
public:
    static void LoadAssets()
    {
        texture.loadFromFile("bullet_graphics.png", sf::IntRect(0, 0, 2, 10));
    }
}

// Then put this somewhere in your game's setup (before starting the game loop)

Lovedek::LoadAssets();
0 голосов
/ 11 июля 2019

Забудьте о static и занятиях здесь.То, что вам нужно, это пространство имен:

namespace Lovedek
{
    sf::Texture texture;
}

Так что да, это в основном глобальная переменная.Обычно плохой дизайн, но если вам нужен объект, доступный из любого места, вы, возможно, уже сделали это правильно (с пространством имен).Теперь вы можете загрузить это снаружи:

Lovedek::texture.loadFromFile("bullet_graphics.png",sf::IntRect(0, 0, 2, 10));

, чтобы информация сохранялась в Lovedek::texture.Теперь, когда вы хотите применить это к sf::Sprite, просто перейдите:

sf::Sprite sprite;
sprite.setTexture(Lovedek::texture);

Это очень простое использование.«Чистый статический класс» был бы очень против идеи того, как классы вообще должны использоваться.

...