Witam.
Chciałem się zapytać czy ktoś ma jakieś fajne sposoby na płyną regulację prędkości obiektu typu np sf::RectangleShape w C++ SFML na ekranie?
Wykorzystałem sposób regulacji prędkość obiektu przy pomocy sf::Clock i sf::Time ale mam wrażenie że efekt ruchu tego węża jest trochę taki jak by się przycinał chociaż działa prawidłowo i mogą to być moje odczucia, ale piszę tego posta bo mimo wszystko chciał bym poznać jakieś inne sposoby które istnieją na rozwiązanie tego typu problemu.
Jak coś ruch o 21 bo pozycji bo sf::RectangleShape jest wymiarem 20x20 i chcę mieć takie fajne odstępy oraz klasa Snake dziedziczy po sf::Drawable.
Oto kod:
//main.cpp
sf::RenderWindow window(sf::VideoMode(640, 320), "SFML SnakeMoveLogic");
window.setFramerateLimit(60);
Snake obj;
sf::Clock clock;
//Zmienne do regulacji prędkości węża [POCZĄTEK]
sf::Clock test;
float moveDelay = 0.1f;
float lastMoveTime = 0.0f;
//Zmienne do regulacji prędkości węża [KONIEC]
while (window.isOpen())
{
sf::Time deltaTime = clock.restart();
sf::Event event;
while (window.pollEvent(event))
{
if (event.type == sf::Event::Closed)
window.close();
else if (event.type == sf::Event::Resized)
{
window.setView(sf::View(sf::FloatRect(0.0f, 0.0f, event.size.width, event.size.height)));
}
else if (event.type == sf::Event::KeyPressed) {
// Zmiana kierunku ruchu
switch (event.key.code)
{
case sf::Keyboard::Up:
{
obj.ChangeDirection(MoveSnake::UP);
}
break;
case sf::Keyboard::Down:
{
obj.ChangeDirection(MoveSnake::DOWN);
}
break;
case sf::Keyboard::Left:
{
obj.ChangeDirection(MoveSnake::LEFT);
}
break;
case sf::Keyboard::Right:
{
obj.ChangeDirection(MoveSnake::RIGHT);
}
break;
case sf::Keyboard::F1:
{
obj.grow();
}
break;
}
}
}
//Kod do regulacji prędkości węża [POCZĄTEK]
float DeltaTime = test.restart().asSeconds();
lastMoveTime += DeltaTime;
if (lastMoveTime >= moveDelay)
{
obj.GoodMoveSnakeLogic();
lastMoveTime = 0.f;
}
//Kod do regulacji prędkości węża [KONIEC]
window.clear();
window.draw(obj);
window.display();
}
A tak wygląda kod funkcji GoodMoveSnakeLogic():
//Snake.cpp
void Snake::GoodMoveSnakeLogic() // <--- Metoda do implementacji ruchów węża
{
for (int i = SnakeBody.size() - 1; i > 0; --i)
{
SnakeBody[i].setPosition(SnakeBody[i - 1].getPosition());
}
auto TmpHead = SnakeBody.begin();
switch (HeadMove)
{
case MoveSnake::UP:
{
TmpHead->move(0, -21);
}
break;
case MoveSnake::DOWN:
{
TmpHead->move(0, 21);
}
break;
case MoveSnake::LEFT:
{
TmpHead->move(-21, 0);
}
break;
case MoveSnake::RIGHT:
{
TmpHead->move(21, 0);
}
break;
}
this->DetectCollision();
}
Dziękuję za każdą cenną uwagę i informację oraz jeśli będzie coś jeszcze potrzebne to postaram się to jak najszybciej dostarczyć.