90 lines
2.5 KiB
Plaintext
90 lines
2.5 KiB
Plaintext
|
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.
|
||
|
|