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

[SFML] Dziwne przeskakiwanie/miganie nakładanych spritów przy pominięciu window.clear.

Ostatnio zmodyfikowano 2017-12-31 11:40
Autor Wiadomość
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ł.):
C/C++
#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(); }
        //while
        tyl();
        ruch();
        punkt();
        //okno.clear();
        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( tlo);
        okno.draw( ogon );
        okno.draw( tuluw );
        okno.draw( glowa );
        okno.draw( gumka );
        sf::sleep( sf::seconds( 1 ) );
        okno.display();
    } //while
    return 0;
}
P-168272
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.
P-168273
« 1 »
  Strona 1 z 1