add key handling without color management (not implemented)

This commit is contained in:
2026-03-27 20:58:28 +01:00
parent cb19cf1413
commit 2fc67683d8
2 changed files with 62 additions and 28 deletions
+56 -22
View File
@@ -1,7 +1,7 @@
from typing import Any, Generator from typing import Any, Generator
from src.AMazeIng import AMazeIng from src.AMazeIng import AMazeIng
from src.parsing import Parsing from src.parsing import Parsing
from mlx.mlx import Mlx from mlx import Mlx
import numpy as np import numpy as np
import math import math
import time import time
@@ -14,16 +14,32 @@ class MazeMLX:
self.width = width self.width = width
self.mlx_ptr = self.mlx.mlx_init() self.mlx_ptr = self.mlx.mlx_init()
self.win_ptr = self.mlx.mlx_new_window( self.win_ptr = self.mlx.mlx_new_window(
self.mlx_ptr, width, height, "amazing" self.mlx_ptr, width, height + 200, "A-Maze-Ing"
) )
self.img_ptr = self.mlx.mlx_new_image(self.mlx_ptr, width, height) self.img_ptr = self.mlx.mlx_new_image(self.mlx_ptr, width, height)
self.buf, self.bpp, self.size_line, self.format = ( self.buf, self.bpp, self.size_line, self.format = (
self.mlx.mlx_get_data_addr(self.img_ptr) self.mlx.mlx_get_data_addr(self.img_ptr)
) )
self.path_printer = None
self.generator = None
def close(self) -> None: def close(self) -> None:
self.mlx.mlx_destroy_image(self.mlx_ptr, self.img_ptr) self.mlx.mlx_destroy_image(self.mlx_ptr, self.img_ptr)
def redraw_image(self) -> None:
self.mlx.mlx_clear_window(self.mlx_ptr, self.win_ptr)
self.mlx.mlx_put_image_to_window(
self.mlx_ptr, self.win_ptr, self.img_ptr, 0, 0
)
self.mlx.mlx_string_put(
self.mlx_ptr,
self.win_ptr,
self.width // 3,
self.height + 100,
0xFFFFFF,
"1: regen; 2: path; 3: color; 4: quit;",
)
def put_pixel(self, x, y) -> None: def put_pixel(self, x, y) -> None:
offset = y * self.size_line + x * (self.bpp // 8) offset = y * self.size_line + x * (self.bpp // 8)
@@ -35,7 +51,6 @@ class MazeMLX:
def clear_image(self) -> None: def clear_image(self) -> None:
self.buf[:] = b"\x00" * len(self.buf) self.buf[:] = b"\x00" * len(self.buf)
self.mlx.mlx_clear_window(self.mlx_ptr, self.win_ptr)
def put_line(self, start: tuple[int, int], end: tuple[int, int]) -> None: def put_line(self, start: tuple[int, int], end: tuple[int, int]) -> None:
sx, sy = start sx, sy = start
@@ -75,9 +90,7 @@ class MazeMLX:
self.put_line((x0, y1), (x1, y1)) self.put_line((x0, y1), (x1, y1))
if maze[y][x].get_west(): if maze[y][x].get_west():
self.put_line((x0, y0), (x0, y1)) self.put_line((x0, y0), (x0, y1))
self.mlx.mlx_put_image_to_window( self.redraw_image()
self.mlx_ptr, self.win_ptr, self.img_ptr, 0, 0
)
def put_block(self, ul: tuple[int, int], dr: tuple[int, int]) -> None: def put_block(self, ul: tuple[int, int], dr: tuple[int, int]) -> None:
for y in range(min(ul[1], dr[1]), max(dr[1], ul[1])): for y in range(min(ul[1], dr[1]), max(dr[1], ul[1])):
@@ -104,7 +117,6 @@ class MazeMLX:
) )
self.update_maze(maze) self.update_maze(maze)
for i in range(len(path)): for i in range(len(path)):
self.mlx.mlx_clear_window(self.mlx_ptr, self.win_ptr)
ul = ( ul = (
(actual[0]) * cell_size + margin + 12, (actual[0]) * cell_size + margin + 12,
(actual[1]) * cell_size + 12 + margin, (actual[1]) * cell_size + 12 + margin,
@@ -114,9 +126,7 @@ class MazeMLX:
(actual[1]) * cell_size + cell_size - 12 + margin, (actual[1]) * cell_size + cell_size - 12 + margin,
) )
self.put_block(ul, dr) self.put_block(ul, dr)
self.mlx.mlx_put_image_to_window( self.redraw_image()
self.mlx_ptr, self.win_ptr, self.img_ptr, 0, 0
)
x0 = actual[0] * cell_size + margin + 12 x0 = actual[0] * cell_size + margin + 12
y0 = actual[1] * cell_size + margin + 12 y0 = actual[1] * cell_size + margin + 12
x1 = actual[0] * cell_size + cell_size + margin - 12 x1 = actual[0] * cell_size + cell_size + margin - 12
@@ -144,32 +154,56 @@ class MazeMLX:
(actual[1]) * cell_size + cell_size - 12 + margin, (actual[1]) * cell_size + cell_size - 12 + margin,
) )
self.put_block(ul, dr) self.put_block(ul, dr)
self.mlx.mlx_put_image_to_window( self.redraw_image()
self.mlx_ptr, self.win_ptr, self.img_ptr, 0, 0
)
return return
def close_loop(self, _: Any): def close_loop(self, _: Any):
self.mlx.mlx_loop_exit(self.mlx_ptr) self.mlx.mlx_loop_exit(self.mlx_ptr)
def handle_key_press(self, keycode: int, amazing: AMazeIng) -> None:
if keycode == 49:
self.restart_maze(amazing)
if keycode == 50:
self.restart_path(amazing)
if keycode == 51:
pass
if keycode == 52:
self.close_loop(None)
def start(self, amazing: AMazeIng) -> None: def start(self, amazing: AMazeIng) -> None:
self.path_printer = self.put_path(amazing) self.restart_maze(amazing)
self.generator = amazing.generate() self.mlx.mlx_loop_hook(self.mlx_ptr, self.render_maze, amazing)
self.mlx.mlx_loop_hook(self.mlx_ptr, self.render, amazing)
self.mlx.mlx_hook(self.win_ptr, 33, 0, self.close_loop, None) self.mlx.mlx_hook(self.win_ptr, 33, 0, self.close_loop, None)
self.mlx.mlx_hook(
self.win_ptr, 2, 1 << 0, self.handle_key_press, amazing
)
self.mlx.mlx_loop(self.mlx_ptr) self.mlx.mlx_loop(self.mlx_ptr)
def render(self, amazing: AMazeIng): def restart_maze(self, amazing: AMazeIng) -> None:
self.generator = amazing.generate()
def restart_path(self, amazing: AMazeIng) -> None:
self.path_printer = self.put_path(amazing)
def render_path(self):
try:
next(self.path_printer)
time.sleep(0.03)
except StopIteration:
pass
def render_maze(self, amazing: AMazeIng):
try: try:
next(self.generator) next(self.generator)
self.update_maze(amazing.maze.get_maze()) self.update_maze(amazing.maze.get_maze())
# time.sleep(0.01) # time.sleep(0.01)
except StopIteration: except StopIteration:
try: if self.path_printer is not None:
next(self.path_printer) try:
time.sleep(0.03) next(self.path_printer)
except StopIteration: time.sleep(0.03)
pass except StopIteration:
pass
def main() -> None: def main() -> None:
+6 -6
View File
@@ -1,8 +1,8 @@
WIDTH=20 WIDTH=11
HEIGHT=20 HEIGHT=11
ENTRY=1,1 ENTRY=1,1
EXIT=20,20 EXIT=11,11
OUTPUT_FILE=maze.txt OUTPUT_FILE=maze.txt
PERFECT=False PERFECT=True
GENERATOR=DFS GENERATOR=Kruskal
SOLVER=DFS SOLVER=AStar