如何将SFML纹理用作静态数据成员?

时间:2019-07-10 20:59:36

标签: c++ sfml

我正在使用SFML用c ++编写“太空侵略者”。我的计划是只加载一次子弹的纹理,然后将其用于每个精灵。因此,我开始学习静态数据成员,但是我不知道如何加载纹理。

我尝试在类中声明数据成员,然后在外部加载

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

现在我知道我应该使用= operator,但是我无法加载它。 或者,如果有人知道只加载一次的更好方法,我将不胜感激。

2 个答案:

答案 0 :(得分:0)

在这里忘记std::conjunction和类。您想要的是名称空间:

- std::enable_if_t<((std::is_convertible_v<Args&, B&> && ...)), bool> = true>
+ std::enable_if_t<std::conjunction_v<std::is_convertible<Args&, B&>...>, bool> = true>

是的,它基本上是一个全局变量。通常这是糟糕的设计,但是如果您需要一个可以从任何地方访问的对象,则可能已经正确地使用了名称空间(使用名称空间)。现在,您可以将其加载到外部:

static

因此信息将保存到namespace Lovedek { sf::Texture texture; } 中。现在,当您要将其应用于Lovedek::texture.loadFromFile("bullet_graphics.png",sf::IntRect(0, 0, 2, 10)); 时,请去:

Lovedek::texture

这是非常简单的用法。 “纯静态类”将与通常应如何使用类的想法背道而驰。

答案 1 :(得分:0)

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