简体   繁体   中英

Squeak Smalltalk: Game loop

In many languages you can do something like the following:

while true:
  handle events like keyboard input
  update game world
  draw screen
  (optional: delay execution)

while this is far from optimal it should suffice for simple games.

How do you do this in Squeak Smalltalk?

I can read keyboard input and react to it as described on wiki.squeak.org . But if I try to execute something like

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

all the events are only ever handled after the loop has executed.

Morphic already provides that main loop. It's in MorphicProject class>>spawnNewProcess :

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

And if you dig into doOneCycle you will find it

  • (optionally) does a delay ( interCyclePause: )
  • checks for screen resize
  • processes events
  • processes step methods
  • re-displays the world

Your code should hook into these phases by adding mouse/keyboard event handlers, step methods for animation, and draw methods for redisplaying. All of these should be methods in your own game morph. You can find examples throughout the system.

To perform an action a fixed number of times:

10 timesRepeat: [game updateAndDraw]

To use while semantics:

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

To create a perpetual loop using while semantics,

[true] whileTrue: [something do]

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM