3

Clutter は完全なアニメーションを実行していません。

これは私の現在のコードです:

from gi.repository import Clutter, Gtk
import sys

def onClick(actor, event):
    actor.animatev(Clutter.AnimationMode.LINEAR, 1000, ["x"], [280])  # clutter does not seem to be running this line
    actor.animatev(Clutter.AnimationMode.LINEAR, 1000, ["x"], [20])

def main():
    Clutter.init(sys.argv)

    # Colors
    red = Clutter.Color().new(255, 0, 0, 255)
    black = Clutter.Color().new(0, 0, 0, 255)

    # Create Stage
    stage = Clutter.Stage()
    stage.set_title("Basic Usage")
    stage.set_size(400, 200)
    stage.set_color(black)

    # Rectangle Actor
    actor = Clutter.Rectangle()
    actor.set_size(100, 50)
    actor.set_position(150, 100)
    actor.set_color(red)
    actor.set_reactive(True)
    actor.connect("button-press-event", onClick)

    # Add Actor to the Stage
    stage.add_actor(actor)
    stage.connect("destroy", lambda w:  Clutter.main_quit())
    stage.show_all()

    Clutter.main()

if __name__ == '__main__':
    main()

私の問題のこの図を見てください:

ここに画像の説明を入力

gif が嫌いな人のために、ここに私の問題を言葉で説明します。私は俳優を真ん中から右に動かし、次にずっと左に動かしたいのです。代わりに、真ん中からまっすぐ左に移動します。

何が原因で、どうすれば修正できますか?

4

3 に答える 3

3

ClutterActor.animate() のドキュメントのように、次のように述べています。

既にアニメーション化されているアクターでこの関数を呼び出すと、現在のアニメーションが新しい最終値、新しいイージング モード、および新しい持続時間で変更され ます https://developer.gnome.org/clutter/stable/clutter-Implicit- Animations.html#clutter-actor-animate

つまり、次のコード:

actor.animatev(Clutter.AnimationMode.LINEAR, 1000, ["x"], [280])
actor.animatev(Clutter.AnimationMode.LINEAR, 1000, ["x"], [20])

は次とまったく同じです:

actor.animatev(Clutter.AnimationMode.LINEAR, 1000, ["x"], [20])

これはあなたが見ているものです。

2 つのアニメーションを連鎖させたい場合は、関数を使用して のcompleted信号に接続する必要があります。これにより、Clutter が新しいアニメーションを作成できるようになります。ClutterAnimationconnect_after

def moveLeft (animation, actor):
    actor.animatev(Clutter.AnimationMode.LINEAR, 1000, ["x"], [20])

actor.animatev(Clutter.AnimationMode.LINEAR, 1000, ["x"], [280]).connect_after('completed', moveLeft)

私はそれを指摘したいと思いanimatev()ますClutterAnimation。これらは、明示的または暗黙的な遷移を使用して置き換えることができClutter.KeyframeTransitionます。たとえば、次のようになります。

from gi.repository import Clutter

Clutter.init(None)

stage = Clutter.Stage()
stage.connect('destroy', lambda x: Clutter.main_quit())

actor = Clutter.Actor()
actor.set_background_color(Clutter.Color.get_static(Clutter.StaticColor.RED))
actor.set_reactive(True)
actor.set_size(32, 32)
stage.add_child(actor)
actor.set_position(82, 82)

def moveLeft(actor):
    actor.set_x(20)

def moveRight(actor):

    actor.set_easing_duration(1000)
    actor.set_easing_mode(Clutter.AnimationMode.LINEAR)
    actor.set_x(280)
    actor.connect('transition-stopped::x', lambda a, n, t: moveLeft(actor))

actor.connect('button-press-event', lambda a, e: moveRight(actor))

stage.show()
Clutter.main()

これより任意に複雑にすることができます。transition-stopped::xまた、アクターの状態を変更するたびに暗黙的なアニメーションが作成されるのを避けるために、シグナル ハンドラーを切断し、イージング状態を復元することも忘れないでください。

于 2013-07-24T16:42:39.603 に答える
1

次のコードを試してください:

def onClick(actor, event):
    animation1 = actor.animatev(Clutter.AnimationMode.LINEAR, 1000, ["x"], [280])
    animation1.connect_after(
        'completed',
        lambda animation: actor.animatev(Clutter.AnimationMode.LINEAR, 1000, ["x"], [20])
    )
于 2013-07-24T06:32:37.960 に答える
0

これらを直後の行に行うと

def onClick(actor, event):
    actor.animatev(Clutter.AnimationMode.LINEAR, 1000, ["x"], [280])
    actor.animatev(Clutter.AnimationMode.LINEAR, 1000, ["x"], [20])

Clutter は、一方が完了するのを待たずに両方を実行します。これは、2 番目のコマンドが引き継ぐ前に、最初のコマンドがエージェントを移動する時間がほとんどないことを意味します。

「完了」シグナルの使用例を次に示します。

def onClick(actor, event):
    animate(actor)

def animate(actor):
    firstAnimation = actor.animatev(Clutter.AnimationMode.LINEAR, 1000, ["x"], [280]) 

    firstAnimation.connect_after("completed", moveLeft)

def moveLeft():
    self.actor.animatev(Clutter.AnimationMode.LINEAR, 1000, ["x"], [20])

クラッター アニメーションに関するドキュメントは次のとおり
です 「完了」信号に関するドキュメントは次のとおり
です 動作するサンプル コードは次のとおりです

于 2013-07-24T04:18:17.847 に答える