C++ 精灵是白色矩形(纹理试图通过引用传递)

C++ 精灵是白色矩形(纹理试图通过引用传递),c++,pointers,reference,pass-by-reference,sfml,C++,Pointers,Reference,Pass By Reference,Sfml,这是参考资料。h: extern sf::Sprite Sprite00; void load_sprite(sf::Sprite &externalSprite, sf::Texture &externalTexture) ; void draw_sprite(sf::RenderWindow &window, sf::Sprite &externalSprite); void setposition_sprite(sf::Sprite &extern

这是参考资料。h:

extern sf::Sprite Sprite00;

void load_sprite(sf::Sprite &externalSprite, sf::Texture &externalTexture) ;
void draw_sprite(sf::RenderWindow &window, sf::Sprite &externalSprite);
void setposition_sprite(sf::Sprite &externalSprite, float x, float y);
这是参考资料。cpp

sf::Sprite Sprite00;


void load_sprite(sf::Sprite &externalSprite, sf::Texture &externalTexture)
{
    externalSprite.setTexture(externalTexture);
}
void draw_sprite(sf::RenderWindow &window, sf::Sprite &externalSprite)
{
    window.draw(externalSprite);
}
void setposition_sprite(sf::Sprite &externalSprite, float x, float y)
{
    externalSprite.setPosition(x, y);
}

void loadResources()
{
    sf::Texture myTexture;
    myTexture.loadFromFile("images/block3d.png");

    load_sprite(Sprite00, myTexture);
}
void Game::render()
{
    window.clear(); 

    setposition_sprite(Sprite00, 100, 100);
    draw_sprite(window, Sprite00);

    window.display();
}
游戏中.cpp

sf::Sprite Sprite00;


void load_sprite(sf::Sprite &externalSprite, sf::Texture &externalTexture)
{
    externalSprite.setTexture(externalTexture);
}
void draw_sprite(sf::RenderWindow &window, sf::Sprite &externalSprite)
{
    window.draw(externalSprite);
}
void setposition_sprite(sf::Sprite &externalSprite, float x, float y)
{
    externalSprite.setPosition(x, y);
}

void loadResources()
{
    sf::Texture myTexture;
    myTexture.loadFromFile("images/block3d.png");

    load_sprite(Sprite00, myTexture);
}
void Game::render()
{
    window.clear(); 

    setposition_sprite(Sprite00, 100, 100);
    draw_sprite(window, Sprite00);

    window.display();
}
显示的精灵为白色矩形,纹理丢失。我不知道怎么修理它。我想我没有正确地传递引用


loadResources在main.cpp中调用。例如,我想在函数game::render()中的game.cpp中显示此Sprite00;。另外,如果我想在另一个cpp中的其他地方显示它,我应该怎么做才能使它正确

sf::Sprite
存储指向给定纹理的指针。但是在
loadResources
函数中,您正在创建一个本地
sf::Texture
对象,并将其应用于您的精灵。当函数返回时,纹理将被破坏,而您的精灵将保持悬空指针。您需要确保纹理的使用寿命至少包括使用精灵的持续时间

请注意,中的
sf::Sprite
类的描述中有一个段落警告您正在执行的操作:

请务必注意,sf::Sprite实例不会复制 它使用的纹理,它只保留对它的引用。因此 当sf::Sprite使用sf::Texture时,不能将其破坏 (即,切勿编写使用本地sf::Texture实例的函数 用于创建精灵)


sf::Sprite
存储指向所赋予纹理的指针。但是在
loadResources
函数中,您正在创建一个本地
sf::Texture
对象,并将其应用于您的精灵。当函数返回时,纹理将被破坏,而您的精灵将保持悬空指针。您需要确保纹理的使用寿命至少包括使用精灵的持续时间

请注意,中的
sf::Sprite
类的描述中有一个段落警告您正在执行的操作:

请务必注意,sf::Sprite实例不会复制 它使用的纹理,它只保留对它的引用。因此 当sf::Sprite使用sf::Texture时,不能将其破坏 (即,切勿编写使用本地sf::Texture实例的函数 用于创建精灵)


“loadResources在main.cpp中被调用”代码,或者它没有发生。更好的方法是,如果构建MVCE没有让你感到呻吟和愚蠢,那么构建一个并发布它。“loadResources在main.cpp代码中被调用,或者它没有发生。更好的办法是,如果构建MVCE不会让你感到呻吟和愚蠢,那么构建一个并发布它。那么,我怎么能在另一个文件中使用这个具有这种纹理的精灵呢?@Sadin97:我不明白你在问什么。请详细说明。基本上我明白你在说什么。我的问题是如何将该纹理传递到另一个文件(例如,如果我在一个文件(resources.cpp/resources.h)中定义了sf::Sprite和sf::texture,并希望在其他文件(例如game.cpp)中使用它)如何正确传递它们?如何在其他文件中使用该局部纹理,如何定义该纹理,应在何处定义该纹理,以及如何在其他地方使用该纹理?我正在尝试创建一个单独的文件来定义和加载纹理/精灵,并创建另一个单独的文件来使用它们。如何?@Sadin97:您已经在使用我定义的精灵了n另一个文件中的一个文件(
Sprite00
,在
resources.h
中声明,并在
resources.cpp
中定义)(
Game::render()
函数在
Game.cpp
中)。因此,您可以使用与使用sprite相同的方式和位置来声明和定义纹理。我不能使用与使用sprite作为外部变量相同的方式来使用纹理,因为:“某些SFML资源不能在全局范围内声明。它们在构造和销毁过程中执行内部操作,这涉及到其他全局变量,由于全局变量的初始化顺序不确定,这些变量可能不可用。“那么,我如何在另一个文件中使用具有此纹理的此精灵?@Sadin97:我不明白你在问什么。请详细说明。基本上我理解你在说什么。我的问题是如何将该纹理传递到另一个文件(例如,如果我在一个文件(resources.cpp/resources.h)中定义sf::sprite和sf::texture)并希望在其他文件中使用它(例如game.cpp)如何正确传递它们?如何在其他文件中使用该局部纹理,如何定义该纹理,应在何处定义该纹理,以及如何在其他地方使用该纹理?我正在尝试创建一个单独的文件来定义和加载纹理/精灵,并创建另一个单独的文件来使用它们。如何?@Sadin97:您已经在使用我定义的精灵了n另一个文件中的一个文件(
Sprite00
,在
resources.h
中声明,并在
resources.cpp
中定义)(
Game::render()
函数在
Game.cpp
中)。因此,您可以使用与使用sprite相同的方式和位置来声明和定义纹理。我不能使用与使用sprite作为外部变量相同的方式来使用纹理,因为:“某些SFML资源无法在全局范围内声明。它们在构造和销毁过程中执行内部操作,这涉及到其他全局变量,由于全局变量的初始化顺序不确定,这些变量可能不可用。”