我正在smalltalk中制作一个带有使用计时器的小游戏。每秒出现一个对象,游戏持续 10 秒。如果我运行一个 while 循环 10 秒,我无法捕获来自控制器的任何输入以及将其显示在视图中。所以我创建了一个新进程,但是如果我按原样 fork 它,run 方法的优先级太高,其他方法没有机会运行。有一个更好的方法吗?
编辑:
我在 49 分叉了 run 方法,控制器和视图工作,但只有当我在视图上方移动鼠标时。
我正在smalltalk中制作一个带有使用计时器的小游戏。每秒出现一个对象,游戏持续 10 秒。如果我运行一个 while 循环 10 秒,我无法捕获来自控制器的任何输入以及将其显示在视图中。所以我创建了一个新进程,但是如果我按原样 fork 它,run 方法的优先级太高,其他方法没有机会运行。有一个更好的方法吗?
编辑:
我在 49 分叉了 run 方法,控制器和视图工作,但只有当我在视图上方移动鼠标时。
您可以分叉一个进程,但您希望通过常规窗口事件队列来处理它。尝试这样的事情:
tick
self doStuff.
self gameFinished ifFalse: [
[(Delay forSeconds: 1) wait.
[self tick] uiEventFor: self builder window] fork]
恕我直言,分叉一个流程并不是解决这个问题的一个好的设计决策。我宁愿做一个动作队列,当需要执行动作时,你可以在其中放置带有时间戳的动作。然后在游戏主循环的每个循环中,您删除所有到期的操作,并处理它们。
例如,对于每秒生成的对象,您将在未来 1 秒内添加一个动作,并且在处理该动作时,它会在未来 1 秒内再次添加相同的动作。
与我们尝试使用并发进程相比,这将使您的游戏更具可预测性和可调试性。