0

我正在开发一个使用 libavg 和一系列 RectNodes 的项目。我想要做的是播放一个动画,使每个节点亮起白色 2.5 秒,然后淡出。每次单击其中一个节点时,该特定节点都会发生相同的动画。

我正在使用 AVGAApp 类,以及带有 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() 是非阻塞的。不是动画结束才返回,而是立即返回,动画并发执行。这意味着您的函数同时启动两个动画取消链接应该动画的节点。

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

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 回答