2014-06-18 15 views
1

我有一個動畫在QML中使用Qt3D。 動畫的要點是讓一個球從一個點p0到一個點p2,然後是一個給定點p1的貝塞爾曲線,我以某種方式計算(與問題無關),以便得到一個二次貝塞爾曲線。因爲沒有BezierAnimation這樣的東西,我所做的是我有一個Vector3DAnimation形式p0到曲線0.1的點,然後從0.1到02,依此類推,直到0.9到1(這是p2)。QML順序動畫避免代碼複製

這給了我這個可怕的看代碼:

SequentialAnimation{ 
    loops: Animation.Infinite 
    Vector3DAnimation{ 
     from: bezierAt(0) 
     to: bezierAt(0.1) 
     duration: durationFromSpeed(0,0.1,500) 
    } 
    Vector3DAnimation{ 
     from: bezierAt(0.1) 
     to: bezierAt(0.2) 
     duration: durationFromSpeed(0.1,0.2,500) 
    } 
    Vector3DAnimation{ 
     from: bezierAt(0.2) 
     to: bezierAt(0.3) 
     duration: durationFromSpeed(0.2,0.3,500) 
    } 
    .... 
    Vector3DAnimation{ 
     from: bezierAt(0.9) 
     to: bezierAt(1) 
     duration: durationFromSpeed(0.9,1,500) 
    } 
} 

正如你所看到的代碼是極其簡單的,因爲我封裝大部分的功能,但它太repetitie,具有非常不錯的擴展性(如果我想要有一個0.01的步驟,我會用手寫100個動畫)。

所以,我的問題是,有沒有辦法讓這個更好?

我試圖用一個ScriptAction,像這樣:

SequentialAnimation{ 
    id: anim 
    loops: Animation.Infinite 
    property real current:0.0 
    function incr() { 
     current+=0.1 
     current = current > 1? 0.0 : current 
    } 
    Vector3DAnimation{ 
     from: bezierAt(anim.current) 
     to: bezierAt(anim.current+0.1) 
     duration: durationFromSpeed(anim.current,anim.current+0.1,500) 
    } 
    ScriptAction: {script: incr();} 
} 

但這種奇怪只做動畫的(即使我檢查和正確電流的變化)的第一部分,並在4或5次迭代突然停止工作。

有沒有一個好看的方法來做到這一點?我真的希望能夠修改步驟...

非常感謝

回答

0

我終於做到了工作。

只需在incr()函數的末尾添加anim.restart(),它現在可以完美工作。