MODULE animation; (* moving turtle example *) (* demonstrates use of timeout and select() to display a moving turtle in an X11 window *) IMPORT SYSTEM, gr; CONST Side = 8; (* nr of pixels of a square side *) VAR base, stride, screenBufSize :INTEGER; currentX :INTEGER; PROCEDURE drawSquare (x, y, color :INTEGER); VAR p, i, j :INTEGER; BEGIN p := (y*stride + x*4)*Side; ASSERT (p + (Side-1)*stride + (Side-1)*4 <= screenBufSize); p := base + p; FOR j := 0 TO Side-1 DO FOR i := 0 TO Side-1 DO SYSTEM.PUT32 (p, color); INC(p, 4) END; p := p + stride - Side*4; END; END drawSquare; PROCEDURE putLine (x : INTEGER; y: INTEGER;str : ARRAY OF CHAR); VAR z, x1: INTEGER; BEGIN FOR z := 0 TO LEN(str) - 1 DO x1 := (x + z) MOD 100; IF str[z] = "b" THEN drawSquare(x1, y, 0600000H); END; (* brown *) IF str[z] = "g" THEN drawSquare(x1, y, 000C000H); END; (* green *) END; END putLine; PROCEDURE turtlePicture (x , y : INTEGER); BEGIN putLine(x, y + 0 , "....bb........"); putLine(x, y + 1 , "....bbb......."); putLine(x, y + 2 , "....bbbb......"); putLine(x, y + 3 , ".bb..bbb......"); putLine(x, y + 4 , ".bgggbbbgbbgb."); putLine(x, y + 5 , ".ggggggggbbbb."); putLine(x, y + 6 , "bggggggggbbbb."); putLine(x, y + 7 , ".ggggggg......"); putLine(x, y + 8 , ".bb..bbb......"); putLine(x, y + 9 , "....bbbb......"); putLine(x, y + 10, ".....bbb......"); putLine(x, y + 11, ".....bb.......") END turtlePicture; PROCEDURE drawAll; BEGIN gr.screenBegin; gr.clear (0C0F0FFH); (* light blue *) turtlePicture (currentX, 15); gr.screenEnd; END drawAll; PROCEDURE run*; VAR stop :BOOLEAN; ev :gr.EventPars; ch :CHAR; BEGIN base := gr.base; stride := gr.stride; gr.createWindow (800, 480); screenBufSize := gr.winHeight * stride; stop := FALSE; currentX := 15; drawAll; REPEAT gr.nextEvent (400, ev); IF ev[0] = gr.EventTimeOut THEN drawAll; INC (currentX, 4); ELSIF ev[0] = gr.EventKeyPressed THEN ch := CHR(ev[4]); IF (ch = "q") OR (ch = 0AX) OR (ch = " ") THEN stop := TRUE END; IF ev[2] = 9 (* ESC *) THEN stop := TRUE END; END; UNTIL stop; gr.finish; END run; BEGIN run; END animation.