我想实现一个名为Piece>>userMovesFor:seconds
的方法,它在“秒”时间内取出键盘输入并依赖于它,向现有对象发送一些msgs以使它们进行一些计算(我的意思是它们不会分支未来的执行流程。)
因此,根据我对系统的了解,我认为该方法可能是这样的示意图。
Piece>>userMovesFor:seconds
| keyboardInterfacer |
keyboardInterfacer:=KeystrokeInterpreter on:self.
keyboardInterfacer takeKeyboardFocus .
self sleep:40 seconds.
keyboardInterfacer releaseKeyboardFocus .
KeystrokeInterpreter
将是Morph
的子类。在获得焦点的同时,它将通过Morph>>handleKeystroke
来处理击键。
Piece>>sleep:seconds
只会等待“秒”时间。
因此,在执行的某个时刻,Piece
实例将在Morph
实例处理键盘输入时无所事事。
我的问题是两个。
1)有没有办法实现Piece>>sleep
这样不会导致系统冻结(所以KeystrokeInterpreter
实例可以完成他的工作)?
我已尝试使用Duration>>wait
并自行实现自我调用等待消息,但两种选择都会冻结图像中所有对象的执行。
2)是否有更好的方法来实现Piece>>userMovesFor
?
答案 0 :(得分:3)
Morph subclass: #Piece
instanceVariableNames: ''
classVariableNames: ''
category: 'Play'
Piece>>initialize
super initialize.
self extent: 200@200.
"Piece new openInWorld"
Piece>>handlesMouseOver: evt
^true
Piece>>mouseEnter: event
super mouseEnter: event.
self color: Color yellow.
self takeKeyboardFocus.
Piece>>mouseLeave: event
super mouseEnter: event.
self color: Color blue.
Piece>>handlesKeyboard: evt
^true
Piece>>keyStroke: event
event keyCharacter == $r ifTrue:[ self color: Color red ].
event keyCharacter == $g ifTrue:[ self color: Color green ].
event keyCharacter == $x ifTrue:[ self delete ].
event keyCharacter == $c ifTrue:
[
[ self inform: 'Starting compute without blocking the UI'.
(Delay forSeconds: 10) wait. "simulate work"
self inform: 'Here are the results'.
] fork.
].
有关更多信息...通过在Image中搜索上面实现的方法的发件人,了解其他人如何做到这一点。如果您喜欢冒险,请在其中一些实施中“自行停止”,然后使用“系统>启用暂停/检查一次”。
可以找到另一个搜索谷歌搜索“[Pharo-users]示例自定义鼠标事件”的帖子 http://lists.pharo.org/pipermail/pharo-users_lists.pharo.org/2014-August/013156.htm
答案 1 :(得分:2)
由于您使用Morphic,#step将是您最好的选择。你可以在你的Morph上实现它,以及#stepTime(多久一次)。只要你的变形在世界上是开放的,步骤将继续射击。可能最简单的方法是跟踪Morph中的超时并从Piece提供回调以传回控制权。
答案 2 :(得分:1)
添加到肖恩的想法,请确保你看看Morph>> startStepping以及Morph中的整个步进和演示者协议。
我要做的是避免耦合键盘输入和变形。
只需拥有变形步骤并独立阅读键盘事件。从那里,创建片断正在收听的公告。
将您的游戏用作播音员。
所以,你不是在处理击键而是与游戏相关的真实事件。
HTH