Итак, я искал несколько часов и не могу найти ничего, что могло бы помочь мне с этим, поэтому я начну с того, что я новичок, как совсем новый, но я понимаю, что для того, чтобы иметь постоянную скорость движения при различных частотах кадров мне нужно учитывать скорость и определять время, прошедшее с последней итерации цикла.
Так что это то, что я до сих пор
#include <SFML/Graphics.hpp>
int main()
{
sf::RenderWindow window(sf::VideoMode(800, 600, 32), "Oliver Rules!");
float speed = 20.f;
float locX = 0.f;
float locY = 0.f;
sf::CircleShape circleOne(50);
circleOne.setFillColor(sf::Color(200, 40, 200));
sf::Clock clock;while (window.isOpen())
{
sf::Event event;
while (window.pollEvent(event))
{
if (event.type == sf::Event::Closed)
window.close();
}sf::Time elapsed1 = clock.restart();
if(sf::Keyboard::isKeyPressed(sf::Keyboard::A))
{
locX -= speed * elapsed1;
}
if(sf::Keyboard::isKeyPressed(sf::Keyboard::D))
{
locX += 0.1;
}
if(sf::Keyboard::isKeyPressed(sf::Keyboard::W))
{
locY -= 0.1;
}
if(sf::Keyboard::isKeyPressed(sf::Keyboard::S))
{
locY += 0.1;
}circleOne.setPosition(locX, locY);
circleOne.move(locX, locY);window.clear();
window.draw(circleOne);
window.display();
}
return 0;
}
Моя проблема в том, что я не могу добавить или вычесть переменные, которые я инициализировал как местоположение моего круга. Одно не может быть отредактировано из-за того, что elapsed1 является float, я считаю, поэтому мой вопрос, как мне получить это работать?
Ваша проблема в том, что speed
а также elapsed1
не того же типа. Один float
в то время как другой sf::Time
, Если ты хочешь locX -= speed * elapsed1
работать, вам придется преобразовать elapsed1
в float
,
Для этого вы можете использовать методы elapsed1.asSeconds
, elapsed1.asMilliseconds
а также elapsed1.asMicroseconds
в зависимости от типа единиц, которые вы хотите.
Если вы хотите узнать больше об этом, вы должны взглянуть на Документация SFML 2.0 для sf::Time
.
Других решений пока нет …