Pygame - 运动加速

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Pygame - 运动加速相关的知识,希望对你有一定的参考价值。

我想在python / pygame中创建一个脚本,当你按住一个移动按钮时,它会使角色加速(所以,当我按住左键时,角色会加速到特定的速度,然后速度会均匀,当我松开钥匙它会慢慢减速直到完全停止。)

此刻,我的代码会识别出角色必须加速,但速度的变化只会在每次按下并释放按键时发生(例如:第一次按键的速度为1,第二次按下的速度为2,在重置前,一直到最高速度的第五或第六次按下。)

我想编写我的代码,这意味着当按键被按下而不需要多次按下时,角色会加速。

到目前为止,我的代码是运动部分(周围有几个随机位):

x = (display_width * 0.45)
y = display_height * 0.8
x_change = 0
negx = 0
posx = 0
bun_speed = 0

while not crashed:
        for event in pygame.event.get():
                if event.type == pygame.QUIT:
                        crashed = True
            if event.type == pygame.KEYDOWN:
                    if event.key == pygame.K_LEFT:
                        posx = 0
                        if negx != -5:
                            negx = negx - 1
                            x_change = negx
                        elif negx == -5:
                            negx = 0
                            x_change = -5
                    elif event.key == pygame.K_RIGHT:
                        negx = 0
                        if posx != 5:
                            posx = posx + 1
                            x_change = posx
                        elif posx == 5:
                            posx = 0
                            x_change = 5
            if event.type == pygame.KEYUP:
                if event.key == pygame.K_LEFT:
                        x_change = 0
                elif event.key == pygame.K_RIGHT:
                        x_change = 0
    x += x_change

    display.fill(white)
    bunny(x,y)

    pygame.display.update()
    clock.tick(60)

两个变量negx和posx分别根据按下的键减小和增加。按下分配给一个变量的键会将另一个键重置为零,因此当按下相反按钮时接下来调用该变量时,它将从零加速。一旦任一变量达到最大速度,它将在按钮释放时重置,这意味着角色可以再次加速。

如果有任何方法可以使这项工作(以及如果你能够完成代码),那么关于如何使其发挥作用的指导将非常感激。

答案

为加速度定义变量(示例中为accel_x),在事件循环中将其设置为所需的值,并将其添加到每帧的x_change以加速。要将x_change限制为最大速度,您必须将其标准化并将其乘以max_speed

要减速对象,可以在没有按键时将x_change乘以低于1的值。

import pygame


pygame.init()
display = pygame.display.set_mode((640, 480))
clock = pygame.time.Clock()
GRAY = pygame.Color('gray12')
display_width, display_height = display.get_size()
x = display_width * 0.45
y = display_height * 0.8
x_change = 0
accel_x = 0
max_speed = 6

crashed = False
while not crashed:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
                crashed = True
        elif event.type == pygame.KEYDOWN:
            # Set the acceleration value.
            if event.key == pygame.K_LEFT:
                accel_x = -.2
            elif event.key == pygame.K_RIGHT:
                accel_x = .2
        elif event.type == pygame.KEYUP:
            if event.key in (pygame.K_LEFT, pygame.K_RIGHT):
                accel_x = 0

    x_change += accel_x  # Accelerate.
    if abs(x_change) >= max_speed:  # If max_speed is exceeded.
        # Normalize the x_change and multiply it with the max_speed.
        x_change = x_change/abs(x_change) * max_speed

    # Decelerate if no key is pressed.
    if accel_x == 0:
        x_change *= 0.92

    x += x_change  # Move the object.

    display.fill(GRAY)
    pygame.draw.rect(display, (0, 120, 250), (x, y, 20, 40))

    pygame.display.update()
    clock.tick(60)

pygame.quit()
另一答案

我找到了另一种加速角色的方法。而不是改变距离,改变时间。我定义了一个变量,它位于pygame.time.delay()中,延迟是我改变的。这样做更好,因为当从一个地方移动到另一个地方时,角色看起来不像是一个小故障。

import pygame
pygame.init()

win = pygame.display.set_mode((500, 500))
pygame.display.set_caption("ACCELERATE")

def main():

    k = True

    thita = 40
    x = 250
    y = 400

    while k:

        keys = pygame.key.get_pressed()

        for event in pygame.event.get():
            if event.type == pygame.KEYUP:
                if event.key == pygame.K_LEFT:
                    thita = 40
                if event.key == pygame.K_RIGHT:
                    thita = 40
            if event.type == pygame.QUIT:
                k = False

        if keys[pygame.K_LEFT]:
            x -= 4
            pygame.time.delay(thita)
            if thita > 12:
                thita -= 1
        if keys[pygame.K_RIGHT]:
            x += 4
            pygame.time.delay(thita)
            if thita > 11:
                thita -= 1

        pygame.draw.rect(win, (255, 0, 0), (x, y, 10, 10))
        pygame.display.update()
        win.fill((0, 0, 0))

main()

一旦我们拿起钥匙,你就会看到thita恢复原来的价值。

以上是关于Pygame - 运动加速的主要内容,如果未能解决你的问题,请参考以下文章

Pygame移动加速问题,平台游戏[重复]

Pygame碰撞检测

Pygame 生涩的玩家运动

unity 如何让物体匀加速和匀减速运动,求代码

如何在pygame中进行平滑运动

使用pygame进行连续运动的问题