import pygame from src.camera import Camera from src.car import Car from src.track import Road, Track from src.vec import Vec class Game: DEFAULT_SIZE = (1280, 720) BACKGROUND_COLOR = (80, 80, 80) MAX_FPS = 60 def __init__(self) -> None: pygame.init() self.win: pygame.Surface = pygame.display.set_mode( self.DEFAULT_SIZE, pygame.RESIZABLE ) pygame.display.set_caption("Rally Racer") self.running: bool = True self.track: Track = Track.load("simple") self.car: Car = Car(self.track.start_pos, self.track.start_dir) self.camera: Camera = Camera() self.clock: pygame.time.Clock = pygame.time.Clock() def mainloop(self): while self.running: self.process_pygame_events() self.render() self.clock.tick(60) def process_pygame_events(self): self.camera.set_pos(self.car.pos) self.camera.set_direction(self.car.direction) self.camera.set_size(Vec(*self.win.get_size())) for event in pygame.event.get(): if event.type == pygame.QUIT: self.quit() elif event.type == pygame.VIDEORESIZE: self.camera.set_size(Vec(event.w, event.h)) elif event.type == pygame.KEYDOWN: if event.key == pygame.K_ESCAPE: self.quit() def quit(self): self.running = False def render(self): self.win.fill(self.BACKGROUND_COLOR) road: Road = self.track.objects[0] # type: ignore side1: list[Vec] = [] side2: list[Vec] = [] for i, pt in enumerate(road.pts): p1: Vec = pt.pos p2: Vec = p1 + pt.normal * pt.width p3: Vec = p1 - pt.normal * pt.width side1.append(self.camera.world2screen(p2)) side2.append(self.camera.world2screen(p3)) col: tuple[float, float, float] = (i * 10 + 150, 100, 100) pygame.draw.circle(self.win, col, self.camera.world2screen(p1), 5) pygame.draw.lines(self.win, (255, 255, 255), True, side1) pygame.draw.lines(self.win, (255, 255, 255), True, side2) pygame.display.flip()