使用libavg在Python中“闪烁”动画

时间:2012-06-28 06:48:09

标签: python animation libavg

我正在使用libavg和一系列RectNode进行项目。我正在尝试做的是播放动画,使每个节点亮起白色2.5秒,然后淡化。每次单击其中一个节点时,该特定节点都应执行相同的动画。

我正在使用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 Reference对我没什么帮助。

1 个答案:

答案 0 :(得分:2)

问题是anim.start()是非阻塞的。 它不是仅在动画结束后返回,而是立即返回,动画将同时执行。这意味着同时您的函数会启动两个动画取消链接应该设置动画的节点。

因此,你应该使用可以给动画的结束回调来逐步触发。眨眼功能可能如下所示:

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)