Prędkość przesuwania się po mapie
Ostatnio zmodyfikowano 2024-09-08 18:24
tBane Temat założony przez niniejszego użytkownika |
Prędkość przesuwania się po mapie » 2024-09-08 18:19:53 Witam. Piszę Map Edytor i zauważyłem, że im więcej obiektów na ekranie, tym wolniej można przesuwać mapę klawiszami. Jest jakiś sposób na uwzględnienia takiego opóźnienia w tej funkcji? To znaczy czy można jakoś obliczyć wartość moveSpeed? float moveSpeed = 1.0f; if( sf::Keyboard::isKeyPressed( sf::Keyboard::W ) || sf::Keyboard::isKeyPressed( sf::Keyboard::Up ) ) cam->move( 0.0f, - moveSpeed );
if( sf::Keyboard::isKeyPressed( sf::Keyboard::S ) || sf::Keyboard::isKeyPressed( sf::Keyboard::Down ) ) cam->move( 0.0f, moveSpeed );
if( sf::Keyboard::isKeyPressed( sf::Keyboard::A ) || sf::Keyboard::isKeyPressed( sf::Keyboard::Left ) ) cam->move( - moveSpeed, 0.0f );
if( sf::Keyboard::isKeyPressed( sf::Keyboard::D ) || sf::Keyboard::isKeyPressed( sf::Keyboard::Right ) ) cam->move( moveSpeed, 0.0f );
|
|
tBane Temat założony przez niniejszego użytkownika |
» 2024-09-08 18:22:54 Chat GPTAby rozwiązać problem opóźnień przy większej liczbie obiektów na ekranie, warto zastosować mechanizm dopasowywania prędkości ruchu kamery do klatkarza (frame rate) lub czasu renderowania, co pozwoli na płynniejszą kontrolę. Możesz to zrobić poprzez zastosowanie czasu delta (czasu, który upłynął od ostatniej klatki) do obliczenia prędkości ruchu. SFML oferuje klasę sf::Clock, która pozwala na obliczanie czasu delta. Oto jak można to zaimplementować: Stwórz obiekt zegara, który będzie śledził czas między klatkami. Dopasuj moveSpeed na podstawie tego czasu. Przykład: sf::Clock clock;
while( window.isOpen() ) { sf::Time deltaTime = clock.restart(); float moveSpeed = 200.0f * deltaTime.asSeconds(); if( sf::Keyboard::isKeyPressed( sf::Keyboard::W ) || sf::Keyboard::isKeyPressed( sf::Keyboard::Up ) ) cam->move( 0.0f, - moveSpeed ); if( sf::Keyboard::isKeyPressed( sf::Keyboard::S ) || sf::Keyboard::isKeyPressed( sf::Keyboard::Down ) ) cam->move( 0.0f, moveSpeed ); if( sf::Keyboard::isKeyPressed( sf::Keyboard::A ) || sf::Keyboard::isKeyPressed( sf::Keyboard::Left ) ) cam->move( - moveSpeed, 0.0f ); if( sf::Keyboard::isKeyPressed( sf::Keyboard::D ) || sf::Keyboard::isKeyPressed( sf::Keyboard::Right ) ) cam->move( moveSpeed, 0.0f ); window.clear(); window.display(); }
W tym przykładzie prędkość ruchu kamery jest przeliczana na podstawie czasu, jaki upłynął od ostatniej klatki (deltaTime), co zapewnia płynniejszy ruch, niezależnie od liczby obiektów na ekranie. |
|
tBane Temat założony przez niniejszego użytkownika |
» 2024-09-08 18:23:34 dt = currentTime.asSeconds() - prevTime.asSeconds(); float moveSpeed = 200.0f * dt;
|
|
« 1 » |