我正在使用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,但是我无法加载它。 或者,如果有人知道只加载一次的更好方法,我将不胜感激。
答案 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();