SFML - Sprite wird nicht angezeigt bzw. ist nur weiß!
-
[SFML - 2.1]
Ich hab das Problem dass ich eine sprite habe, der aber entweder garnicht angezeigt wird oder nur ein weißes rechteck ... das Rechteck hat aber immer die größe des Bildes ...
Vielleicht liegt es daran dass ich es sehr verschachtelt habe aber dass ist einigermaßen nötig da ich das projekt sehr strukturiert und übersichtlich halten will ...
Ich hab mir eine Window klasse vom RenderWindow abgeleitet habe und diese klasse hat eine list von Playern(Klasse die intern die sprites und animationen regelt usw) und das hinzufügen und entfernen geht mit methoden die es dann intern machen ... vielleicht ist einfach in der ganzen verschachtelung irgendwo mal eine Referenz oder so verloren geganen ...
Könnt ihr mir helfen ?
(Soll ich den Code Posten ?)
-
Dieser Thread wurde von Moderator/in SeppJ aus dem Forum C++ (auch C++0x und C++11) in das Forum Spiele-/Grafikprogrammierung verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.
-
http://www.sfml-dev.org/tutorials/2.0/graphics-sprite.php schrieb:
The white square problem
You successfully loaded a texture, correctly defined a sprite, and... all you see on screen now is a white square. What happened?
This is a common mistake. When you set the texture of a sprite, all it does internally is to keep a pointer to the texture instance. Therefore, if the texture is destroyed or moves elsewhere in memory, the sprite ends up with an invalid texture pointer.
This problem occurs when you write this kind of function:
sf::Sprite loadSprite(std::string filename) { sf::Texture texture; texture.loadFromFile(filename); return sf::Sprite(texture); } // error: the texture is destroyed here
You must correctly manage the lifetime of your textures, so that they live as long as they are used by sprites.
-
thanks , i'll try it
-
Sumec99 schrieb:
[SFML - 2.1]
Ich hab das Problem dass ich eine sprite habe, der aber entweder garnicht angezeigt wird oder nur ein weißes rechteck
(Soll ich den Code Posten ?)wurde die Textur richtig geladen? Weiße Sprites werden bei mir nur gezeichnet wenn die Texture (z.B. aufgrund einer falschen Pfad-Angabe) nicht richtig geladen wird. Und wenn ein Sprite mit richtig geladener Textur gar nicht gezeichnet wird liegt es vielleicht daran, dass die Position im nicht sichtbaren Bereich liegt oder man vergessen hat dem RenderWindow mitzuteilen den Sprite zu zeichnen. Sind übliche Fehlerquellen
-
ne , /root/ hatte recht , wenn ich die Textur so deklariert hab :
Texture* tex = new Texture;
aber nie delete tex schreibe dann funktioniert alles perfekt
-
Sumec99 schrieb:
aber nie delete tex schreibe dann funktioniert alles perfekt
Nix funktioniert perfekt, du hast ein Memory Leak!
-
Der speicher wird doch bei programmende wieder freigegeben ??
und zur not kann man das ja auch noch im destruktor erdigt
-
Du hast überhaupt nicht verstanden was das Beispiel dir sagen wollte. Seufz.
-
Sumec99 schrieb:
Der speicher wird doch bei programmende wieder freigegeben ??
und zur not kann man das ja auch noch im destruktor erdigtDer Destruktor wird nie aufgerufen!
Ja, es stimmt schon das das OS mit new angeforderten Speicher wieder zurückgibt, aber der Destruktor von Texture wird trotzdem nicht aufgerufen.
-
Sumec99 schrieb:
Der speicher wird doch bei programmende wieder freigegeben ??
und zur not kann man das ja auch noch im destruktor erdigtAngeforderten Speicher sollte man, sobald man ihn nicht mehr benötigt, immer freigeben. Wenn man diese Regel missachtet kommt es zu Memory-Leaks. Bei kleinen Projekten vielleicht kein Problem, aber wenn es mal größer wird, bekommt man eine Reihe Probleme. Daher sollte uu jedem "new" Befehl auch das entsprechende "delete" irgendwo stehen. Die Ausnahme ist bei shared/unique-Pointern, die kümmern sich selbst um die Deallocation des angeforderten Speichers, sobald ihr Gültigkeitsbereich verlassen wird.
-
Tschuldigung , da habe ich zu wenig info gegeben ich meinte den destruktor
der klasse (animierter sprite) die die textur beinhaltet
sorry
-
"It is important to note that the sf::Sprite instance doesn't copy the texture that it uses, it only keeps a reference to it. Thus, a sf::Texture must not be destroyed while it is used by a sf::Sprite (i.e. never write a function that uses a local sf::Texture instance for creating a sprite)."
mfg
HarteWare