Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/346.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 是否可以在Shady中共享动画回调?_Python_Animation_Shady - Fatal编程技术网

Python 是否可以在Shady中共享动画回调?

Python 是否可以在Shady中共享动画回调?,python,animation,shady,Python,Animation,Shady,我试图使用Shady来呈现一系列图像帧。在过去,我通过为stimulus.page属性指定动画回调来实现这一点。在回调中,Shady为每个监视器帧调用一次,我首先检查一个全局变量,该变量跟踪应该显示哪个刺激帧。如果是正值,我将刺激的可见性设置为True并返回帧编号;否则,我将其设置为False并返回0。工作起来很有魅力 现在我需要扩展它,因为我需要从许多序列中选择一个来显示。由于加载一个序列可能需要一些时间,我在程序开始时加载所有序列,并将每个序列与一个刺激对象相关联。现在,我的问题是。我是否必

我试图使用Shady来呈现一系列图像帧。在过去,我通过为stimulus.page属性指定动画回调来实现这一点。在回调中,Shady为每个监视器帧调用一次,我首先检查一个全局变量,该变量跟踪应该显示哪个刺激帧。如果是正值,我将刺激的可见性设置为True并返回帧编号;否则,我将其设置为False并返回0。工作起来很有魅力


现在我需要扩展它,因为我需要从许多序列中选择一个来显示。由于加载一个序列可能需要一些时间,我在程序开始时加载所有序列,并将每个序列与一个刺激对象相关联。现在,我的问题是。我是否必须为每个序列创建不同的动画回调函数(其数量是可变的,并且可能很高)。或者是否有一种更优雅的方法来调用单个动画回调(或类似的东西),并在其中确定要显示的序列的哪一帧(同样,基于全局变量的当前值)?

首先,我想确定“动画回调”和“动态属性值”在术语上的区别. Shady docs和这个答案并没有将您正在使用的东西称为“动画回调”。但我认为,解决您的问题的最佳答案可能是使用实际的动画回调

  • 动力学属性值,或“动力学”:可以为
    世界
    刺激
    实例的某些属性分配可调用项。如果是,则在每个帧上调用它们。您的
    stimultium.page
    就是一个例子(尽管
    page
    不是一个完整的“托管属性”,即一个具有与另一个实例的相应属性共享内存的属性,但它确实以这种方式支持“动态分配”)。如果您希望一次只更改几个刺激的几个方面,和/或希望一个特性中的更改完全独立于另一个特性中的更改,则动态特性是好的。动态分配的函数必须以秒为单位精确获取一个参数时间
    t
    ,但(根据您的注释)允许您使用已绑定的
    s
    (或任何其他实例)方法,该方法具有原型
    blah(self,t)
    ,因为当您访问它时,
    self
    将被烘焙。该函数还必须返回一个值,即应分配给此帧上属性的静态值

  • 动画回调:每个
    stimulation
    实例
    s
    (另外还有
    World
    实例)都有一个“动画回调”,它占据属性槽
    s.Animate
    ,并且可以通过
    s.SetAnimationCallback
    方法或其等效函数decorator
    @s.AnimationCallback
    进行更改。在每一帧上,每个
    世界
    刺激
    实例都会检查它是否具有
    .Animate
    属性,如果是,则调用它。如果希望对多个属性(例如,
    s.visible
    s.page
    )的更改相互协调,那么附加到
    s
    的动画回调可能是最好的方法。与动力学不同,动画回调可以是(未绑定的)方法,它将
    s
    作为
    self
    接收引用,因此
    self
    的属性可以用作“全局”(但特定于刺激实例)草稿行。(实际上,对于动画回调,您可以选择是使用prototype
    blah(self,t)
    之类的方法定义它们,还是使用一个单参数prototype
    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
      不是一个成熟的