feat: add basic controls
This commit is contained in:
34
src/car.py
34
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
|
||||
|
||||
25
src/game.py
25
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
|
||||
|
||||
@@ -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,
|
||||
)
|
||||
|
||||
Reference in New Issue
Block a user