| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394 |
- MODULE animation; (* moving turtle example *)
- (* demonstrates use of timeout and select() to display a moving turtle in an X11 window *)
- IMPORT
- SYSTEM,
- gr IN "./common/gr.ob07";
- 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.
|