0

我有一个用于运行交互式程序的 Shady 脚本,该程序涉及Stimulus具有多个动态属性的众多对象。它World本身也有一些动态特性。

我需要一种方法来暂时停止交互式程序。我可以在附加到世界/刺激的自定义回调中自己处理这种“暂停”状态Animate,这些回调的数量很少,但在每个动态属性函数中处理它显然并不理想。有没有办法同时“暂停”然后“取消暂停”所有动态?最好,至少World.Animate回调(和所有事件处理程序)仍会在此暂停状态下的每一帧被调用,这样我就可以监视取消暂停的条件,并可能在暂停时做一些不同的事情。

4

1 回答 1

0

查看子模块中的_FrameCallback代码Shady.Rendering,似乎没有全局标志显示“运行动画回调但不运行动态属性评估”。也没有官方/记录的途径来做到这一点。

但是,在逐个实例的基础上,有一种非官方的方式可以暂停动态:只需删除未记录的._dynamics属性,也许将其存储在某个地方以供以后恢复。.Animate对属性执行相同操作以禁用动画回调。要一举禁用这两种类型的动态,怎么样:

def ToggleDynamics(x):
    x._disabled_dynamics, x._dynamics = x._dynamics, getattr(x, '_disabled_dynamics', {})
    x._disabled_Animate, x.Animate = x.Animate, getattr(x, '_disabled_Animate', None)

x您的WorldStimulus实例在哪里。然后,要将此切换全局化,您可以执行以下操作:

def ToggleDynamicsEverywhere(world):
    for thing in [world] + list(world.stimuli.values()):
        ToggleDynamics(thing)

试试看,python -m Shady shell showcase你会发现它会ToggleDynamicsEverywhere(world)暂停除视频播放之外的所有内容。

有一些相当明显的方法可以自定义这两个函数来明确启用/禁用动态而不是切换它们,或者在所有Stimulus实例上操作但不包括World,或者禁用动态属性但不是动画回调,反之亦然.

于 2020-06-15T17:18:27.127 回答