【问题标题】:Squeak Smalltalk: Game loopSqueak Smalltalk:游戏循环
【发布时间】:2017-05-11 16:29:24
【问题描述】:

在许多语言中,您可以执行以下操作:

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,它处理键盘事件(在模型中进行更改),然后 #updateAndDraw 根据模型的当前状态(位置演员,可见的状态指示等)
  • 即使没有输入,我也需要让游戏不断更新。你会如何在你的方法中做到这一点?

标签: smalltalk squeak morphic


【解决方案1】:

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

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

如果你深入了解doOneCycle,你会发现它

  • (可选)延迟 (interCyclePause:)
  • 检查屏幕大小调整
  • 处理事件
  • 进程step方法
  • 重新展示世界

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

【讨论】:

  • 你能给我举一个例子吗?我不清楚什么去哪里以及要继承哪些类。
【解决方案2】:

执行一个动作固定次数:

10 timesRepeat: [game updateAndDraw]

使用while语义:

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

要使用 while 语义创建一个永久循环,

[true] whileTrue: [something do]

【讨论】:

  • 这能解决我的问题吗?
  • 抱歉,我可能不完全理解您的问题。
【解决方案3】:

您应该能够通过使用 Object >> #when:send:to: message 来利用 Morphic 事件循环。

【讨论】:

    猜你喜欢
    • 2014-01-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多