On Nov 13, 2007, at 12:24 AM, Luke Gorrie wrote:
...P.S. Any suggestions on more examples or documentation for advancing users?
There is not much available about textual scripting.
However, here are a few notes that should help anyone who knows a little Smalltalk get started with textual scripting:
(1) The "self" of a textual script is a *player* object, whose corresponding "morph" is found as its costume. A (very annoying) complication is that if the morph has been rotated (i.e. its heading is not 0), the costume referred to in the player is actually not the original morph (e.g. a JoystickMorph, SketchMorph, or whatever it was that you started with) but rather a TransformationMorph which holds the rotation info and which is the "owner" of the actual morph. If you have a script for some SketchMorph and you wish, in a textual script, to refer to the SketchMorph, and to be certain that the script still works if the SketchMorph is subsequently rotated, use the (very annoying) idiom "self costume renderedMorph" -- this will always get to the Morph you're most likely wishing to talk to in a textual script.
(2) If in your script you wish to refer to the "World" morph, you can use the global name "ActiveWorld".
(3) To refer to any "variable" belonging to the player, as seen in the "variables" section of its Viewer, use the special "getter" and "setter" idioms: for example, to get a player's heading, send it "getHeading", and to *set* the player's heading to 5, for example, send it "setHeading: 5". Similarly, for the variable "x" it would be "setX" and "getX", and so forth.
(4) Keep a Transcript open when you're doing textual scripting, to see reports of "runtime errors", i.e., errors that arise in executing your textual scripts; otherwise these will be simply swallowed silently.
------
Here's a simple example of textual script, itself of no value except to show how you can enumerate and identify objects and interact with objects on the screen. Set it to ticking and it will gradually nudge all objects (except flaps) to the right of the screen:
------
Here's a less trivial example, which does something that is otherwise very difficult to do with tiles.
The Shark (a little star) has a "player-valued" variable called "nearestFish". The shark's "findNearestFish" script is a textual script that first makes a list of all the non-sharks in the aquarium, then computes which of them is *nearest* to the shark, and, finally, places a reference to that nearest fish in the Shark's "nearestFish" variable, where it is subsequently used by the shark's "pursue" script.
As the simulation advances, you can see whom the Shark regards as its nearest fish by looking at the "Shark's nearestFish" watcher found below the aquarium.
The little triangular fish are all "siblings" running the same "meander" script.
The third and final script in the project is the shark's "pursue" script, which makes the shark move toward whichever fish he considers the nearest at the moment.
Here's a (low-res) picture of all the components of this example:
I also attach a copy of the actual project. which was created using the existing Squeakland system but will load and run equally well in an olpc etoys system.
Cheers,
-- Scott