2017-02-25 8 views
0

QTimeLineを使用してプレーヤーを画面全体に移動させ、指定された時間内にアニメーション/動きを処理します。私のプレーヤーのコンストラクタでQt 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を作っています;)

私のプレーヤーはすでにそれが最初のフレームであると仮定されているので、これはですか? もしそうなら、これは無効にすることができますか?

答えて

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()); 
+0

私はこれがどのような理由でこれのように振る舞うのだろうと思っていました。私には分かりませんでした。簡単にやり直してくれてありがとう。将来、どのようにこれを追跡しましたか? Googleはまったく役に立たなかった。 – ovg

+0

私の正確なGoogle検索用語は「qt bug qtimeline」でした。 –

+0

ああ、OK。次回はシンプルなものを試してみてください。) – ovg

関連する問題