Morphs are objects, so we can manipulate them like any other object in Smalltalk: by sending messages, we can change their properties, create new subclasses of Morph, and so on.
Every morph, even if it is not currently open on the screen, has a position and a size. For convenience, all morphs are considered to occupy a rectangular region of the screen; if they are irregularly shaped, their position and size are those of the smallest rectangular “box” that surrounds them, which is known as the morph’s bounding box, or just its “bounds”. The
position method returns a
Point that describes the location of the morph’s upper left corner (or the upper left corner of its bounding box). The origin of the coordinate system is the screen’s upper left corner, with y coordinates increasing down the screen and x coordinates increasing to the right. The extent method also returns a point, but this point specifies the width and height of the morph rather than a location.
\(\bigstar\) Type the following code into a workspace and do it:
joe := Morph new color: Color blue. joe openInWorld. bill := Morph new color: Color red. bill openInWorld.
joe position and
print it. To move
joe position: (joe position + (10@3)) repeatedly.
It is possible to do a similar thing with size.
joe extent answers joe’s size; to have joe grow, execute
joe extent: (joe extent * 1.1). To change the color of a morph, send it the
color: message with the desired
Color object as argument, for instance,
joe color: Color orange. To add transparency, try
joe color: (Color orange alpha: 0.5).
\(\bigstar\) To make bill follow joe, you can repeatedly execute this code:
bill position: (joe position + (100@0))
If you move joe using the mouse and then execute this code, bill will move so that it is 100 pixels to the right of joe.