对角线移动速度更快,使用加速和摩擦移动系统(pygame)

问题描述 投票:0回答:1

我在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()

当玩家正常朝一个方向行进时,移动是没有问题的。然而,每当它沿对角线移动时,它就会走得更快。有什么办法可以解决这个问题,同时保持加速度和摩擦运动系统相同?

python pygame
1个回答
0
投票

沿对角线移动时,您同时在两个方向上应用大小为

speed
的偏移,总对角线偏移为 sqrt(speed^2 + speed^2) = sqrt(2) * speed ≈ 1.414 * speed。为了防止这种情况发生,只需将运动标准化为
speed
的幅度即可。您可以将偏移量存储在 vector 中并使用
scale_to_length
来执行此操作,或者如果同时按下水平键和垂直键,则可以将
x
y
偏移量除以 sqrt(2)。

© www.soinside.com 2019 - 2024. All rights reserved.