Kivy在继续之前等待动画完成

时间:2016-05-01 14:37:41

标签: python animation kivy

在允许启动它的代码继续之前,我如何等待kivy Animation完成?例如,以下方法更新窗口小部件位置:

def update_actor_widget(self, actor):
    final = self._get_screen_pos(actor.location)
    a = Animation(x=final[0], y=final[1], duration=0.5)
    a.start(actor.widget)

我不希望它在actor实际属于它之前返回(因此可能允许其他动画开始)。使用time.sleep()只需完全挂起应用程序。使用Animation.on_complete会安排在动画完成时发生某些事情,但不会阻止调用动画的函数的执行。

1 个答案:

答案 0 :(得分:1)

感谢大家的评论,我终于明白了。这有点棘手,所以万一其他人想要做类似的事情就是我这样做了(在主游戏小部件类里面):

def __init__(self):
    ...
    # Initializing stuff...
    ...
    self.anim_queue = []
    self.block_keyboard = False

def create_movement_animation(self, widget):
    self.anim_queue.append((widget, Animation(x=widget.expected_x, y=widget.expected_y))
    # Adding widget-animation tuple

def block(self):
    self.block_keyboard = True

def run_animation(self):
    if len(self.anim_queue)>0:
        w, a = self.anim_queue.pop(0)
        a.bind(on_start=lambda x,y: self.block(),
            on_complete=lambda x,y: self.run_animation())
        a.start(w)
    else:
        self.block_keyboard=False

def _on_key_down(self, keyboard, keycode, text, modifiers):
    if self.block_keyboard:
        return
    for actor in self.map.actors:
        actor.make_turn()
        if actor.moved:
            self.create_movement_animation(actor.widget)
    self.run_animation()

它的工作原理如下:_on_key_down调用计算所有小部件的预期位置的游戏逻辑代码。需要移动的所有小部件以及预期的动画都放在self.anim_queue中。 self.run_animation一直通过on_complete调用自身,在此过程中将阻塞标志设置为True,直到self.anim_queue用完为止。此时它将其设置为False并退出,允许处理下一个按钮,从而开始下一个回合。

我已经拍了几次腿,所以:首先,在绑定期间评估on_*参数的参数,因此必须将它们包裹在lambda中以防止所有动画同时触发。其次,您需要创建actor_moved()检查,否则会有空动画将小部件从其位置移动到完全相同的位置,实际上会冻结游戏以获取num-widgets *持续时间秒。