我正在使用QTimeLine使播放器在屏幕上移动,以在指定时间内处理动画/移动。
在我的播放器构造函数中:
timeLine = new QTimeLine(500);
timeLine->setFrameRange(1, 4);
timeLine->setCurveShape(QTimeLine::CurveShape::LinearCurve);
QObject::connect(timeLine, SIGNAL(frameChanged(int)), this, SLOT(animatedMove(int)));
我删除了动画内容以仅显示问题:
void PlayerSprite::animatedMove(int frame)
{
qDebug() << "Frame: " << frame;
}
计时器在一个按键启动的插槽中启动:
void PlayerSprite::move(Direction direction)
{
timeLine->start();
}
输出为:
GameView: Player is moving
Frame: 2
Frame: 3
Frame: 4
GameView: Player is moving
Frame: 1
Frame: 2
Frame: 3
Frame: 4
但是应该是:
GameView: Player is moving
Frame: 1
Frame: 2
Frame: 3
Frame: 4
GameView: Player is moving
Frame: 1
Frame: 2
Frame: 3
Frame: 4
在每一帧中,玩家移动例如2个步骤。因此应该移动4x2 = 8步...但是在第一帧它只移动6步,这意味着我的角色掉出了游戏网格。我正在做一个小的16位rpg;)
这是因为假设我的播放器已经在第一帧了吗?
如果可以的话,可以覆盖吗?
最佳答案
这似乎是一个已知的错误:
https://bugreports.qt.io/browse/QTBUG-41610
在这种情况下,最简单的解决方法是将时间轴的当前时间设置为创建时的持续时间:
timeLine = new QTimeLine(500);
timeLine->setFrameRange(1, 4);
timeLine->setCurveShape(QTimeLine::CurveShape::LinearCurve);
// Add this line:
timeLine->setCurrentTime(timeLine->duration());
关于c++ - Qt QTimeLine跳过第一帧,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/42462658/