Squeak Smalltalk:游戏循环

6
在许多编程语言中,您可以执行以下操作:
while true:
  handle events like keyboard input
  update game world
  draw screen
  (optional: delay execution)

虽然这远非最佳选择,但对于简单的游戏应该足够了。

在Squeak Smalltalk中如何实现呢?

我可以读取键盘输入并像wiki.squeak.org上描述的那样做出反应。但是如果我尝试执行类似以下的内容

1 to: 10 do: [ :i | game updateAndDraw ]

所有事件都仅在循环执行处理。


你可以查看一些在Morphic中实现的游戏示例,肯定会找到几个。我认为一个常见的简单方法是为游戏创建一个单独的Morph,该Morph处理键盘事件(对模型进行更改),然后#updateAndDraw根据模型的当前状态(演员位置、状态的可见指示等)重新绘制其子Morphs。 - Carlos E. Ferro
我需要让游戏即使没有输入也能持续更新。你会如何处理? - Higemaru
3个回答

7

Morphic已经提供了主循环。它在MorphicProject class>>spawnNewProcess中:

uiProcess := [
    [ world doOneCycle.  Processor yield ] repeat.
] newProcess ...

如果你深入研究doOneCycle,你会发现它:

  • (可选地)进行延迟(interCyclePause:
  • 检查屏幕大小是否改变
  • 处理事件
  • 处理step方法
  • 重新显示世界

您的代码应通过添加鼠标/键盘事件处理程序、用于动画的步进方法和用于重新显示的绘制方法来钩入这些阶段。所有这些都应该是您自己的游戏morph中的方法。您可以在整个系统中找到示例。


请问您能给我提供一个示例吗?我不清楚应该放置哪些内容以及应该继承哪些类。 - Higemaru

0

0

要执行固定次数的操作:

10 timesRepeat: [game updateAndDraw]

使用 while 语义:

i := 5
[i > 0] whileTrue: [
  i printNl.
  i := i - 1.
]

使用while语义创建一个永久循环:
[true] whileTrue: [something do]

这是否完全回答了我的问题? - Higemaru
抱歉,也许我没有完全理解您的问题。 - ben rudgers

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接