From 6e7f560bc9e8dfbb6edecc7dbf7e0b5d428692bd Mon Sep 17 00:00:00 2001 From: Daniele Verducci Date: Wed, 11 Jan 2023 19:50:37 +0100 Subject: [PATCH] WIP fps-independent movement speed --- v3/raycaster.py | 40 +++++++++++++++++++++------------------- 1 file changed, 21 insertions(+), 19 deletions(-) diff --git a/v3/raycaster.py b/v3/raycaster.py index 5b4892c..53f04c3 100755 --- a/v3/raycaster.py +++ b/v3/raycaster.py @@ -40,8 +40,8 @@ CEILING_COLOR = sdl2.ext.Color(0,128,255,255) FLOOR_COLOR = sdl2.ext.Color(64,64,64,255) # Player cfg -PLAYER_SPEED = 8 -PLAYER_ROTATION_SPEED = 0.1 +PLAYER_SPEED = 120 +PLAYER_ROTATION_SPEED = 2.0 PLAYER_SPAWN_POSITION = {"x": 1.5, "y": 1.5, "r": 1.7} # r is rotation in radiants # Dungeon data @@ -113,7 +113,7 @@ class Main: return def run(self): - lastFpsCalcTime = 0 + lastDraw = 0 frames = 0 running = True @@ -124,16 +124,30 @@ class Main: running = False break + # Calculate speed based on FPS + elapsed = time.time() - lastDraw + player_speed = int(PLAYER_SPEED * elapsed) + player_rot_speed = PLAYER_ROTATION_SPEED * elapsed + + lastDraw = time.time() + keystate = sdl2.SDL_GetKeyboardState(None) # Rotate player if keystate[sdl2.SDL_SCANCODE_LEFT]: - self.player_position["r"] = self.player_position["r"] - PLAYER_ROTATION_SPEED + self.player_position["r"] = self.player_position["r"] - player_rot_speed elif keystate[sdl2.SDL_SCANCODE_RIGHT]: - self.player_position["r"] = self.player_position["r"] + PLAYER_ROTATION_SPEED + self.player_position["r"] = self.player_position["r"] + player_rot_speed + + # Fix rotation + if self.player_position["r"] < 0: + self.player_position["r"] = math.pi * 2 + self.player_position["r"] + if self.player_position["r"] > math.pi * 2: + self.player_position["r"] = self.player_position["r"] - math.pi * 2 # Compute deltax and deltay based on player direction - player_delta_x = (math.cos(self.player_position["r"]) * PLAYER_SPEED) + 1 # "+ 1": Adjust for rounding errors - player_delta_y = math.sin(self.player_position["r"]) * PLAYER_SPEED + player_delta_x = math.cos(self.player_position["r"]) * player_speed + player_delta_y = math.sin(self.player_position["r"]) * player_speed + print(self.player_position["r"]) # Move player based on its direction if keystate[sdl2.SDL_SCANCODE_UP]: @@ -150,10 +164,6 @@ class Main: self.player_position["y"] = 0 if self.player_position["y"] > MAP_WIN_HEIGHT: self.player_position["y"] = MAP_WIN_HEIGHT - if self.player_position["r"] > 2*math.pi: - self.player_position["r"] = 0 - if self.player_position["r"] < 0: - self.player_position["r"] = 2*math.pi # Open doors if keystate[sdl2.SDL_SCANCODE_SPACE]: @@ -164,14 +174,6 @@ class Main: self.mapWindow.refresh() self.raycastWindow.refresh() - # Calculate FPS - frames = frames + 1 - if time.time() - lastFpsCalcTime > 1: - fps = frames/(time.time() - lastFpsCalcTime) - print(int(fps)) - frames = 0 - lastFpsCalcTime = time.time() - return 0 def movePlayerRelative(self, player_delta_x, player_delta_y):