Thursday, April 21, 2005

Scripts in Croquet

Tao asked for a "Tweak & Croquet" tutorial. I don't have time right now to actually write one, but here's some sample code anyway.

Using scripts is easy and useful, even without the Tweak GUI. Just use #startScript: to run some method as a script. Inside a script, you can use loops and anything you like, just throw in a wait to account for time. Like, to animate the color of a frame, you could use this method (just add it to your TeapotMorph):
animateColorFor: aFrame
0 to: 360 do: [:hue |
aFrame material color: (Color h: hue s: 1.0 v: 1.0).
self wait: 0.01]
] repeat
This changes the color every 10 ms, and you can start it from the initializeDefaultSpace method:
    self startScript: #animateColorFor: withArguments: {someFrame}.
Here is something that does not loop forever, but finishes after one cycle:
jump: aFrame
| v g |
v := 0@1@0.
g := 0@-0.05@0.
[aFrame translation y >= 0] whileTrue: [
aFrame translation: aFrame translation + v.
v := v + g.
self waitTick.
aFrame translation: 0@0@0
Here we wait for the end of the frame - waiting is essential, because we do want to change the position only once in a frame. This can be run in response to a pointer click like this:
    self startScript: #jump: withArguments: {someFrame} when: {someFrame. #pointerDown}.
Or, if you wish, you could make a Tweak button for it. Here's the whole initializeDefaultSpace method doing it all:
| space cube |
space := TSpace new.
space addChild: TLight new.
self makeFloor: space fileName:'floor.BMP'.

cube := TCube new.
cube material: TMaterial new.
space addChild: cube.

self startScript: #animateColorFor: withArguments: {cube}.

self startScript: #jump: withArguments: {cube} when: {cube. #pointerDown}.

self initializeTweakWorld: [
| button |
button := CButton new.
button label: 'Jump'.
button openAt: 100@100.
self startScript: #jump: withArguments: {cube} when: {button. #fire}.

Hope that helps ...