SFML - ruszanie spritem, sekundowe opoznienie

0

Witam, mam problem z SFML. Dopiero zaczynam swoją przygodę z tą biblioteką i mój problem wygląda tak, że jak chcę poruszyć spritem to po nacisnięciu strzalki sam wygląd Sprite'a zmienia się lecz ruch następuje dopiero po upływie ok. pół sekundy do sekundy. I wtedy już normalnie ruch wygląda bez przycięć.
Kod:

if(sf::Keyboard::isKeyPressed(sf::Keyboard::Left)){
            ruch+=0.1;
            samolot.move( -(ruch), 0 );
            przechyl--;
            if(przechyl<0&&przechyl>-20)
                {
                samolotSprite.loadFromFile( "l1.png" );
                }
                if(przechyl<-20&&przechyl>-37)
                {
                samolotSprite.loadFromFile( "l2.png" );
                }
                if(przechyl<-37&&przechyl>-50)
                {
                samolotSprite.loadFromFile( "l3.png" );
                }
                if(przechyl<-50&&przechyl>-62)
                {
                samolotSprite.loadFromFile( "l4.png" );
                }
                if(przechyl<-63&&przechyl>-72)
                {
                samolotSprite.loadFromFile( "l5.png" );
                }
                if(przechyl<-80)
                {
                samolotSprite.loadFromFile( "l6.png" );
                }
                samolot.setTexture( samolotSprite );

        }

        if(zdarzenie.type == sf::Event::KeyReleased && zdarzenie.key.code == sf::Keyboard::Left)
        {
            ruch=2.0;
            przechyl=0;
            samolotSprite.loadFromFile( "top.png" );
            samolot.setTexture( samolotSprite );
        } 
0

Dlaczego za każdym razem wczytujesz na nowo obrazek z pliku?
Problem z ruchem może być dlatego, że pozycja jest przechowywana w zmiennej typu int i przy pierwszych kilku ruchach prędkość jest za mała, aby zwiększyć pozycje. Tzn. 123+0.1f = 123

0

nie nie, problemem nie jest int. Jest float poprawnie ustawione. poza tym gdyby było int bądz int=1 (a nie int=1.0) to caly czas ta zmienna wynosiła by 1(0.1 za kazdym razem by się traciło). Ale tu akurat poprawnie działa.
Ładuje na nowo obrazek ponieważ im dłużej uzytkownik bedzie miał wcisnięty klawisz to samolot bardziej sie przechyli. Ale to nie tu lezy problem, poniewaz jak juz sie rozpedzi troche i nastpuje podmiana sprite'a to nie ma zadnego przyciecia, potem nastepna zmiana sprite'a i takze nie ma przyciecia. Moze nie jest to "ekonomiczne", ale to nie tu lezy problem. Tylko w momencie ruszania z miejsca - naciskam klawisz i zanim obiekt się ruszy to mija około sekundy

0

A jak przechowujesz pozycję samolotu?
Jeśli chodzi o ciągłe ładowanie tych obrazków z dysku to jest to na prawdę zła praktyka. Powinieneś mieć tablicę tych spritów i z niej wybierać.

Jeszcze powiedz, czy po puszczeniu klawisza też trzeba trochę poczekać

0

nie, po puszczeniu klawisza wszystko jest w porządku.

Na pozycję samolotu nie robiłem specjalnie zmiennej. Po prostu : http://sfml-dev.org/documentation/2.0/classsf_1_1Transformable.php#a6a0552d8cf155b7df25f6ceda8ee45a5
samolot jako obiekt typu sprite obsluguje takie metody jak getPosition, move, setPosition.

0

Ok, znalazłem rozwiązanie. W sumie dopiero na angielskim forum wyczytałem, że gdy potrzeba szybkiej reakcji to nie powinno sie obslugiwac ruchow przez
pollEvent.
A ja miałem tą obsługę zawartą w pętli:

while( oknoAplikacji.pollEvent( zdarzenie ) )
        {

}

Po przeniesieniu poza pętlę, wszystko ładnie działa

1 użytkowników online, w tym zalogowanych: 0, gości: 1