SFML - ruszanie spritem, sekundowe opoznienie

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:

Kopiuj
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 );
        } 
Sopelek
  • Rejestracja:prawie 13 lat
  • Ostatnio:ponad 8 lat
  • Lokalizacja:Kraków
  • Postów:467
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

edytowany 1x, ostatnio: Sopelek
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

Sopelek
  • Rejestracja:prawie 13 lat
  • Ostatnio:ponad 8 lat
  • Lokalizacja:Kraków
  • Postów:467
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ć

edytowany 1x, ostatnio: Sopelek
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:

Kopiuj
while( oknoAplikacji.pollEvent( zdarzenie ) )
        {

}

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

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.