归一化移动

This commit is contained in:
chicrobot committed 2026-08-05 23:46:21 +08:00
1 parent a180a5f123
commit 2896919bb9
2 files changed
+48 -48

No files matched your search

+44 -10
View File
@@ -1,3 +1,5 @@
import math
import pygame import pygame
from src.config.color import Color from src.config.color import Color
@@ -9,18 +11,50 @@ class Player:
screen_rect = self.screen.get_rect() screen_rect = self.screen.get_rect()
self.x = screen_rect.centerx self.x = screen_rect.centerx
self.y = screen_rect.centery self.y = screen_rect.centery
self.v = 0.1 self.v = 0.0
self.status = [] self.base_speed = 3.0
self.run_multiplier = 2.5
self.is_running = False
def move(self, dx, dy): def move(self, dx, dy, dt):
if "run" in self.status: """
dx *= 5 归一化移动,避免斜向移动过快
dy *= 5 """
self.x += dx magnitude = math.hypot(dx, dy)
self.y += 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): def show(self):
pygame.draw.circle(self.screen, Color.white, (int(self.x), int(self.y)), 10) pygame.draw.circle(self.screen, Color.white, (int(self.x), int(self.y)), 10)
def update(self): def update(self, keys, dt):
pass self.handle_input(keys, dt)
self.show()
+4 -38
View File
@@ -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) self.player.update(pygame.key.get_pressed(), dt)
if self.right_status:
self.player.move(player_move_distance, 0) self.__show("加速:"+str(self.player.is_running))
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)
def handle_event(self, event): def handle_event(self, event):
""" """
@@ -68,31 +59,6 @@ class SpaceScene(BaseScene):
if event.type == pygame.KEYDOWN: if event.type == pygame.KEYDOWN:
if event.key == pygame.K_ESCAPE: if event.key == pygame.K_ESCAPE:
self.switch_to_scene("MainMenuScene") 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)): def __show(self, info, dest=(0, 0)):