From ca7d88de06d2a9b93ebe1ba8d6172c500b9e240e Mon Sep 17 00:00:00 2001 From: mar77i Date: Tue, 20 Aug 2024 01:12:54 +0200 Subject: [PATCH] clean up the code another bit --- elevator.py | 87 ++++++++++++++++++++++++++--------------------------- 1 file changed, 42 insertions(+), 45 deletions(-) diff --git a/elevator.py b/elevator.py index ef7458f..b938b61 100755 --- a/elevator.py +++ b/elevator.py @@ -34,26 +34,23 @@ class Circle: center: Vec radius: float + def draw(self, surf, rect): + pygame.draw.circle( + surf, + self.color, + rect.topleft + self.center * rect.size, + self.radius * rect.width, + ) + @dataclass class Polygon: color: str points: list[Vec] - -def vector_draw(surf, rect, item): - if isinstance(item, Circle): - pygame.draw.circle( - surf, - item.color, - rect.topleft + item.center * rect.size, - item.radius * rect.width, - ) - elif isinstance(item, Polygon): - points = [rect.topleft + point * rect.size for point in item.points] - pygame.draw.polygon(surf, item.color, points) - else: - raise ValueError(f"item: {item}") + def draw(self, surf, rect): + points = [rect.topleft + point * rect.size for point in self.points] + pygame.draw.polygon(surf, self.color, points) BELL = [ @@ -303,6 +300,11 @@ class Elevator: surf, self.CABLE_COLOR, rect.midtop, (rect.centerx, cabin_rect.top) ) + def get_current_dest(self): + if self.queued_dest is not None: + return self.queued_dest + return self.destination + def goto(self, level): """ Set a queued_dest if no destination or queued_dest is set. @@ -358,6 +360,7 @@ class ElevatorPanel: ALARM_COLOR = "goldenrod" GLOW_COLOR = "red" BUTTON_SIZE = 0.9 + OPEN_CLOSE_STR = ("<|>", ">|<") def __init__(self, elevator, surf_size, num_levels): self.elevator = elevator @@ -406,26 +409,17 @@ class ElevatorPanel: if i == 0 or i > self.num_levels: continue fs = self.font.render(str(i - 1), True, self.LABEL_COLOR) - fs_size = fs.get_size() - surf.blit( - fs, - (button.centerx - fs_size[0] // 2, button.centery - fs_size[1] // 2) - ) - if ( - self.elevator.queued_dest is None and self.elevator.destination == i - 1 - ) or self.elevator.queued_dest == i - 1: + fs_size = Vec(fs.get_size()) + surf.blit(fs, button.center - fs_size // 2) + if self.elevator.get_current_dest() == i - 1: pygame.draw.rect(surf, self.GLOW_COLOR, button, 2) for shape in BELL: - vector_draw(surf, self.buttons[0], shape) + shape.draw(surf, self.buttons[0]) - for button, s in zip(self.buttons[self.num_levels + 1:], ("<|>", ">|<")): + for button, s in zip(self.buttons[self.num_levels + 1:], self.OPEN_CLOSE_STR): fs = self.font.render(s, True, self.LABEL_COLOR) - fs_size = fs.get_size() - surf.blit( - fs, - (button.centerx - fs_size[0] // 2, button.centery - fs_size[1] // 2) - ) + surf.blit(fs, button.center - Vec(fs.get_size()) // 2) class ElevatorApp: @@ -449,6 +443,24 @@ class ElevatorApp: self.elevator_panel = ElevatorPanel(self.elevator, surf_size, self.num_levels) self.last_pos = None + def left_click(self, pos): + for i, door in enumerate(self.elevator.doors): + if door.button_rect.collidepoint(pos): + self.elevator.call_from(i) + return + for i, button in enumerate(self.elevator_panel.buttons): + if button.collidepoint(pos): + if i == 0: + beep() + elif i - 1 < self.num_levels: + self.elevator.goto(i - 1) + self.dirty = True + elif i == self.num_levels + 1: + self.elevator.open() + elif i == self.num_levels + 2: + self.elevator.close() + return + def handle_event(self, ev): if ev.type == pygame.QUIT: self.running = False @@ -457,22 +469,7 @@ class ElevatorApp: self.running = False elif ev.type == pygame.MOUSEBUTTONDOWN: if ev.button == 1: - for i, door in enumerate(self.elevator.doors): - if door.button_rect.collidepoint(ev.pos): - self.elevator.call_from(i) - break - for i, button in enumerate(self.elevator_panel.buttons): - if button.collidepoint(ev.pos): - if i == 0: - beep() - elif i - 1 < self.num_levels: - self.elevator.goto(i - 1) - self.dirty = True - elif i == self.num_levels + 1: - self.elevator.open() - elif i == self.num_levels + 2: - self.elevator.close() - break + self.left_click(ev.pos) self.last_pos = ev.pos elif ev.type == pygame.MOUSEBUTTONUP: self.last_pos = ev.pos -- 2.47.0