# Example file showing a circle moving on screen import pygame import math from engine import Engine # pygame setup pygame.init() screen = pygame.display.set_mode((1280, 720)) clock = pygame.time.Clock() running = True dt = 0 player_pos = pygame.Vector2(screen.get_width() / 2, screen.get_height() / 2) # Text Setup pygame.font.init() font = pygame.font.SysFont(None, 64) # Gauge Setup rpm_pos = pygame.Vector2(screen.get_width() * 0.25, screen.get_height() / 2) spd_pos = pygame.Vector2(screen.get_width() * 0.75, screen.get_height() / 2) gauge_radius = screen.get_height() / 5 # Angle for gauge angle_rad = math.radians(145) needle_color = "white" needle_width = 4 tip_radius = needle_width offset_vector = pygame.Vector2( math.cos(angle_rad) * gauge_radius, math.sin(angle_rad) * gauge_radius ) e = Engine() throttle = 0 def map_value_to_angle(value, min_val, max_val): clamped = max(min_val, min(value, max_val)) # Can change this later return math.radians(150 + 270 * (clamped - min_val) / (max_val - min_val)) while running: mX, mY = pygame.mouse.get_pos() # poll for events # pygame.QUIT event means the user clicked X to close your window for event in pygame.event.get(): if event.type == pygame.KEYDOWN: if (pygame.key.name(event.key) == 'v'): if e.ignition: e.ignition = False else: e.start(dt) if event.type == pygame.QUIT: running = False # fill the screen with a color to wipe away anything from last frame screen.fill("white") rpm_text = font.render(f"RPM: {int(e.rpm)}", True, (0, 0, 0)) rpm_rect = rpm_text.get_rect(center=(screen.get_width() // 2, screen.get_height() // 4)) screen.blit(rpm_text, rpm_rect) rpm_text = font.render(f"Torque: {int(e.instant_torque)}", True, (0, 0, 0)) rpm_rect = rpm_text.get_rect(center=(screen.get_width() // 2, screen.get_height() // 4 +100)) screen.blit(rpm_text, rpm_rect) rpm_angle = map_value_to_angle(e.rpm, 0, 8000) # RPM Gauge speed_angle = map_value_to_angle(e.wheel_speed, 0, 160) rpm_vector = pygame.Vector2(math.cos(rpm_angle), math.sin(rpm_angle)) * gauge_radius pygame.draw.circle(screen, "black", rpm_pos, gauge_radius) pygame.draw.line(screen, needle_color, rpm_pos, rpm_pos + rpm_vector, needle_width) # Trans Gauge speed_vector = pygame.Vector2(math.cos(speed_angle), math.sin(speed_angle)) * gauge_radius pygame.draw.circle(screen, "red", spd_pos, gauge_radius) spd_tip = spd_pos + offset_vector pygame.draw.line(screen, needle_color, spd_pos, spd_tip, needle_width) pygame.draw.circle(screen, needle_color, spd_tip, tip_radius) pygame.draw.circle(screen, "red", player_pos, 40) keys = pygame.key.get_pressed() if keys[pygame.K_w]: e.rpm += 600 * dt if keys[pygame.K_s]: e.rpm -= 600 * dt if keys[pygame.K_a]: player_pos.x -= 300 * dt if keys[pygame.K_d]: player_pos.x += 300 * dt if keys[pygame.K_r]: e.rpm = e.idle_rpm # Throttle (Using mouse pos) throttle = 1 - (mY / screen.get_height()) #print(throttle) # flip() the display to put your work on screen pygame.display.flip() # limits FPS to 60 # dt is delta time in seconds since last frame, used for framerate- # independent physics. dt = clock.tick(60) / 1000 e.update(throttle, 0, dt) pygame.quit()