在允许启动它的代码继续之前,我如何等待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
会安排在动画完成时发生某些事情,但不会阻止调用动画的函数的执行。
答案 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 *持续时间秒。