forked from zhiyuan/Project1
归一化移动
This commit is contained in:
1 parent
a180a5f123
commit
2896919bb9
2 files changed
+48
-48
No files matched your search
+44
-10
@@ -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
|
||||
def update(self, keys, dt):
|
||||
self.handle_input(keys, dt)
|
||||
self.show()
|
||||
@@ -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)):
|
||||
|
||||
Reference in new issue
Block a user