Browse Source

Graph: KeyPressed, ReadKey; TestGraph.Mod

Arthur Yefimov 3 years ago
parent
commit
fd2ef5d557
2 changed files with 133 additions and 13 deletions
  1. 94 0
      Programs/TestGraph.Mod
  2. 39 13
      src/Graph.Mod

+ 94 - 0
Programs/TestGraph.Mod

@@ -0,0 +1,94 @@
+MODULE TestGraph;
+IMPORT G := Graph;
+VAR c, f: G.Color;
+  X, Y, W, H: INTEGER;
+  font: G.Font;
+
+PROCEDURE Draw;
+BEGIN
+  G.ClearToColor(c);
+  IF X # -1 THEN
+    G.Line(0, 0, X, Y, f);
+    G.Line(0, H, X, Y, f);
+    G.Line(W, H, X, Y, f);
+    G.Line(W, 0, X, Y, f)
+  END
+END Draw;
+
+PROCEDURE Message;
+BEGIN
+  IF font # NIL THEN
+    G.DrawString('Press space to return. X for down, ESC for up.',
+      0, 0, font, f)
+  END
+END Message;
+
+PROCEDURE Animation;
+VAR ch: CHAR;
+BEGIN ch := 0X;
+  REPEAT
+    INC(X); IF X > W THEN X := 0 END;
+    Draw;
+    Message;
+    G.Flip;
+    G.Delay(1);
+    IF G.KeyPressed() THEN
+      ch := G.ReadKey();
+      IF ch = 'x' THEN INC(Y, 100)
+      ELSIF ch = CHR(27) THEN DEC(Y, 100)
+      END
+    END
+  UNTIL ch = ' ';
+END Animation;
+
+PROCEDURE ByKey;
+VAR ch: CHAR;
+BEGIN
+  REPEAT
+    INC(X, 50); IF X > W THEN X := 0 END;
+    Draw;
+    Message;
+    G.Flip;
+    ch := G.ReadKey();
+    IF ch = 'x' THEN INC(Y, 100)
+    ELSIF ch = CHR(27) THEN DEC(Y, 100)
+    END
+  UNTIL ch = ' '
+END ByKey;
+
+PROCEDURE Do;
+VAR e: G.Event;
+  done: BOOLEAN;
+BEGIN
+  (*G.Settings(320, 200, {});*)
+  G.Init;
+  G.ShowMouse(FALSE);
+  font := G.LoadFont('../Data/Fonts/Main');
+  G.GetTargetSize(W, H); DEC(W); DEC(H);
+  G.MakeCol(c, 20, 30, 80);
+  G.MakeCol(f, 0, 180, 255);
+  done := FALSE; X := -1;
+  REPEAT
+    WHILE G.HasEvents() DO
+      G.WaitEvent(e);
+      IF e.type = G.quit THEN done := TRUE
+      ELSIF e.type = G.mouseMove THEN
+        X := e.x; Y := e.y
+      ELSIF e.type = G.mouseDown THEN
+        IF e.button = 1 THEN Animation
+        ELSIF e.button = 2 THEN ByKey
+        END
+      END
+    END;
+    Draw;
+    G.DrawString('Left mouse button - KeyPressed, right - ReadKey test',
+      0, 0, font, f);
+    G.Flip;
+    G.Delay(1)
+  UNTIL done;
+  G.Close
+END Do;
+
+BEGIN
+  Do
+END TestGraph.

+ 39 - 13
src/Graph.Mod

@@ -292,6 +292,8 @@ VAR
   target: Bitmap;
   black: Color;
 
+  charRead: CHAR;
+
 PROCEDURE Error(s: ARRAY OF CHAR);
 BEGIN Out.String(s); Out.Ln
 END Error;
@@ -756,11 +758,6 @@ PROCEDURE Delay*(n: INTEGER);
 BEGIN Al.rest(n / 1000)
 END Delay;
 
-PROCEDURE Pause*;
-BEGIN
-
-END Pause;
-
 PROCEDURE ConvertMemoryBitmaps*;
 BEGIN Al.convert_memory_bitmaps
 END ConvertMemoryBitmaps;
@@ -976,7 +973,7 @@ PROCEDURE SwitchToFS*(win: Window);
 BEGIN IF window IN GetWindowOptions(screen) THEN ToggleFS(win) END
 END SwitchToFS;
 
-PROCEDURE ParseEvent(E: Al.Event; VAR event: Event);
+PROCEDURE ParseEvent(E: Al.Event; peek: BOOLEAN; VAR event: Event);
 VAR DE: Al.PDisplayEvent;
   TE: Al.PTimerEvent;
   KE: Al.PKeyboardEvent;
@@ -1011,7 +1008,7 @@ BEGIN
         ELSE event.dx := x - W.lastX; event.dy := y - W.lastY
         END;
         event.x := x; event.y := y;
-        W.lastX := event.x; W.lastY := event.y
+        IF ~peek THEN W.lastX := event.x; W.lastY := event.y END
       END;
       event.button := ME.button;
       event.mod := {};
@@ -1086,10 +1083,12 @@ BEGIN
     IF E.type = Al.eventDisplayResize THEN
       DE := SYSTEM.VAL(Al.PDisplayEvent, SYSTEM.ADR(E));
       d := DE.source; W := GetWindow(d);
-      W.winW := DE.width; W.winH := DE.height
+      IF ~peek THEN W.winW := DE.width; W.winH := DE.height END
     ELSE UE := SYSTEM.VAL(Al.PUserEvent, SYSTEM.ADR(E));
       d := SYSTEM.VAL(Al.Display, UE.data4); W := GetWindow(d);
-      W.winW := Al.get_display_width(d); W.winH := Al.get_display_height(d)
+      IF ~peek THEN
+        W.winW := Al.get_display_width(d); W.winH := Al.get_display_height(d)
+      END
     END;
     fw := W.winW / W.rzoom; fh := W.winH / W.rzoom;
     IF W.scaleOn THEN fw := fw / W.scaleX; fh := fh / W.scaleY END;
@@ -1099,13 +1098,13 @@ BEGIN
       ApplySizeStep(W, w, h)
     END;
     IF (w # W.lastW) OR (h # W.lastH) THEN
-      W.lastW := w; W.lastH := h;
+      IF ~peek THEN W.lastW := w; W.lastH := h END;
       event.type := resize; event.window := W; event.display := d;
       event.w := w; event.h := h;
       IF E.type = Al.eventDisplayResize THEN event.x := DE.x; event.y := DE.y
       ELSE Al.get_window_position(d, event.x, event.y)
       END;
-      ResetWindowBitmap(W)
+      IF ~peek THEN ResetWindowBitmap(W) END
     ELSE ResetFlipVars(W); Flip; event.type := noEvent
     END
   ELSIF E.type = Al.eventDisplayClose THEN
@@ -1120,7 +1119,7 @@ PROCEDURE WaitAndParseEvent(VAR event: Event);
 VAR E: Al.Event;
 BEGIN
   Al.wait_for_event(queue, E);
-  ParseEvent(E, event)
+  ParseEvent(E, FALSE, event)
 END WaitAndParseEvent;
 
 PROCEDURE PeekAndParseEvent(VAR event: Event): BOOLEAN;
@@ -1128,7 +1127,7 @@ VAR E: Al.Event;
   got: BOOLEAN;
 BEGIN
   got := Al.peek_next_event(queue, E);
-  IF got THEN ParseEvent(E, event) END
+  IF got THEN ParseEvent(E, TRUE, event) END
 RETURN got END PeekAndParseEvent;
 
 PROCEDURE WaitEvent*(VAR event: Event);
@@ -1149,6 +1148,32 @@ PROCEDURE HasEvents*(): BOOLEAN;
 VAR e: Event;
 RETURN PeekEvent(e) END HasEvents;
 
+PROCEDURE KeyPressed*(): BOOLEAN;
+VAR e: Event;
+BEGIN
+  WHILE (charRead = 0X) & HasEvents() DO
+    WaitEvent(e);
+    IF e.type = char THEN charRead := e.ch END
+  END
+RETURN charRead # 0X END KeyPressed;
+
+PROCEDURE ReadKey*(): CHAR;
+VAR e: Event;
+  c: CHAR;
+BEGIN
+  WHILE charRead = 0X DO
+    WaitEvent(e);
+    IF e.type = char THEN charRead := e.ch END
+  END;
+  c := charRead; charRead := 0X
+RETURN c END ReadKey;
+
+PROCEDURE Pause*;
+BEGIN
+
+END Pause;
+
+
 PROCEDURE DropNextEvent*;
 VAR e: Event;
 BEGIN (*WaitEvent(e)*)
@@ -1414,6 +1439,7 @@ BEGIN ok := TRUE;
     END
   ELSE Error('Could not init Allegro.'); ok := FALSE
   END;
+  charRead := 0X;
   Done := ok
 END Init;