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 = [
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.
ALARM_COLOR = "goldenrod"
GLOW_COLOR = "red"
BUTTON_SIZE = 0.9
+ OPEN_CLOSE_STR = ("<|>", ">|<")
def __init__(self, elevator, surf_size, num_levels):
self.elevator = elevator
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:
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
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