2016-07-25 2 views
0

Ich habe ein DBObject, das media (ein) und mediaTexture (ein sf::Texture) speichert. Das ist meine DBObject::loadMedia() Funktion:Weißes Quadrat in SFML, aber Textur wird geladen

void DBObject::loadMedia() { 
    myStream mediaStream(mediaPath); 
    mediaTexture.loadFromStream(mediaStream); 
    media.setTexture(mediaTexture); 
    mediaInit = true; 
} 

Diese DBObjects in einem std::vector gespeichert sind.

Wenn ich versuche, das Sprite auf das Display zu zeichnen, ist es komplett weiß, und anscheinend ist dies von der Textur außerhalb des Umfangs. Aber ich definiere die Textur im DBObject, also sollte es eine Lebensdauer des Objekts haben ... richtig?

Wenn ich jedoch ein neues Sprite in meiner main() -Funktion mache und newSprite.setTexture(DBObj.mediaTexture) mache, wird es gut angezeigt, so dass die Textur selbst geladen wird, aber etwas passiert mit dem Sprite.

Antwort

1

Dies wird the white square problem genannt.

Grundsätzlich wird Ihr Objekt irgendwann kopiert, aber der Kopierkonstruktor aktualisiert die kopierte Sprite-Textur nicht, um die kopierte Textur zu verwenden, und die ursprüngliche Textur wird zerstört, sodass das kopierte Sprite keine gültige Textur mehr hat . Dies kann zum Beispiel passieren, wenn Ihr std::vector mehr Speicher reservieren und Dinge verschieben/kopieren muss.

+0

Was kann ich tun, um es zu ändern? Einfach das Sprite mit der Textur ständig aktualisieren? – TheAbelo2

+0

Nein, nur beim Kopieren mit einem benutzerdefinierten Kopierkonstruktor. – Hiura

+0

Danke, ich habe eine benutzerdefinierte Kopie hinzugefügt und jetzt funktioniert es gut. :) – TheAbelo2

Verwandte Themen