[SFML] Dziwne przeskakiwanie/miganie nakładanych spritów przy pominięciu window.clear.
Ostatnio zmodyfikowano 2017-12-31 11:40
andruplay9 Temat założony przez niniejszego użytkownika |
[SFML] Dziwne przeskakiwanie/miganie nakładanych spritów przy pominięciu window.clear. » 2017-12-31 10:53:35 (Dla wyjaśnienia- okno.clear pominołęm dla zwiększenia wydajności/szybkości kodu(Snake) i zamiast renderować całość renderuję tylko zmiany plus zasłania zbędne białym spritem(sf::srite gumka;))Sprite zamiast zanikać zdaję się migać/przesuwać (trudno stwierdzić). Nie ma możliwości, że kod to powtarza gdyż sf::sprite glowa; też się podwaja. Da się jakoś pozbyć tego błędu czy jest częscią sfml i poszukać innej drogi? Kod (cały lecz nie znam części problemu a praktycznie łącznie 10-20 linijek w różnych miejscach kodu nie jest wymagane by program z błędem zadziałał.): #include <SFML/Graphics.hpp> #include <cmath> #include <SFML/System.hpp> #include <cstdlib> int kolumn = 25, wiersz = 25, gl1 = 64, gl2 = 0, tu1 = 32, tu2 = 0, licznik = 0, dlwez = 3, og1 = 0, og2 = 0, gu1, gu2, sp1 = - 1, sp2 = - 1, losowa, start = 0; int tabkolumn[ 1000 ], tabwiersz[ 1000 ]; char klawisz = 'd'; void klawia() { for(;; ) { if( sf::Keyboard::isKeyPressed( sf::Keyboard::A ) ) { klawisz = 'a'; } if( sf::Keyboard::isKeyPressed( sf::Keyboard::S ) ) { klawisz = 's'; } if( sf::Keyboard::isKeyPressed( sf::Keyboard::W ) ) { klawisz = 'w'; } if( sf::Keyboard::isKeyPressed( sf::Keyboard::D ) ) { klawisz = 'd'; } } } void ruch() { switch( klawisz ) { case 'a': if( gl1 != 0 ) { gl1 -= 32; } else { gl1 = wiersz * 32 - 32; } break; case 'd': if( gl1 != wiersz * 32 - 32 ) gl1 += 32; else { gl1 = 0; } break; case 's': if( gl2 != kolumn * 32 - 32 ) gl2 += 32; else { gl2 = 0; } break; case 'w': if( gl2 != 0 ) gl2 -= 32; else { gl2 = kolumn * 32 - 32; } break; } } void tyl() { tu1 = gl1; tu2 = gl2; licznik++; tabwiersz[ licznik ] = gl1; tabkolumn[ licznik ] = gl2; if(( licznik - dlwez ) >= 1 ) { og1 = tabwiersz[( licznik - dlwez + 1 ) ]; og2 = tabkolumn[( licznik - dlwez + 1 ) ]; } if(( licznik - dlwez ) >= 0 ) { gu1 = tabwiersz[( licznik - dlwez ) ]; gu2 = tabkolumn[( licznik - dlwez ) ]; } } void punkt() { if( gl1 == sp1 || gl2 == sp2 ) { dlwez++; sp1 = - 1; sp2 = - 1; } if( sp1 == - 1 ) { int maxy = wiersz * kolumn - 1; losowa =( rand() % maxy ) + 1; sp1 =( losowa / kolumn ) * 32; sp2 =( losowa % kolumn ) * 32; } }
int main() { sf::RenderWindow okno( sf::VideoMode( 1920, 1024 ), "test", sf::Style::Default ); sf::Clock stoper; okno.setVerticalSyncEnabled( true ); sf::Texture atlas; srand( time( NULL ) ); if( !atlas.loadFromFile( "atlas.bmp" ) ) { } sf::Sprite zakrent; zakrent.setTexture( atlas ); zakrent.setTextureRect( sf::IntRect( 0, 0, 32, 32 ) ); sf::Sprite tuluw; tuluw.setTexture( atlas ); tuluw.setTextureRect( sf::IntRect( 32, 0, 32, 32 ) ); sf::Sprite glowa; glowa.setTexture( atlas ); glowa.setTextureRect( sf::IntRect( 160, 0, 32, 32 ) ); sf::Sprite ogon; ogon.setTexture( atlas ); ogon.setTextureRect( sf::IntRect( 128, 0, 32, 32 ) ); sf::Sprite gumka; gumka.setTexture( atlas ); gumka.setTextureRect( sf::IntRect( 192, 0, 32, 32 ) ); sf::Thread klawiatu( & klawia ); klawiatu.launch(); while( okno.isOpen() ) { sf::Event event; while( okno.pollEvent( event ) ) { if( event.type == sf::Event::Closed ) okno.close(); } tyl(); ruch(); punkt(); sf::RectangleShape tlo( sf::Vector2f( kolumn * 32, wiersz * 32 ) ); tuluw.setPosition( tu1, tu2 ); glowa.setPosition( gl1, gl2 ); ogon.setPosition( og1, og2 ); gumka.setPosition( gu1, gu2 ); zakrent.setPosition( sp1, sp2 ); okno.draw( zakrent ); okno.draw( ogon ); okno.draw( tuluw ); okno.draw( glowa ); okno.draw( gumka ); sf::sleep( sf::seconds( 1 ) ); okno.display(); } return 0; }
|
|
Luq |
» 2017-12-31 11:40:19 SFML jest podwójnie buforowany, więc pomijanie clear będzie dawać dziwne efekty. Po prostu nie pomijaj wywołania tej metody. Dla wyjaśnienia- okno.clear pominołęm dla zwiększenia wydajności/szybkości kodu(Snake) |
Oprócz dziwnych efektów, które opisałeś nie zyskujesz na tym kompletnie nic. Zwłaszcza przy tych kilku sprite'ach, które rysujesz, nie ma różnicy w wydajności. |
|
« 1 » |