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

[SFML] Problem z wyświetlaniem sprite'a.

Ostatnio zmodyfikowano 2011-10-08 15:49
Autor Wiadomość
blojayble
Temat założony przez niniejszego użytkownika
» 2011-10-07 21:54:22
Otworzyłem temat, gdyż mam teraz jeszcze jeden problem z tym związany.


Otóż, zmieniłem nieco metodę AddButton:

C/C++
void cMenu::AddButton( short x, short y, Mode dest, const std::string & adres )
{
   
   
    if( dest == GameMode )
    {
        tab.push_back( cButton() );
        int i = tab.size() - 1;
        // można by oczywiście użyć .Back(), niestety, skutek ten sam
        tab[ i ].SetButton( x, y, dest, adres );
       
    }
}

Dodam jeszcze metodę SetButton:

C/C++
void cButton::SetButton( short x, short y, Mode dest, const std::string & adres )
{
   
    i_gfx.LoadFromFile( adres );
    gfx.SetImage( i_gfx );
    gfx.SetPosition( x, y );
   
    ButtonDest = dest;
   
}


Problem leży w tym, że gdy za pomocą AddButton dodam np. 4 obiekty, to poprawnie będzie się rysował tylko dodany jako ostatni. Natomiast cała reszta to puste pola. Jak można inaczej zrealizować funkcję AddButton, tak, aby wszystkie były poprawnie tworzone?

EDIT: Wiem, że sam powinienem do tego dojść, ale próbowałem wszelakich rzeczy, wciąż szukam i na nic nie mogę wpaść. Podrzućcie chociaż jakiś pomysł/co robię źle.
P-41821
DejaVu
» 2011-10-07 22:05:44
@up: powalcz trochę z tematem samodzielnie... jak coś nie działa to z pewnością coś źle robisz - być może niekoniecznie już w tej części kodu ale w innej.
P-41822
blojayble
Temat założony przez niniejszego użytkownika
» 2011-10-07 22:13:19
Trochę kombinowałem i zauważyłem jedną rzecz.


Na początku dodaję tylko jeden przycisk. Oczywiście działa bardzo dobrze. Po wciśnięciu na ten przycisk sprawiłem, że inicjuję drugi. Wynik: O ile na początku przycisk działał normalnie, to po pojawieniu się nowego przycisku ten pierwszy zamienił się w puste pole.
P-41823
Elaine
» 2011-10-07 23:00:43
SFML jest używany przez dosyć dużo osób, gdyby tam miał być jakiś tak oczywisty błąd, to już dawno byłoby o nim wiadomo.
P-41824
DejaVu
» 2011-10-07 23:27:53
C/C++
#include <SFML/Graphics.hpp>

int main()
{
    sf::RenderWindow oknoAplikacji( sf::VideoMode( 800, 600, 32 ), "Kurs SFML - http://cpp0x.pl" );
    sf::Image obrazek;
    {
        sf::Image y;
        y.LoadFromFile( "data/the.png" );
        obrazek = y;
    }
   
    sf::Sprite naszSprajt;
    naszSprajt.SetImage( obrazek );
    naszSprajt.SetPosition( 400, 300 );
    naszSprajt.SetScale( 5, 5 );
   
    while( oknoAplikacji.IsOpened() )
    {
        sf::Event zdarzenie;
        while( oknoAplikacji.GetEvent( zdarzenie ) )
        {
            if( zdarzenie.Type == sf::Event::Closed )
                 oknoAplikacji.Close();
           
        }
       
        const sf::Input & sterowanie = oknoAplikacji.GetInput();
        if( sterowanie.IsKeyDown( sf::Key::Left ) )
             naszSprajt.Move( - 0.2, 0 );
       
        if( sterowanie.IsKeyDown( sf::Key::Right ) )
             naszSprajt.Move( + 0.2, 0 );
       
        if( sterowanie.IsKeyDown( sf::Key::Up ) )
             naszSprajt.Move( 0, - 0.2 );
       
        if( sterowanie.IsKeyDown( sf::Key::Down ) )
             naszSprajt.Move( 0, + 0.2 );
       
        oknoAplikacji.Clear( sf::Color( 255, 0, 0 ) );
        oknoAplikacji.Draw( naszSprajt );
        oknoAplikacji.Display();
    }
    return 0;
}
Wniosek: problemem nie jest sf::Image tylko prawdopodobnie sposób użycia sf::Sprite jak to Iname zasugerował, aczkolwiek nie wskazał miejsca.
P-41825
blojayble
Temat założony przez niniejszego użytkownika
» 2011-10-08 00:11:40
Wydaje mi się, że jak na razie najlepszym rozwiązaniem będzie kombinowanie z AddButton. Jawi się pytanie: dlaczego przycisk przestał poprawnie działać po dodaniu kolejnego? Przecież dane są zapisane w wektorze, wprowadzone są poprawnie, bo przecież działa, więc co się dzieje podczas dodawania kolejnego? Nieświadomie coś psuję?

Wciąż próbuję, ale nie mam rozwiązania.
P-41826
akwes
» 2011-10-08 09:06:58
Widocznie coś jest gdzieś usuwane z automatu. Ja bym na Twoim miejscu spróbował przepisać to dodawanie na dynamiczną alokację i wskaźniki. Wtedy masz pewność co do życia obiektów, w tym momencie lepiej będzie jak będziesz miał memory leak ale żeby działało (który powinien i tak posprzątać system). 

C/C++
tab.push_back( cButton( x, y, dest, adres ) );

Warto się zastanowić, bo poza konstruktorem kopiującym sf::Image, zdaje się że działa tutaj też konstruktor kopiujący cButton wygenerowany przez kompilator?
P-41833
blojayble
Temat założony przez niniejszego użytkownika
» 2011-10-08 13:06:41
Da się to zrealizować w miarę prosto, czy muszę używać jakichś "sprytnych" wskaźników, oraz specjalnych metod?

/EDIT:

C/C++
cButton * pButton = new cButton;
tab.push_back( * pButton );
tab.back().SetButton( x, y, dest, adres );


Zrobiłem coś takiego, lecz nie pomogło.
P-41842
1 « 2 » 3
Poprzednia strona Strona 2 z 3 Następna strona