0

libavg と一連の RectNodes を使用するプロジェクトに取り組んでいます。私がやろうとしているのは、各ノードを 2.5 秒間白く点灯させてからフェードバックさせるアニメーションを再生することです。ノードの 1 つをクリックするたびに、その特定のノードに対して同じアニメーションが発生するはずです。

私は AVGApp クラスを使用しており、 RectNode id と (id1, 2) のように点灯する回数を含むリストを使用しています

def playAnim(self, animarr):
        for i in range(0, len(animarr)):
            i, count = animarr[i]
            sid = "r" + str(i)
            node = g_player.getElementByID(sid)
            while count > 0:
                self.blink(node)
                count -= 1
        return

そしてまばたきのための私のコード:

 def blink(self, node):
    pos = node.pos
    size = node.size

    covernode = avg.RectNode(pos=pos, size=size, fillopacity=0,
                             parent = self._parentNode, fillcolor="ffffff", 
                               color="000000", strokewidth=2)

    self.animObj = LinearAnim(covernode, 'fillopacity', 1000, 0, 1)
    self.animObj.start()
    self.animObj = LinearAnim(covernode, 'fillopacity', 1000, 1, 0)
    self.animObj.start()
    covernode.unlink(True)
    return

私はそれを呼んでいます:

def _enter(self):
    (some other stuff here)

    print "Let's get started!"
    self.playAnim(self.animArr)
    print "Your turn!"

libavg リファレンスはあまり役に立ちません。

4

1 に答える 1

2

問題は、anim.start() がノンブロッキングであることです。アニメーションが終了してから戻るのではなく、すぐに戻り、アニメーションが同時に実行されます。これは、関数が 2 つのアニメーションを同時に開始し、アニメーション化する必要があるノードのリンクを解除することを意味します。

したがって、代わりに、アニメーションに与えられる終了コールバックを使用して、次のステップをトリガーする必要があります。まばたき関数は次のようになります。

def blink(self, node):
    pos = node.pos
    size = node.size    
    covernode = avg.RectNode(pos=pos, size=size, fillopacity=0,
                             parent = self._parentNode, fillcolor="ffffff", 
                             color="000000", strokewidth=2)

    fadeOutAnim = LinearAnim(covernode, 'fillopacity', 1000, 1, 0, False, 
                             None, covernode.unlink)
    fadInAnim= LinearAnim(covernode, 'fillopacity', 1000, 0, 1, False,
                              None, fadeOutAnim.start)
    fadInAnim.start()

ノードを一定時間白のままにしたい場合は、WaitAnim または player.setTimeout() を使用して別のステップを挿入する必要があります。(https://www.libavg.de/reference/current/player.html#libavg.avg.Player)

def blink(self, node):
    pos = node.pos
    size = node.size    
    covernode = avg.RectNode(pos=pos, size=size, fillopacity=0,
                             parent = self._parentNode, fillcolor="ffffff", 
                             color="000000", strokewidth=2)

    fadeOutAnim = LinearAnim(covernode, 'fillopacity', 1000, 1, 0, False, 
                             None, covernode.unlink
                             )
    fadInAnimObj = LinearAnim(covernode, 'fillopacity', 1000, 0, 1, False,
                              None, lambda:self.wait(500, fadeOutAnim.start)
                              )
    fadInAnimObj.start()


def wait(self, time, end_cb):
    avg.Player.get().setTimeout(time, end_cb)
于 2012-08-03T16:00:05.097 に答える