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: 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; tab[ i ].SetButton( x, y, dest, adres ); } } Dodam jeszcze metodę SetButton: 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. |
|
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. |
|
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. |
|
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. |
|
DejaVu |
» 2011-10-07 23:27:53 #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. |
|
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. |
|
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). 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? |
|
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: cButton * pButton = new cButton; tab.push_back( * pButton ); tab.back().SetButton( x, y, dest, adres ); Zrobiłem coś takiego, lecz nie pomogło. |
|
1 « 2 » 3 |