diff --git a/src/entity/player.py b/src/entity/player.py index a25c2e9..5cd2791 100644 --- a/src/entity/player.py +++ b/src/entity/player.py @@ -1,3 +1,5 @@ +import math + import pygame from src.config.color import Color @@ -9,18 +11,50 @@ class Player: screen_rect = self.screen.get_rect() self.x = screen_rect.centerx self.y = screen_rect.centery - self.v = 0.1 - self.status = [] + self.v = 0.0 + self.base_speed = 3.0 + self.run_multiplier = 2.5 + self.is_running = False - def move(self, dx, dy): - if "run" in self.status: - dx *= 5 - dy *= 5 - self.x += dx - self.y += dy + def move(self, dx, dy, dt): + """ + 归一化移动,避免斜向移动过快 + """ + magnitude = math.hypot(dx, dy) + if magnitude > 0: + dx /= magnitude + dy /= magnitude + speed = self.base_speed + if self.is_running: + speed *= self.run_multiplier + + # 应用速度和时间差 (dt),实现帧率无关的移动 + dt /= 1000.0 # 注意:这里 dt 是以秒为单位的浮点数 + self.x += dx * speed * dt * 60 # 乘以 60 是为了兼容 60FPS 下的体感速度 + self.y += dy * speed * dt * 60 + + def handle_input(self, keys, dt): + drx = 0 + dry = 0 + if keys[pygame.K_LEFT] or keys[pygame.K_a]: + drx -= 1 + if keys[pygame.K_RIGHT] or keys[pygame.K_d]: + drx += 1 + if keys[pygame.K_UP] or keys[pygame.K_w]: + dry -= 1 + if keys[pygame.K_DOWN] or keys[pygame.K_s]: + dry += 1 + # 按下shift冲刺 + if keys[pygame.K_LSHIFT]: + self.is_running = True + else: + self.is_running = False + # 移动 + self.move(drx, dry, dt) def show(self): pygame.draw.circle(self.screen, Color.white, (int(self.x), int(self.y)), 10) - def update(self): - pass \ No newline at end of file + def update(self, keys, dt): + self.handle_input(keys, dt) + self.show() \ No newline at end of file diff --git a/src/scenes/space_scene.py b/src/scenes/space_scene.py index 81d37e3..1ce115e 100644 --- a/src/scenes/space_scene.py +++ b/src/scenes/space_scene.py @@ -46,20 +46,11 @@ class SpaceScene(BaseScene): """ 场景每帧更新逻辑 """ - # 移动玩家 - player_move_distance = self.player.v * dt - if self.Left_status: - self.player.move(-player_move_distance, 0) - if self.right_status: - self.player.move(player_move_distance, 0) - if self.up_status: - self.player.move(0, -player_move_distance) - if self.down_status: - self.player.move(0, player_move_distance) - # 显示玩家 - self.player.show() - self.__show(self.player.status) + # 玩家更新,接收键盘输入与每帧间隔 + self.player.update(pygame.key.get_pressed(), dt) + + self.__show("加速:"+str(self.player.is_running)) def handle_event(self, event): """ @@ -68,31 +59,6 @@ class SpaceScene(BaseScene): if event.type == pygame.KEYDOWN: if event.key == pygame.K_ESCAPE: self.switch_to_scene("MainMenuScene") - elif event.key == pygame.K_LEFT or event.key == pygame.K_a: - self.Left_status = True - elif event.key == pygame.K_RIGHT or event.key == pygame.K_d: - self.right_status = True - elif event.key == pygame.K_UP or event.key == pygame.K_w: - self.up_status = True - elif event.key == pygame.K_DOWN or event.key == pygame.K_s: - self.down_status = True - if event.key == pygame.K_LSHIFT: - if "run" not in self.player.status: - self.player.status.append("run") - - # 松开按键 - elif event.type == pygame.KEYUP: - if event.key == pygame.K_LEFT or event.key == pygame.K_a: - self.Left_status = False - elif event.key == pygame.K_RIGHT or event.key == pygame.K_d: - self.right_status = False - elif event.key == pygame.K_UP or event.key == pygame.K_w: - self.up_status = False - elif event.key == pygame.K_DOWN or event.key == pygame.K_s: - self.down_status = False - if event.key == pygame.K_LSHIFT: - if "run" in self.player.status: - self.player.status.remove("run") def __show(self, info, dest=(0, 0)):