Python 是否可以在Shady中共享动画回调?
我试图使用Shady来呈现一系列图像帧。在过去,我通过为stimulus.page属性指定动画回调来实现这一点。在回调中,Shady为每个监视器帧调用一次,我首先检查一个全局变量,该变量跟踪应该显示哪个刺激帧。如果是正值,我将刺激的可见性设置为True并返回帧编号;否则,我将其设置为False并返回0。工作起来很有魅力Python 是否可以在Shady中共享动画回调?,python,animation,shady,Python,Animation,Shady,我试图使用Shady来呈现一系列图像帧。在过去,我通过为stimulus.page属性指定动画回调来实现这一点。在回调中,Shady为每个监视器帧调用一次,我首先检查一个全局变量,该变量跟踪应该显示哪个刺激帧。如果是正值,我将刺激的可见性设置为True并返回帧编号;否则,我将其设置为False并返回0。工作起来很有魅力 现在我需要扩展它,因为我需要从许多序列中选择一个来显示。由于加载一个序列可能需要一些时间,我在程序开始时加载所有序列,并将每个序列与一个刺激对象相关联。现在,我的问题是。我是否必
现在我需要扩展它,因为我需要从许多序列中选择一个来显示。由于加载一个序列可能需要一些时间,我在程序开始时加载所有序列,并将每个序列与一个刺激对象相关联。现在,我的问题是。我是否必须为每个序列创建不同的动画回调函数(其数量是可变的,并且可能很高)。或者是否有一种更优雅的方法来调用单个动画回调(或类似的东西),并在其中确定要显示的序列的哪一帧(同样,基于全局变量的当前值)?首先,我想确定“动画回调”和“动态属性值”在术语上的区别. Shady docs和这个答案并没有将您正在使用的东西称为“动画回调”。但我认为,解决您的问题的最佳答案可能是使用实际的动画回调
- 动力学属性值,或“动力学”:可以为
和世界
实例的某些属性分配可调用项。如果是,则在每个帧上调用它们。您的刺激
就是一个例子(尽管stimultium.page
不是一个完整的“托管属性”,即一个具有与另一个实例的相应属性共享内存的属性,但它确实以这种方式支持“动态分配”)。如果您希望一次只更改几个刺激的几个方面,和/或希望一个特性中的更改完全独立于另一个特性中的更改,则动态特性是好的。动态分配的函数必须以秒为单位精确获取一个参数时间page
,但(根据您的注释)允许您使用已绑定的t
(或任何其他实例)方法,该方法具有原型s
,因为当您访问它时,blah(self,t)
将被烘焙。该函数还必须返回一个值,即应分配给此帧上属性的静态值self
- 动画回调:每个
实例stimulation
(另外还有s
实例)都有一个“动画回调”,它占据属性槽World
,并且可以通过s.Animate
方法或其等效函数decorators.SetAnimationCallback
进行更改。在每一帧上,每个@s.AnimationCallback
或世界
实例都会检查它是否具有刺激
属性,如果是,则调用它。如果希望对多个属性(例如,.Animate
和s.visible
)的更改相互协调,那么附加到s.page
的动画回调可能是最好的方法。与动力学不同,动画回调可以是(未绑定的)方法,它将s
作为s
接收引用,因此self
的属性可以用作“全局”(但特定于刺激实例)草稿行。(实际上,对于动画回调,您可以选择是使用prototypeself
之类的方法定义它们,还是使用一个单参数prototypeblah(self,t)
,类似于动态)当动态是功能性的时,动画回调是过程性的:忽略动画回调的任何返回参数blah(t)
刺激
:让每个刺激
遵循自己的逻辑,在自己的动画回调和/或动态属性中(以对您最有意义的为准)。但是,当它应该在屏幕外时,不要只设置s.visible=False
:相反,要让刺激
实例出现在舞台上,必要时再次出现。当你在舞台上,即使你是隐形的,你的动画回调和你的动态会在每一帧上被调用。当你离开舞台时,他们不会被叫来。这一点在本章末尾得到了证明World
动画回调,每个帧只调用一次,因为只有一个World
。对单个刺激的引用始终可以作为全局变量检索,或通过名称从self检索。刺激
容器:
import Shady
cmdline = Shady.WorldConstructorCommandLine()
cmdline.Help().Finalize()
w = Shady.World( **cmdline.opts )
w.Stimulus( name='bill', x=-100, size=100, color=[1,0,0] )
w.Stimulus( name='ben', x=+100, size=100, color=[0,0,1] )
@w.AnimationCallback
def Animate( self, t ):
# top-down control of multiple stimuli:
if self.framesCompleted % 2:
# self.stimuli is a dict, with all the expected dict capabilities...
self.stimuli['bill'].visible = True
self.stimuli['ben'].visible = False
else:
# ...but it supports lazier syntax too:
self.stimuli.bill.visible = False
self.stimuli.ben.visible = True
Shady.AutoFinish( w )
首先,我想确定“动画回调”和“动态属性值”在术语上的区别。Shady docs和这个答案并没有将您正在使用的东西称为“动画回调”。但我认为,解决您的问题的最佳答案可能是使用实际的动画回调
- 动力学属性值,或“动力学”:可以为
和世界
实例的某些属性分配可调用项。如果是,则在每个帧上调用它们。你的刺激
就是一个例子(尽管stimultium.page
不是一个成熟的page