首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >游戏-运动加速

游戏-运动加速
EN

Stack Overflow用户
提问于 2018-04-10 11:17:54
回答 3查看 4.9K关注 0票数 1

我想在python/pygame中编写一个脚本,当您按住移动按钮时,将使字符加速(因此,当我按住左键时,字符会加速到特定的速度,然后速度会平缓,当我释放键时,它的速度会慢慢降低,直到完全停止)。

目前,我的代码将认识到字符必须加快速度,但是速度的变化只发生在每次我按下并释放键时(例如:第一个键按的速度是1,第二个键的速度是2,直到第五个或第六个键的最高速度,然后再重置)。

我想写我的代码,所以这意味着字符将加速,而关键是按住,而不需要多次按。

下面是到目前为止我的代码中的移动部分(还有一些随机比特):

代码语言:javascript
复制
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)

这两个变量按分配给一个变量的键将另一个变量重置为零,因此当下一个变量被调用时,当按下相反的按钮时,它将从零加速。一旦任何一个变量达到最大速度,它就会重新设置按钮何时释放,这意味着字符可以再次加速。

如果有任何方法使这个工作(以及整理代码,如果你能够),那么如何使它发挥作用的指导将是非常感激的。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-04-10 17:02:30

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

要使对象减速,可以在没有按键的情况下,将值小于1的x_change相乘。

代码语言:javascript
复制
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()
票数 2
EN

Stack Overflow用户

发布于 2019-04-10 11:57:52

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

代码语言:javascript
复制
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就会返回到它的原始值。

票数 0
EN

Stack Overflow用户

发布于 2020-05-13 13:16:17

凯文,你提到的是一个关键点,但这是一个很容易解决的问题,你只需要用一些东西来代替减速代码,检查x_change是正的还是负的,然后在你搞清楚之后再加或减。

例如,他的代码是:

代码语言:javascript
复制
if accel_x == 0:
    x_change *= 0.92

代之以大致如下的内容:

代码语言:javascript
复制
if accel_x == 0:
    if x_change > 0:
        x_change -= 0.2
        if x_change < 0.2:
            x_change = 0
    elif x_change < 0:
        x_change += 0.2
        if x_change > -0.2:
            x_change = 0
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49752275

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档