2017-09-17 3 views
0

Dies ist resources.h:sf :: Sprite ist weiß rechteckig (Textur, die durch Verweis übergeben versuchen)

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

Dies ist resources.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); 
} 

In game.cpp:

void Game::render() 
{ 
    window.clear(); 

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

    window.display(); 
} 

Das Sprite, das angezeigt wird, ist weiß, die Textur ist verloren. Ich weiß nicht, wie ich es beheben soll. Ich denke nicht, dass ich die Referenz richtig passiere.

loadResources wird in main.cpp aufgerufen. Ich möchte diesen Sprite00 zum Beispiel in game.cpp in der Funktion Game :: render(); anzeigen. Auch wenn ich es woanders in einer anderen cpp anzeigen möchte, was soll ich tun, um es richtig zu machen?

+0

"loadResources wird in main.cpp" Code aufgerufen oder es ist nicht geschehen. Besser, konstruiere ein [mcve] und poste es, wenn das Konstruieren des MVCE dich nicht stöhnen ließ und sich dumm anfühlte. – user4581301

Antwort

2

speichert einen Zeiger auf die Textur, die Sie ihm geben. Aber in Ihrer loadResources Funktion erstellen Sie ein lokales sf::Texture Objekt und wenden das auf Ihr Sprite an. Wenn die Funktion zurückkehrt, wird die Textur zerstört, und Ihr Sprite bleibt mit einem ungeordneten Zeiger zurück. Sie müssen sicherstellen, dass die Lebensdauer der Textur mindestens die Dauer der Verwendung des Sprites umfasst.

Beachten Sie, dass die Beschreibung für die sf::Sprite Klasse in the documentation hat einen Absatz Warnung vor genau, was Sie tun:

Es ist wichtig, dass die sf :: Sprite-Instanz zu beachten, nicht kopieren Sie die Textur dass es verwendet wird, es enthält nur einen Verweis darauf. Daher darf eine sf :: Texture nicht zerstört werden, während sie von einem sf :: Sprite verwendet wird (d. H. Niemals eine Funktion schreiben, die eine lokale sf :: Texture Instanz zum Erstellen eines Sprites verwendet).

+0

Also, wie kann ich dieses Sprite mit dieser Textur in einer anderen Datei verwenden? – Sadin97

+0

@ Sadin97: Ich verstehe nicht, was Sie fragen. Bitte erläutern. –

+0

Grundsätzlich verstehe ich, wovon du redest. Meine Frage ist, wie kann ich diese Textur an eine andere Datei übergeben (zum Beispiel, wenn ich sf :: Sprite und sf :: Texture in einer Datei (resources.cpp/resources.h) definiere und sie in einer anderen Datei verwenden möchte (zum Beispiel game.cpp) wie kann ich diese korrekt übergeben? Wie kann ich diese lokale Textur in einer anderen Datei verwenden? Wie soll ich diese Textur definieren? An welcher Stelle soll ich sie definieren und wo anders? Ich versuche, sie getrennt zu machen Datei für das Definieren und Laden von Texturen/Sprites und eine andere separate Datei, um sie zu verwenden .. Wie? – Sadin97

Verwandte Themen