From 17fbfb3426a33eb118775e48f850be4cccfde7cf Mon Sep 17 00:00:00 2001 From: Aidan Haas <94150901+ahaas25@users.noreply.github.com> Date: Fri, 13 Jun 2025 12:11:29 -0400 Subject: [PATCH] Init --- __pycache__/engine.cpython-311.pyc | Bin 0 -> 1886 bytes engine.py | 50 ++++++++++++++++++ main.py | 80 +++++++++++++++++++++++++++++ readme.md | 0 4 files changed, 130 insertions(+) create mode 100644 __pycache__/engine.cpython-311.pyc create mode 100644 engine.py create mode 100644 main.py create mode 100644 readme.md diff --git a/__pycache__/engine.cpython-311.pyc b/__pycache__/engine.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c22f8796ab82ff993bac831ceebe622f4d4c19eb GIT binary patch literal 1886 zcmb7EJ#5=X6h2CnOi7d_OS1e^BsSW@iGU)3iw=bm6t%6^ZX4J`(4m3=f)-B_9f@>~ zN7oi)fI|ik9ulB{J9Kb|rf!oVLx&C>I%bRl0VWP8AfQv0LWMhd>bs+**l?FV@_W4Z zbMM}}cgG)-$v6U9da+nvml67t3j+dK(CJP193lf5QUjGx2(2I^^bi^0Cn1EM0s<;Y zhI9`V-cy2@DPqM&OG|Aww#K0Wu&0hyq3ciV-TsjBqIq;{-qjBmtv< z6d(;417rYMKn^et$O9$-lZN~dm8Ogc@M$9oIgPOBCsxh0FyYyne*rg*DTFG6#CU#u z90r{79f5MCJxCHJht^)7f#xR|G1w4UL~vYU(W9)OVO-8V#($kpt1R*a+x^6b&M< zRMmwkxLP$UCblZOEG860rmhZd}945nwUAt zJ+_Z?CxwMqg@s=~`0c|^q1Y`HJLARQX?LaE887e0eMQ|@4wOfqA7vh|ca(Ry@JBZP zh<>y8L*@A0XE&c0f4SS4TkOs)cCt&|>=Fc5dim*-{Eb)n8^`i9rIVlU=I5WUcJgJK9s!6J`39GX3rQ9p!pgx&CtS65isq!dpzyG)r${ zO=EFQYubhj8?P}{(;m2bBd~~8UD&}<(}KHfQSH1Nat-T*WFR2PahB%{el>`N^(tX% z#kL#59U8(E+iZx|u#{P|OlsPeMos8)jj4Kb1KJ63g`?h}CUp%AjuzGLV{MCI$8iZ} z>Nc*M6-czHI}S@3#N5V|=%%GLY*46tiJ^0Xx@5!FHf-CWEOa08!8>)`b%JFGKlUC%pCEQ1rRz3-OI1ll8vvV{vau82Yjl$-t2tuxL6m(??fXkUdYF z|F@eu+&@vp<;u>KJ3*g6BJ<$N|9;NL!1`fHl6;i##M75=OR&gQ_BYr4^B)GW`oGh7 B$W;IU literal 0 HcmV?d00001 diff --git a/engine.py b/engine.py new file mode 100644 index 0000000..a2f8ddb --- /dev/null +++ b/engine.py @@ -0,0 +1,50 @@ +import math + +class Engine: + rpm = 0 + throttle = 0 + load = 0 + instant_torque = 0 + gear = 0 + flywheel_inertia = 0 + idle_rpm = 750 + max_rpm = 6500 + + fuel_rate = 0 + afr = 0 + coolant_temp = 0 + oil_temp = 0 + + ignition_timing = 0 + + ambient_temp = 0 + altitude = 0 + intake_pressure = 0 + vehicle_mass = 0 + drivetrain_loss = 0 + + oil_pressure = 0 + turbo_boost = 0 + kr = 0 + exhaust_temp = 0 + + def start(self): + rpm = 250 + + def update(self, throttle, load, dt): + + if not self.running: + return + + self.throttle = throttle + self.load = load + + # Apply simplified engine RPM dynamics + rpm_change = (throttle - load) * self.torque_curve(self.rpm) / self.flywheel_inertia + self.rpm += rpm_change * dt + self.rpm = max(self.idle_rpm, min(self.rpm, self.max_rpm)) + + self.torque = self.torque_curve(self.rpm) * throttle + self.fuel_rate = self.rpm * throttle * self.fuel_efficiency + + self._update_temps(dt) diff --git a/main.py b/main.py new file mode 100644 index 0000000..789738d --- /dev/null +++ b/main.py @@ -0,0 +1,80 @@ +# 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) + +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 = "black" +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() + +while running: + # 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.QUIT: + running = False + + # fill the screen with a color to wipe away anything from last frame + screen.fill("white") + + # RPM + # Min = 0 at 45 degrees + # Max = 8 at 315 degrees + pygame.draw.circle(screen, "red", rpm_pos, gauge_radius) + rpm_tip = rpm_pos + offset_vector + pygame.draw.line(screen, needle_color, rpm_pos, rpm_tip, needle_width) + pygame.draw.circle(screen, needle_color, rpm_tip, tip_radius) + + # Trans Speed + # Min = 0 at 45 degrees + # Max = 160 at 315 degrees + 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]: + player_pos.y -= 300 * dt + if keys[pygame.K_s]: + player_pos.y += 300 * dt + if keys[pygame.K_a]: + player_pos.x -= 300 * dt + if keys[pygame.K_d]: + player_pos.x += 300 * dt + + # 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 + +pygame.quit() \ No newline at end of file diff --git a/readme.md b/readme.md new file mode 100644 index 0000000..e69de29