Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[SFML 2.0] Nie wyświetla obiektów

Ostatnio zmodyfikowano 2013-07-12 21:39
Autor Wiadomość
kubawal
Temat założony przez niniejszego użytkownika
[SFML 2.0] Nie wyświetla obiektów
» 2013-07-12 20:58:22
Witam!

Mam grę w której jest wiele obiektów, są przechowywane w wektorze (tak, to ta sama gra co z tematu [C++] [SFML 2.0] Range_error). Jednak problem jest taki, że od samego początku się nie wyświetlają (są tylko wyświetlane takie białe puste kwadraciki o rozmiarach takich samych jak ich tekstury)

Oto kod:

Objects.h:
C/C++
struct Object
{
    Sprite sp;
    Vector2f pos;
   
    //...
   
    Object( string filename, Vector2f p );
   
    void Do();
    void Draw( RenderWindow & win );
   
private:
    Texture tex;
   
};

//...

struct Map
{
    //...
   
    vector < Object > objs;
   
    //...
   
    void Draw( RenderWindow & win );
   
private:
   
    //...
    void Objects();
   
};

Objects.cpp:

C/C++
Object::Object( string filename, Vector2f p )
{
    if( !tex.loadFromFile( graphfile ) )
         error( "Error with loading graph file " + graphfile );
   
    sp.setTexture( tex );
   
    pos = p;
}

void Object::Do()
{
    sp.setPosition( pos );
}

void Object::Draw( RenderWindow & win )
{
    win.draw( sp );
}

//...

void Map::Draw( RenderWindow & win )
{
    //...
   
    // narysuj obiekty
    for( int i = 0; i < objs.size(); i++ )
         objs[ i ].Draw( win );
   
    //...
}

//...

void Map::Objects()
{
    if( objs.size() < MAX_OBJS && randint( 0, 100 ) == 0 )
         objs.push_back( Object( RandObjectFileName(), RandObjectPos() ) ); // jak ktoś chce zobaczyć zawartość tych funkcji niech zerknie do tego tematu:
    // http://cpp0x.pl/forum/temat/?id=11682
   
    for( int i = 0; i < objs.size(); i++ )
    {
        if( objs[ i ].pos.x > w )
             objs.erase( objs.begin() + i );
        else
        {
            objs[ i ].pos.x += speed;
            objs[ i ].Do();
        }
    }
}

Ja tu żadnych błędów nie widzę.

WTF?
P-87679
Monika90
» 2013-07-12 21:22:16
vector kopiuje przechowywane obiekty. Przeczytaj w dokumentacji jak zachowują się obiekty typu Texture, czy Sprite podczas kopiowania.

EDIT:
Prawdopodobnie Sprite przechowuje referencję do tekstury, która po skopiowaniu obiektu do vectora przestaje istnieć. Czyli, musisz napisać konstruktor kopiujący i operator przypisania dla klasy Object. Albo używać wektora wskaźników.
P-87688
kubawal
Temat założony przez niniejszego użytkownika
» 2013-07-12 21:39:28
Ok, najprościej będzie zrobić vectora z Objectami alokowanymi dynamicznie. Wymaga to jedynie małych zmian w istniejącym kodzie i dodania destruktora do klasy Map, który będzie usuwał wszystkie Objecty, jakie zostały w vecotrze.
P-87690
« 1 »
  Strona 1 z 1