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