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