81 lines
2.1 KiB
Python
81 lines
2.1 KiB
Python
|
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()
|