SFML Błąd przy SetImage klasySprite

0

Klasa Przeszkoda trzyma informacje na temat bloczkow, ktore potem beda wyswietlone na ekranie. Zawiera statyczny obiekt sf::Image by kazdy klocek nie wczytywał własnego obrazka
Program sie kompiluje, ale włączając debugera wyswietla nastepujacy komunikat:

 Child process PID: 3156
Program received signal SIGSEGV, Segmentation fault.
In sf::Sprite::SetImage () (D:\buda\Projekt\Projekt v01\bin\Debug\sfml-graphics.dll)
At D:\buda\Projekt\Projekt v01\Przeszkoda.cpp:22

klasa Przeszkoda:
plik
Przeszkoda.h

 
#ifndef PRZESZKODA_H
#define PRZESZKODA_H
#include <SFML/Graphics.hpp>


class Przeszkoda
{
    static sf::Image kostki;

    sf::Sprite textura;
    public:
        int x,y;
        //Przeszkoda();
        //virtual ~Przeszkoda();
        static void WczytajGrafike(sf::Image i)
        {
            kostki=i;
        }
        void Ustaw(int x, int y, int typ);
        void DrawKostka(sf::RenderWindow * app);
    protected:
    private:
};

#endif // PRZESZKODA_H

plik Przeszkoda.cpp

 #include "include/Przeszkoda.h"
#include <SFML/Graphics.hpp>

sf::Image Przeszkoda::kostki;

void Przeszkoda::Ustaw(int x, int y, int typ)
{
    if(typ==1)
        textura.SetSubRect(sf::IntRect(0,0,16,16));
    this->x=x;
    this->y=y;
    textura.SetImage(kostki);
    textura.SetPosition(x,y);

}
void Przeszkoda::DrawKostka(sf::RenderWindow * app)
{
    app->Draw(textura);
}

W main wczytuje obrazek by potem ustawic statyczny Image:

 
    sf::Image Image;
    if (!Image.LoadFromFile("bloczki.png"))
        return EXIT_FAILURE;

     Przeszkoda::WczytajGrafike(Image);
0

Nie odpowiem ci bezpośrednio na twoje pytanie (chociaż najpewniej gdzieś operujesz na nie swojej pamięci). Chciałem zwrócić jednak uwagę na coś innego, mianowicie dlaczego w metodzie "WczytajGrafike(sf::Image i)" przekazujesz obiekt przez wartość? W zasadzie w tym programie wywołujesz trzy razy konstruktor Image'a (w tym kopiujący) + operator przypisania.

0

To sa polecenia gdzie operuję na pamięci:

    Przeszkoda * sciany;
    sciany=(Przeszkoda *)malloc(sizeof(Przeszkoda));
    int iloscblokow=1;

. .

sf::Image Image;
    if (!Image.LoadFromFile("bloczki.png"))
        return EXIT_FAILURE;


    Przeszkoda::WczytajGrafike(Image);

//pozniej gdy rozczytuje plik to gdy znajde znak ktory odpowiada jakiejs licznie i wywoluje:


if((int)c==49)   //// standardowa sciana  index 1
                {
                    sciany=(Przeszkoda *)realloc(sciany,iloscblokow*sizeof(Przeszkoda) );
                    sciany[iloscblokow-1].Ustaw(x*wielkosc,y*wielkosc,1);//=x*wielkosc;
                    iloscblokow++;
                }
 

Powyższy algorytm działał wcześniej gdy zamiast obiektow operowalem na strukturze ktora miala tylko zmienne x,y i zamiast grafik rysowalem kwadraty

0
EvilMebel napisał(a):
                {
                    sciany=(Przeszkoda *)realloc(sciany,iloscblokow*sizeof(Przeszkoda) );
                    sciany[iloscblokow-1].Ustaw(x*wielkosc,y*wielkosc,1);//=x*wielkosc;
                }
 

ten kod może być błędogenny ponieważ w przypadku niepowodzenia realokacji masz wyciek pamięci gdyż do wskaźnika "sciany" zostanie przypisany NULL i gubisz poprzedni adres do pamięci, której nie możesz już zwolnić oraz zaraz po tym odwołujesz się do wskaźnika, który jest ustawiony na NULL. Nie mówię, że tak jest ale tak może być i na pewno to powinieneś zmienić. Przekazuj również tego Image'a do funkcji przez stałą referencję bo ten obiekt może być duży i niepotrzebnie tworzysz jego kopie.

1 użytkowników online, w tym zalogowanych: 0, gości: 1