]> Untitled Git - axy/ft/a-maze-ing.git/commitdiff
Lazy drawing to not redisplay if no update happened
authorAxy <gilliardmarthey.axel@gmail.com>
Fri, 27 Mar 2026 10:45:15 +0000 (11:45 +0100)
committerAxy <gilliardmarthey.axel@gmail.com>
Fri, 27 Mar 2026 10:45:15 +0000 (11:45 +0100)
__main__.py
amazeing/config/config_parser.py
amazeing/display/observer.py
amazeing/display/tty.py
example.conf

index 5ab6c0c33adda69b2643f37e0c8fbc16bfc058c3..2ca0d66dca75267bf8141bc2dd88aa25496070cc 100644 (file)
@@ -34,13 +34,13 @@ make_perfect(maze, network_tracker)
 make_pacman(maze, walls_const, pacman_tracker)
 
 
-while True:
+while False:
     make_perfect(maze, network_tracker)
     make_pacman(maze, walls_const, pacman_tracker)
     make_empty(maze, walls_const)
 
 
 while True:
-    tty_tracker.display_maze()
+    tty_tracker.display_maze(wait_for_tick=True)
 
 tty_tracker.backend.uninit()
index 2b9f4bf2049a1f7b799bbf732a4561c222756cb7..cddcc40babc31abc901c3a9b739bc55bc635743c 100644 (file)
@@ -432,7 +432,12 @@ class Config:
                     ),
                     "TILEMAP_FULL": DefaultedStrField(
                         ColoredLineField,
-                        ['"{WHITE:WHITE}    "', '"{WHITE:WHITE}    "'],
+                        [
+                            '1"{WHITE:WHITE}    "',
+                            '1"{WHITE:WHITE}    "',
+                            '2"{MAGENTA:MAGENTA}    "',
+                            '2"{MAGENTA:MAGENTA}    "',
+                        ],
                     ),
                     "TILEMAP_EMPTY": DefaultedStrField(
                         ColoredLineField,
@@ -440,7 +445,12 @@ class Config:
                     ),
                     "TILEMAP_PATH": DefaultedStrField(
                         ColoredLineField,
-                        ['"{BLUE:BLUE}    "', '"{BLUE:BLUE}    "'],
+                        [
+                            '1"{BLUE:BLUE}    "',
+                            '1"{BLUE:BLUE}    "',
+                            '2"{RED:RED}    "',
+                            '2"{RED:RED}    "',
+                        ],
                     ),
                     "TILEMAP_BACKGROUND_SIZE": DefaultedField(
                         CoordField, IVec2(4, 2)
index dee7ce501acc0b7449f6911212a79de24985387d..a412213720529d9a76c954f08daea7e1c02afc21 100644 (file)
@@ -24,6 +24,7 @@ class TTYTracker:
 
         self.tick: float | None = None
         self.prev_path: list[Cardinal] | None = None
+        self.draw_path: bool = True
 
         maze.observers.add(lambda _: self.display_maze())
 
@@ -49,12 +50,11 @@ class TTYTracker:
         if (
             all(map(self.maze.get_wall, self.dirty_tracker.curr_dirty()))
             and not self.path_invalidated()
+            and self.draw_path
         ):
             return None
-        path = pathfind_astar(self.maze)
+        path = pathfind_astar(self.maze) if self.draw_path else None
         if self.prev_path is not None:
-            if self.prev_path == path:
-                return
             self.backend.set_style(self.empty_style.curr_style())
             for tile in path_pixels(self.maze.entry, self.prev_path):
                 self.backend.draw_tile(tile)
@@ -66,7 +66,7 @@ class TTYTracker:
 
     def poll_events(self) -> None:
         while True:
-            event = self.backend.event(0)
+            event = self.backend.event()
             if isinstance(event, bool):
                 if not event:
                     return
@@ -83,13 +83,20 @@ class TTYTracker:
                 self.full_style.cycle(-1)
                 self.path_style.cycle(-1)
                 self.empty_style.cycle(-1)
+            if event.sym == "p":
+                self.draw_path = not self.draw_path
             else:
                 continue
 
-    def display_maze(self) -> None:
+    def display_maze(
+        self, wait_for_tick: bool = False, frametime: float = 0.016
+    ) -> None:
         now = time.monotonic()
-        if self.tick is not None and now - self.tick < 0.016:
-            return
+        if self.tick is not None:
+            if wait_for_tick:
+                time.sleep(max(0.0, frametime - now + self.tick))
+            elif now - self.tick < frametime:
+                return
         self.tick = time.monotonic()
 
         self.clear_backend()
index bebf9cfc5b14e7a98600a1389eccf5070033a73a..ab29be8750919997e7a7b3026ba81476cf8ada79 100644 (file)
@@ -439,6 +439,7 @@ class TTYBackend:
 
         self.__uninit: bool = False
         self.__screen: curses.window = curses.initscr()
+        self.__screen.timeout(0)
         curses.start_color()
         curses.noecho()
         curses.cbreak()
@@ -562,7 +563,7 @@ class TTYBackend:
             ],
         )
 
-        self.__resize: bool = False
+        self.__redraw: bool = True
 
         self.__filler: None | int = None
 
@@ -604,6 +605,7 @@ class TTYBackend:
     def set_filler(self, style: int) -> None:
         if self.__filler == style:
             return
+        self.__redraw = True
         self.__filler = style
         for box in self.__filler_boxes:
             box.mark_dirty()
@@ -618,6 +620,7 @@ class TTYBackend:
         if src == dst:
             return
         if self.get_style_height(src) != 0:
+            self.__redraw = True
             self.__drawn = QuadTree()
             self.__style_bimap.key_map(src, dst)
 
@@ -643,24 +646,22 @@ class TTYBackend:
         style = self.__style
         self.__style_bimap.add(style, pos)
         self.__tilemap.draw_at(pos, style, self.__pad.pad)
+        self.__redraw = True
 
     def set_style(self, style: int) -> None:
         self.__style = style
 
     def present(self) -> None:
-        if self.__resize:
-            self.__resize = False
-            self.__screen.erase()
-            for box in self.__filler_boxes:
-                box.mark_dirty()
+        if not self.__redraw:
+            return
+        self.__redraw = False
         self.__screen.refresh()
         y, x = self.__screen.getmaxyx()
         self.__scratch.resize(y, x)
         self.__layout.laid_out(IVec2(0, 0), IVec2(x, y))
         self.__scratch.overwrite(self.__screen)
 
-    def event(self, timeout_ms: int = -1) -> KeyboardInput | bool:
-        self.__screen.timeout(timeout_ms)
+    def event(self) -> KeyboardInput | bool:
         try:
             key = self.__screen.getkey()
         except curses.error:
@@ -668,7 +669,9 @@ class TTYBackend:
 
         match key:
             case "KEY_RESIZE":
-                self.__resize = True
+                self.__screen.erase()
+                for box in self.__filler_boxes:
+                    box.mark_dirty()
             case "KEY_DOWN":
                 self.__pad.scroll(IVec2(0, 1))
             case "KEY_UP":
@@ -679,4 +682,5 @@ class TTYBackend:
                 self.__pad.scroll(IVec2(-1, 0))
             case _:
                 return KeyboardInput(key)
+        self.__redraw = True
         return True
index cd98fc503f05af3a9484f69bbcfb851d2a1b61d3..4310962b67b3e5a05a063f534c9170f5cf47a1ce 100644 (file)
@@ -1,5 +1,5 @@
-WIDTH=16
-HEIGHT=16
+WIDTH=100
+HEIGHT=100
 ENTRY=0,0
 EXIT=24,24
 OUTPUT_FILE=test