2012-06-28 2 views
0

Я работаю над проектом, используя libavg и ряд RectNodes. То, что я пытаюсь сделать, это воспроизвести анимацию, которая заставляет каждый узел загораться белым в течение 2,5 секунд, а затем исчезает. Каждый раз, когда вы нажимаете один из узлов, такая же анимация должна произойти для этого конкретного узла.«Мигающая» анимация в Python с libavg

Я использую класс AVGApp, и список с RectNode ид и сколько раз они должны загораться, как (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 Ссылка не помогает меня много.

ответ

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) 
Смежные вопросы