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

Prędkość przesuwania się po mapie

Ostatnio zmodyfikowano 2024-09-08 18:23
Autor Wiadomość
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?

C/C++
float moveSpeed = 1.0f;
// moving the view
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 );

P-181575
tBane
Temat założony przez niniejszego użytkownika
» 2024-09-08 18:22:54
Chat GPT

Aby 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:

C/C++
// Tworzymy zegar na początku
sf::Clock clock;

while( window.isOpen() )
{
   
// Pobieramy czas delta (czas, który upłynął od ostatniej klatki)
   
sf::Time deltaTime = clock.restart();
   
   
// Obliczamy prędkość ruchu w zależności od deltaTime
   
float moveSpeed = 200.0f * deltaTime.asSeconds(); // Przykładowo 200 jednostek na sekundę
   
    // Sterowanie ruchem kamery
   
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 );
   
   
// Renderowanie reszty
   
window.clear();
   
// Rysowanie obiektów...
   
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.
P-181576
tBane
Temat założony przez niniejszego użytkownika
» 2024-09-08 18:23:34
C/C++
dt = currentTime.asSeconds() - prevTime.asSeconds();
float moveSpeed = 200.0f * dt;
P-181577
« 1 »
  Strona 1 z 1