Как бы вы увеличили частоту кадров, чтобы анимация не происходила слишком быстро?
Здравствуйте, посмотрите мой ответ здесь и примите это сообщение как лучшее решение.
https://stackoverflow.com/a/52656103/3624674
Вам необходимо указать длительность для каждого кадра и использовать общий прогресс для перехода к кадру.
В исходном файле анимации выполните
class Animation {
std::vector<Frame> frames;
double totalLength;
double totalProgress;
sf::Sprite *target;
public:
Animation(sf::Sprite& target) {
this->target = ⌖
totalProgress = 0.0;
}
void addFrame(Frame& frame) {
frames.push_back(std::move(frame));
totalLength += frame.duration;
}
void update(double elapsed) {
// increase the total progress of the animation
totalProgress += elapsed;
// use this progress as a counter. Final frame at progress <= 0
double progress = totalProgress;
for(auto frame : frames) {
progress -= (*frame).duration;
// When progress is <= 0 or we are on the last frame in the list, stop
if (progress <= 0.0 || &(*frame) == &frames.back())
{
target->setTextureRect((*frame).rect);
break; // we found our frame
}
}
};
Чтобы остановиться, когда вы нажимаете, просто анимируйте, только когда клавиша удерживается
if(isKeyPressed) {
animation.update(elapsed);
}
Для поддержки нескольких анимаций для разных ситуаций есть логическое значение для каждого состояния
bool isWalking, isJumping, isAttacking;
...
if(isJumping && !isWalking && !isAttacking) {
jumpAnimation.update(elapsed);
} else if(isWalking && !isAttacking) {
walkAnimation.update(elapsed);
} else if(isAttacking) {
attackAnimation.update(elapsed);
}
...
// now check for keyboard presses
if(jumpkeyPressed) { isJumping = true; } else { isJumping false; }