animation.ob07 2.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. MODULE animation; (* moving turtle example *)
  2. (* demonstrates use of timeout and select() to display a moving turtle in an X11 window *)
  3. IMPORT
  4. SYSTEM,
  5. gr IN "./common/gr.ob07";
  6. CONST
  7. Side = 8; (* nr of pixels of a square side *)
  8. VAR base, stride, screenBufSize :INTEGER;
  9. currentX :INTEGER;
  10. PROCEDURE drawSquare (x, y, color :INTEGER);
  11. VAR p, i, j :INTEGER;
  12. BEGIN
  13. p := (y*stride + x*4)*Side;
  14. ASSERT (p + (Side-1)*stride + (Side-1)*4 <= screenBufSize);
  15. p := base + p;
  16. FOR j := 0 TO Side-1 DO
  17. FOR i := 0 TO Side-1 DO SYSTEM.PUT32 (p, color); INC(p, 4) END;
  18. p := p + stride - Side*4;
  19. END;
  20. END drawSquare;
  21. PROCEDURE putLine (x : INTEGER; y: INTEGER;str : ARRAY OF CHAR);
  22. VAR z, x1: INTEGER;
  23. BEGIN
  24. FOR z := 0 TO LEN(str) - 1 DO
  25. x1 := (x + z) MOD 100;
  26. IF str[z] = "b" THEN drawSquare(x1, y, 0600000H); END; (* brown *)
  27. IF str[z] = "g" THEN drawSquare(x1, y, 000C000H); END; (* green *)
  28. END;
  29. END putLine;
  30. PROCEDURE turtlePicture (x , y : INTEGER);
  31. BEGIN
  32. putLine(x, y + 0 , "....bb........");
  33. putLine(x, y + 1 , "....bbb.......");
  34. putLine(x, y + 2 , "....bbbb......");
  35. putLine(x, y + 3 , ".bb..bbb......");
  36. putLine(x, y + 4 , ".bgggbbbgbbgb.");
  37. putLine(x, y + 5 , ".ggggggggbbbb.");
  38. putLine(x, y + 6 , "bggggggggbbbb.");
  39. putLine(x, y + 7 , ".ggggggg......");
  40. putLine(x, y + 8 , ".bb..bbb......");
  41. putLine(x, y + 9 , "....bbbb......");
  42. putLine(x, y + 10, ".....bbb......");
  43. putLine(x, y + 11, ".....bb.......")
  44. END turtlePicture;
  45. PROCEDURE drawAll;
  46. BEGIN
  47. gr.screenBegin;
  48. gr.clear (0C0F0FFH); (* light blue *)
  49. turtlePicture (currentX, 15);
  50. gr.screenEnd;
  51. END drawAll;
  52. PROCEDURE run*;
  53. VAR stop :BOOLEAN;
  54. ev :gr.EventPars;
  55. ch :CHAR;
  56. BEGIN
  57. base := gr.base; stride := gr.stride;
  58. gr.createWindow (800, 480);
  59. screenBufSize := gr.winHeight * stride;
  60. stop := FALSE; currentX := 15;
  61. drawAll;
  62. REPEAT
  63. gr.nextEvent (400, ev);
  64. IF ev[0] = gr.EventTimeOut THEN
  65. drawAll;
  66. INC (currentX, 4);
  67. ELSIF ev[0] = gr.EventKeyPressed THEN
  68. ch := CHR(ev[4]);
  69. IF (ch = "q") OR (ch = 0AX) OR (ch = " ") THEN stop := TRUE END;
  70. IF ev[2] = 9 (* ESC *) THEN stop := TRUE END;
  71. END;
  72. UNTIL stop;
  73. gr.finish;
  74. END run;
  75. BEGIN
  76. run;
  77. END animation.