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
|
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()
|
||||||
@@ -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)):
|
||||||
|
|||||||
Reference in new issue
Block a user