import pygame from .obj.Object import Object from .UserController import UserController from .StateController import StateController class Engine: def __init__(self, screen_size, square_size, user: UserController, state: StateController): self.user = user self.state = state self.screen_size = screen_size self.screen = pygame.display.set_mode(self.screen_size) self.square_size = square_size self.num_squares = self.screen_size[0] // self.square_size self.squares = self.__init_squares_field__( self.num_squares, self.square_size) self.objects: list[Object] = [] self.runnin = False def __init_squares_field__(self, num_squares, square_size): squares = [] for i in range(num_squares): row = [] for j in range(num_squares): square_rect = pygame.Rect( j * square_size, i * square_size, square_size, square_size) row.append(square_rect) squares.append(row) return squares def subscribe(self, object: Object): self.objects.append(object) def loop(self): self.running = True while self.running: self.action() self.redraw() def quit(self): self.running = False def action(self): self.user.handler(self) conditionals = [ not self.user.obj.collide_test(self.user.obj), all([not o.collide_test(self.user.obj) for o in self.objects]) ] if all(conditionals): self.user.obj.dampState() else: self.user.obj.rollbackState() self.user.obj.goal_test(self) def redraw(self): self.screen.fill((255, 255, 255)) for row in self.squares: for square_rect in row: pygame.draw.rect(self.screen, (0, 0, 0), square_rect, 1) for o in self.objects: o.blit(self.screen) self.user.obj.blit(self.screen) for s in self.state.path: s.blit(self.screen) pygame.display.flip()