diff --git a/src/car.py b/src/car.py index 5552334..54dc70f 100644 --- a/src/car.py +++ b/src/car.py @@ -1,8 +1,42 @@ +from math import radians from src.vec import Vec class Car: + MAX_SPEED = 0.05 + MAX_BACK_SPEED = -0.025 + ROTATE_SPEED = radians(1) + def __init__(self, pos: Vec, direction: Vec) -> None: self.pos: Vec = pos self.direction: Vec = direction self.speed: float = 0 + self.forward: bool = False + self.backward: bool = False + self.left: bool = False + self.right: bool = False + + def update(self): + if self.forward: + self.speed += 0.001 + self.speed = min(self.MAX_SPEED, self.speed) + + if self.backward: + self.speed -= 0.002 + self.speed = max(self.MAX_BACK_SPEED, self.speed) + + rotate_angle: float = 0 + if self.left: + rotate_angle -= self.ROTATE_SPEED + if self.right: + rotate_angle += self.ROTATE_SPEED + + # if self.backward: + # rotate_angle *= -1 + + if rotate_angle != 0: + self.direction = self.direction.rotate(rotate_angle) + + self.speed *= 0.98 + + self.pos += self.direction * self.speed diff --git a/src/game.py b/src/game.py index 636f14f..b91608f 100644 --- a/src/game.py +++ b/src/game.py @@ -27,6 +27,7 @@ class Game: def mainloop(self): while self.running: self.process_pygame_events() + self.car.update() self.render() self.clock.tick(60) @@ -42,6 +43,10 @@ class Game: elif event.type == pygame.KEYDOWN: if event.key == pygame.K_ESCAPE: self.quit() + else: + self.on_key_down(event) + elif event.type == pygame.KEYUP: + self.on_key_up(event) def quit(self): self.running = False @@ -82,3 +87,23 @@ class Game: pts: list[Vec] = [p1, p2, p3, p4] pts = [self.camera.world2screen(p) for p in pts] pygame.draw.polygon(self.win, (230, 150, 80), pts) + + def on_key_down(self, event: pygame.event.Event): + if event.key == pygame.K_w: + self.car.forward = True + elif event.key == pygame.K_s: + self.car.backward = True + elif event.key == pygame.K_a: + self.car.left = True + elif event.key == pygame.K_d: + self.car.right = True + + def on_key_up(self, event: pygame.event.Event): + if event.key == pygame.K_w: + self.car.forward = False + elif event.key == pygame.K_s: + self.car.backward = False + elif event.key == pygame.K_a: + self.car.left = False + elif event.key == pygame.K_d: + self.car.right = False diff --git a/src/vec.py b/src/vec.py index 652b7e7..52945b1 100644 --- a/src/vec.py +++ b/src/vec.py @@ -1,6 +1,6 @@ from __future__ import annotations -from math import sqrt +from math import cos, sin, sqrt class Vec: @@ -55,3 +55,9 @@ class Vec: def __repr__(self) -> str: return f"Vec({self.x}, {self.y})" + + def rotate(self, angle: float) -> Vec: + return Vec( + cos(angle) * self.x - sin(angle) * self.y, + sin(angle) * self.x + cos(angle) * self.y, + )