如何通过按住按钮让pygame中的对象移动?

时间:2017-03-08 21:33:26

标签: python python-2.7 pygame

我尝试使用类似的东西,但它没有用。

while running:
keys = pygame.key.get_pressed()  #checking pressed keys
if keys[pygame.K_UP]:
    y1 -= 1
if keys[pygame.K_DOWN]:
    y1 += 1

这是我目前的代码。我尝试使用不同的方法,因为上述方法对我不起作用。它一次只按一下按钮。

import pygame
spaceX = 100
spaceY = 100
pygame.init
black = (0,0,0)
size = (800, 800)
screen = pygame.display.set_mode(size)

def game(spaceX, spaceY):
    spaceship_file = 'spaceship.png'
    spaceship_image = pygame.image.load(spaceship_file)
    spaceship = pygame.transform.scale(spaceship_image, (30, 30))
    screen.fill(black)
    screen.blit(spaceship, (spaceX, spaceY))
    pygame.display.flip()

    while True:
        for event2 in pygame.event.get():
            if event2.type == pygame.KEYDOWN and event2.key == pygame.K_LEFT:
                spaceX2 = spaceX - 5
                game(spaceX2, spaceY)

            elif event2.type == pygame.KEYDOWN and event2.key == pygame.K_RIGHT:
                spaceX2 = spaceX + 5
                game(spaceX2, spaceY)

game(spaceX, spaceY)

编辑:

我现在有了这个代码。我的对象仍然只在我反复点击按钮时移动,而不是在我按住它时移动。

def game(spaceX, spaceY):

    while True:
        screen.fill(black)
        screen.blit(spaceship, (spaceX, spaceY))
        pygame.display.flip()
        keys = pygame.key.get_pressed()

        for event in pygame.event.get():
            if keys[pygame.K_LEFT]:
                spaceX = spaceX - 5
                game(spaceX, spaceY)

            elif keys[pygame.K_RIGHT]:
                spaceX = spaceX + 5
                game(spaceX, spaceY)

3 个答案:

答案 0 :(得分:3)

有两种方法可以检查密钥输入,无论它们是在事件队列中还是检查其当前状态。

事件队列

当按键被按下或重新发布时,它们会被放入事件队列中,因此您无法直接判断密钥是否被保留。有两种方法:

  1. 在进入主循环之前调用pygame.key.set_repeat(True)。这将重复将KEYDOWN事件放入事件队列中,只要它被保留。

  2. 引入速度变量。当用户按下键时将速度设置为某个速度,并在用户抬起键时将速度设置为0。

  3. 例如:

    for event in pygame.event.get():
        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_LEFT:
                velocity_x = -5
            elif event.key == pygame.K_RIGHT:
                velocity_x = 5
        elif event.type == pygame.KEYUP:
            if event.key == pygame.K_LEFT:
                velocity_x = 0
            elif event.key == pygame.K_RIGHT:
                velocity_x = 0
    
    position_x += velocity_x
    

    状态检查

    通过调用pygame.key.get_pressed()获取密钥的当前状态。您必须调用pygame.event中的一个函数才能让pygame执行一些必要的内部操作,因此如果您不想使用事件队列,请使用pygame.event.pump()。如果你不这样做,你的操作系统会认为pygame已经崩溃,导致游戏没有响应。虽然,您通常希望处理pygame.QUIT事件,因此用户可以退出。

    pygame.event.pump()
    keys = pygame.key.get_pressed()
    if keys[pygame.K_LEFT]:
        position_x -= 5
    elif keys[pygame.K_RIGHT]:
        position_x += 5
    

答案 1 :(得分:0)

此问题的一个解决方案是使用set_repeat函数

pygame.key.set_repeat(True)

这将生成多个KEYDOWN个事件。

答案 2 :(得分:0)

尝试将密钥添加到你的pygame for循环中。所以看起来应该是这样......

while running:
for event in pygame.event.get():
    keys = pygame.key.get_pressed()  #checking pressed keys
        if keys[pygame.K_UP]:
        y1 -= 1

        if keys[pygame.K_DOWN]:
        y1 += 1