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

[SFML] Przemieszczanie obiektu na scenie

Ostatnio zmodyfikowano 2021-01-26 15:29
Autor Wiadomość
Yumox
Temat założony przez niniejszego użytkownika
[SFML] Przemieszczanie obiektu na scenie
» 2021-01-25 16:59:12
Stworzyłem prosty program, w którym steruje się kwadratem za pomocą strzałek. Po wciśnięciu i przytrzymaniu strzałki kwadrat przesuwa się o 5 pikseli w danym kierunku, po czym jest sekunda przerwy i zaczyna się znów poruszać w danym kierunku ale już płynnie. Dlaczego występuje ta ,,przerwa"? Można to jakoś zmienić, aby po wciśnięciu (i przytrzymaniu) od razu następował płynny ruch?
Tutaj mój kod:
C/C++
int main()
{
   
int X = 300, Y = 200;
   
sf::RectangleShape kwadrat( sf::Vector2f( 20, 20 ) );
   
kwadrat.setPosition( X, Y );
   
sf::RenderWindow oknoAplikacji( sf::VideoMode( 800, 600, 32 ), "Kurs SFML 2.0 - http://cpp0x.pl" );
   
while( oknoAplikacji.isOpen() )
   
{
       
sf::Event zdarzenie;
       
while( oknoAplikacji.pollEvent( zdarzenie ) )
       
{
           
if( zdarzenie.type == sf::Event::Closed )
               
 oknoAplikacji.close();
           
           
if( zdarzenie.type == sf::Event::KeyPressed && zdarzenie.key.code == sf::Keyboard::Up )
               
 Y -= 5;
           
           
if( zdarzenie.type == sf::Event::KeyPressed && zdarzenie.key.code == sf::Keyboard::Down )
               
 Y += 5;
           
           
if( zdarzenie.type == sf::Event::KeyPressed && zdarzenie.key.code == sf::Keyboard::Left )
               
 X -= 5;
           
           
if( zdarzenie.type == sf::Event::KeyPressed && zdarzenie.key.code == sf::Keyboard::Right )
               
 X += 5;
           
       
}
       
oknoAplikacji.clear( sf::Color::Black );
       
kwadrat.setPosition( X, Y );
       
oknoAplikacji.draw( kwadrat );
       
oknoAplikacji.display();
   
}
   
return 0;
}
P-178012
pekfos
» 2021-01-25 18:29:25
To jest dokładnie to samo zachowanie, jakie masz w dowolnym edytorze tekstowym kiedy przytrzymasz klawisz. Żeby mieć płynne poruszanie powinieneś raczej odpytywać stan klawiatury niezależnie od zdarzeń. Tylko że wtedy obiekt będzie się poruszać tak szybko, jak szybko wykonuje się pętla główna programu, więc dodatkowo wartość dodawaną do pozycji powinieneś uzależnić od upływu czasu rzeczywistego, trochę jak w przykładowym kodzie z » Biblioteki C++» Kurs SFML 2.x, C++» Instalacja i konfiguracjaTest działania biblioteki SFML 2.0 lekcja. Typowo wygląda to tak:
C/C++
sf::Clock stoper;
sf::Vector2f pozycjaObiektu( 300, 200 );
sf::Vector2f kierunek( 1, 0 ); // w prawo
float predkosc = 5;

// w pętli
float dt = stoper.restart().asSeconds();
pozycjaObiektu += kierunek * predkosc * dt;
P-178013
Yumox
Temat założony przez niniejszego użytkownika
» 2021-01-25 19:25:51
Ok, działa tak jak chciałem. Tylko nie do końca rozumiem to uzależnienie od czasu rzeczywistego. Funkcja restart zwraca czas podany w sekundach i ,,zeruje'' stoper jeśli dobrze rozumiem. Tylko czas jaki upływa między kolejnymi wykonaniami pętli jest ułamkiem sekundy, czyli funkcja restart powinna zwracać 1 (sekundę) albo 0 (sekund), a wtedy pozycjaObiektu się nie zmienia (dla 0) albo od razu przeskakuje o 5 (dla 1).
P-178015
pekfos
» 2021-01-25 20:01:03
To działa na ułamkach sekund i ułamkach pikseli.
P-178016
Yumox
Temat założony przez niniejszego użytkownika
» 2021-01-25 21:50:01
Czyli funkcja restart().asSeconds() zwraca np wartość 0,053 (tylko dla zobrazowania)? Wtedy pozycjaObiektu przyjmuje wartość niecałkowitą, a argumenty setPosition() nie muszą być liczbą całkowitą? Piksele nie są niepodzielną jednostką?
P-178018
pekfos
» 2021-01-25 22:22:21
Wtedy pozycjaObiektu przyjmuje wartość niecałkowitą, a argumenty setPosition() nie muszą być liczbą całkowitą?
Wszystko działa na floatach, wiec nie muszą.

Piksele nie są niepodzielną jednostką?
To nie jest w pikselach. Wszystkie pozycje jakie ustawiasz to pozycje w układzie współrzędnych sceny, które są później przekształcane na pozycję na ekranie. Domyślnie jeden do jednego. Pomijając różnicę jednego wymiaru, działa to tak samo jak w grafice 3D - tam już ciężej mierzyć coś w pikselach.
https://www.sfml-dev.org/tutorials/2.5/graphics-view.php
P-178019
Yumox
Temat założony przez niniejszego użytkownika
» 2021-01-26 10:52:34
Dzięki, już mniej więcej ogarniam. Jeszcze tylko nie rozumiem zapisu np ,,5.f". Domyślam się, że f oznacza float, ale co ten zapis powoduje?
P-178028
DejaVu
» 2021-01-26 11:02:30
5 == int;
5.0 == double;
5.0f == float;

Jeżeli dbasz o czyste wyjście procesu kompilacji to zaczynasz zwracać uwagę na takie niuanse jak typy liczbowe i ich rzutowania, aby nie mieć tysiąca warningów w kodzie.
P-178030
« 1 » 2
  Strona 1 z 2 Następna strona