feat: add basic controls

This commit is contained in:
2025-10-18 02:02:37 +02:00
parent 9c5f39b669
commit 6805e69509
3 changed files with 66 additions and 1 deletions

View File

@@ -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

View File

@@ -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

View File

@@ -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,
)