Subversion Repositories Kolibri OS

Rev

Go to most recent revision | Blame | Last modification | View Log | Download | RSS feed

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