Squeak Smalltalk: Game loop

1k Views Asked by At

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.

3

There are 3 best solutions below

1
codefrau On

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.

2
ben rudgers On

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]
0
edcrypt On

You should be able to take advantage of the Morphic event loop by using the Object >> #when:send:to: message.