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
|
from src.vec import Vec
|
||||||
|
|
||||||
|
|
||||||
class Car:
|
class Car:
|
||||||
|
MAX_SPEED = 0.05
|
||||||
|
MAX_BACK_SPEED = -0.025
|
||||||
|
ROTATE_SPEED = radians(1)
|
||||||
|
|
||||||
def __init__(self, pos: Vec, direction: Vec) -> None:
|
def __init__(self, pos: Vec, direction: Vec) -> None:
|
||||||
self.pos: Vec = pos
|
self.pos: Vec = pos
|
||||||
self.direction: Vec = direction
|
self.direction: Vec = direction
|
||||||
self.speed: float = 0
|
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):
|
def mainloop(self):
|
||||||
while self.running:
|
while self.running:
|
||||||
self.process_pygame_events()
|
self.process_pygame_events()
|
||||||
|
self.car.update()
|
||||||
self.render()
|
self.render()
|
||||||
self.clock.tick(60)
|
self.clock.tick(60)
|
||||||
|
|
||||||
@@ -42,6 +43,10 @@ class Game:
|
|||||||
elif event.type == pygame.KEYDOWN:
|
elif event.type == pygame.KEYDOWN:
|
||||||
if event.key == pygame.K_ESCAPE:
|
if event.key == pygame.K_ESCAPE:
|
||||||
self.quit()
|
self.quit()
|
||||||
|
else:
|
||||||
|
self.on_key_down(event)
|
||||||
|
elif event.type == pygame.KEYUP:
|
||||||
|
self.on_key_up(event)
|
||||||
|
|
||||||
def quit(self):
|
def quit(self):
|
||||||
self.running = False
|
self.running = False
|
||||||
@@ -82,3 +87,23 @@ class Game:
|
|||||||
pts: list[Vec] = [p1, p2, p3, p4]
|
pts: list[Vec] = [p1, p2, p3, p4]
|
||||||
pts = [self.camera.world2screen(p) for p in pts]
|
pts = [self.camera.world2screen(p) for p in pts]
|
||||||
pygame.draw.polygon(self.win, (230, 150, 80), 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 __future__ import annotations
|
||||||
|
|
||||||
from math import sqrt
|
from math import cos, sin, sqrt
|
||||||
|
|
||||||
|
|
||||||
class Vec:
|
class Vec:
|
||||||
@@ -55,3 +55,9 @@ class Vec:
|
|||||||
|
|
||||||
def __repr__(self) -> str:
|
def __repr__(self) -> str:
|
||||||
return f"Vec({self.x}, {self.y})"
|
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