在smalltalk(吱吱声环境)中,我试图动画一些物体,比如在其他过程中闪烁。但它只适用于所有其他进程都结束,所以我猜没有足够的时间(是吗?)。
我试过"(延迟为几秒:500)等待"在某些方面,但它仍然没有工作,就像延迟本身阻止程序运行一样。
那我怎么能睡觉呢?
答案 0 :(得分:4)
延迟实际上阻止了。这是它的责任:在规定的时间内“停止”当前的过程。
有一些想法可以克服这一点。
您可以使变形在定义的时间间隔内收到#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
。
这应该允许一个非常好的闪烁动画
如果您需要异步发送的异常消息,可以使用警报。
也就是说,您计划在特定时间段(#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
获取重绘。