我在pygame中做了一个自上而下的运动系统,包括加速度和摩擦力(红色方块是玩家):
import pygame
pygame.init()
running = True
x = 0
y = 0
speed = 3
friction = 10
clock = pygame.time.Clock()
FPS = 60
screen = pygame.display.set_mode((800, 650))
screen_rect = screen.get_rect()
player = pygame.Rect(25, 25, 50, 50)
player.center = (400, 325)
while running:
deltatime = clock.tick(60) * 0.001 * FPS
screen.fill((0,0,0))
pygame.draw.rect(screen, (255,0,0), player)
key = pygame.key.get_pressed()
if key[pygame.K_a] or key[pygame.K_LEFT] == True:
x -= speed
if key[pygame.K_d] or key[pygame.K_RIGHT] == True:
x += speed
if key[pygame.K_w] or key[pygame.K_UP] == True:
y -= speed
if key[pygame.K_s] or key[pygame.K_DOWN] == True:
y += speed
x = ((100 - friction) / 100) * x
y = ((100 - friction) / 100) * y
player.move_ip(x / 2, y / 2)
player.clamp_ip(screen_rect)
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
pygame.display.flip()
pygame.quit()
当玩家正常朝一个方向行进时,移动是没有问题的。然而,每当它沿对角线移动时,它就会走得更快。有什么办法可以解决这个问题,同时保持加速度和摩擦运动系统相同?
沿对角线移动时,您同时在两个方向上应用大小为
speed
的偏移,总对角线偏移为 sqrt(speed^2 + speed^2) = sqrt(2) * speed ≈ 1.414 * speed。为了防止这种情况发生,只需将运动标准化为 speed
的幅度即可。您可以将偏移量存储在 vector 中并使用 scale_to_length
来执行此操作,或者如果同时按下水平键和垂直键,则可以将 x
和 y
偏移量除以 sqrt(2)。