SFML Lag при перемещении прямоугольника на экране / Маленькие заикания - PullRequest
0 голосов
/ 24 августа 2018

всякий раз, когда я перемещаю прямоугольник на экране, он временами заикается.Я попытался переустановить SFML, но это не сработало.Это код:

#include <SFML/Graphics.hpp>

int main()
{
sf::RenderWindow window(sf::VideoMode(800, 600), "This is the title");
window.setFramerateLimit(60);

sf::RectangleShape rect(sf::Vector2f(20, 20));
rect.setFillColor(sf::Color::Green);
rect.setPosition(sf::Vector2f(50, 50));

while (window.isOpen())
{
    if (sf::Keyboard::isKeyPressed(sf::Keyboard::Up))
    {
        rect.move(0, -5);
    }

    if (sf::Keyboard::isKeyPressed(sf::Keyboard::Down))
    {
        rect.move(0, 5);
    }

    if (sf::Keyboard::isKeyPressed(sf::Keyboard::Left))
    {
        rect.move(-5, 0);
    }

    if (sf::Keyboard::isKeyPressed(sf::Keyboard::Right))
    {
        rect.move(5, 0);
    }


    sf::Event event;
    while (window.pollEvent(event))
    {

        if (event.type == sf::Event::Closed)
        {


            window.close();


        }
    }

    window.clear();

    window.draw(rect);

    window.display();
}

return 0;
}

Это мои характеристики ноутбуков:

coreM 6y30 intel HD 515 8Gb RAM Windows 10

если кто-нибудь знает, в чем проблема, пожалуйста,Помоги мне.спасибо большое генри

1 Ответ

0 голосов
/ 25 августа 2018

Согласно комментарию Джеспера, ваш временной шаг должен учитываться при создании графики. Шаг по времени - это время между различными кадрами. Есть несколько способов справиться с этим. Эта страница, на которую ссылался Джеспер ( Fix Your Timestep ), суммирует их идеально. Это своего рода ссылка.

Я сделал быструю адаптацию кода, чтобы дать вам некоторое руководство. Код для Linux.

#include <SFML/Graphics.hpp>
#include <iostream>

int main(){
  sf::RenderWindow window(sf::VideoMode(800, 600), "This is the title");
  window.setFramerateLimit(60);

  sf::RectangleShape rect(sf::Vector2f(20, 20));
  rect.setFillColor(sf::Color::Green);
  rect.setPosition(sf::Vector2f(50, 50));

  // Timing
  sf::Clock clock;

  while (window.isOpen()){
    // Update the delta time to measure movement accurately
    sf::Time dt = clock.restart();

    // Convert to seconds to do the maths
    float dtAsSeconds = dt.asSeconds();

    // For debuging, print the time to the terminal
    // It illustrates the differences
    std::cout << "Time step: " << dtAsSeconds << '\n';

    // Calculate movement per dt
    // Since the dt is a very small number, 
    // you have to multiply it with a large number to see faster movement
    float movement = 250.0f * dtAsSeconds;

    if (sf::Keyboard::isKeyPressed(sf::Keyboard::Up)){
      rect.move(0, -movement);
    }

    if (sf::Keyboard::isKeyPressed(sf::Keyboard::Down)){
      rect.move(0, movement);
    }

    if (sf::Keyboard::isKeyPressed(sf::Keyboard::Left)){
      rect.move(-movement, 0);
    }

    if (sf::Keyboard::isKeyPressed(sf::Keyboard::Right)){
      rect.move(movement, 0);
    }


    sf::Event event;
    while (window.pollEvent(event)){
      if (event.type == sf::Event::Closed){
        window.close();
      }
    }

    window.clear();

    window.draw(rect);

    window.display();
  }

  return 0;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...