需要在smalltalk中睡觉才能进行步骤动画

时间:2016-01-02 17:46:25

标签: sleep smalltalk squeak

在smalltalk(吱吱声环境)中,我试图动画一些物体,比如在其他过程中闪烁。但它只适用于所有其他进程都结束,所以我猜没有足够的时间(是吗?)。

我试过"(延迟为几秒:500)等待"在某些方面,但它仍然没有工作,就像延迟本身阻止程序运行一样。

那我怎么能睡觉呢?

2 个答案:

答案 0 :(得分:4)

延迟实际上阻止了。这是它的责任:在规定的时间内“停止”当前的过程。

有一些想法可以克服这一点。

Morphic Stepping

您可以使变形在定义的时间间隔内收到#step消息:

YourMorph>>step
   "Assuming that myState is an instance variable with accessors"

   self color: (self myState ifTrue: [Color blue] ifFalse: [Color red]).
   self myState: self myState not

被调用#step的频率取决于#stepTime

YourMorph>>stepTime

    "Call #step every quarter second"
    ^ 250 "ms"

此外,您可以根据#step#startStepping来切换您的变形是否收到#stopStepping

这应该允许一个非常好的闪烁动画

Morphic Alarms

如果您需要异步发送的异常消息,可以使用警报。

也就是说,您计划在特定时间段(#addAlarm:after:)之后或在特定时间点(#addAlarm:at:)发送消息。

假设您的变形想要在500毫秒后发送#toggleAThing消息,您可以这样做

yourMorph addAlarm: #toggleAThing after: 500 "ms".

请注意这是一次性的。它只发送一次。对于定期消息,步进更好。

手动睡觉(小心)

您实际上可以使用延迟来诱导“以后”的消息。为此,您可以将延迟括在一个区块中并进行新的处理。

假设您希望在350毫秒后将#toggleAThing消息发送到您的对象,您可以执行以下操作:

[(Delay forMilliseconds: 350) wait.
 yourObject toggleAThing.
] fork.
"Not blocking, continue doing things"

请注意,您应该在尝试之前阅读一些关于Squeak中的调度(例如,通过阅读Process类的实现)。更好的版本可以作为“未来发送”

未来发送

这是接收或发送异步消息的最常用方法。您只需指定发送消息之前的时差,然后发送消息:

(yourObject future: 350 "ms") toggleAThing

答案 1 :(得分:0)

在某个时刻,你可能需要做一个

World doOneCycle

获取重绘。