SFML - Sprite wird nicht angezeigt bzw. ist nur weiß!



  • 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 erdigt

    Der 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 erdigt

    Angeforderten 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


Anmelden zum Antworten