我正在让玩家在屏幕上移动,使用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;)
这是因为假设我的播放器已经在它的第一帧吗? 如果是这样可以被覆盖?
答案 0 :(得分:1)
这似乎是一个已知的错误:
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());