Pygame - 当我按下按钮然后再按下另一个按钮

时间:2016-08-18 11:00:33

标签: python pygame

首先,这是我的代码:

while not crashed:
    curr_event = pygame.event.get()
    if (len(curr_event) == 2):
            print curr_event[0],'\n',curr_event[1],'\n\n\n'

    for event in curr_event:
        if event.type == pygame.KEYUP and not len(curr_event) == 1:
            continue
        if event.type == pygame.QUIT:
            crashed = True

        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_LEFT:
                x_change = -5
            elif event.key == pygame.K_RIGHT:
                x_change = 5

        if event.type == pygame.KEYUP:
            x_change = 0
    x += x_change
    Display.fill((255, 255, 255))
    car(x,y)
    pygame.display.update()
    clock.tick(100)

这应该是尝试从右到左平稳地移动并且相反。 一切都很好,例如,我按下"左键"并等待2秒然后按"右键"。 但是 - 当我按下"左键"时,请保留键,然后按下"右键" - "关键"正在粉碎我的右键,播放器停在屏幕上。

我认为这是因为当第一个有"右键按下"时创建了2个索引的列表。而第二个有"键起来",所以我试着这样做:

if event.type == pygame.KEYUP and not len(curr_event) == 1:
            continue

正如您在我的代码中看到的那样。 嗯......有时情况就是这样......但有时它并没有创建一个带有两个索引的列表 - 但是粉碎了#34;右键"按压..

我该如何解决?问题是什么?

1 个答案:

答案 0 :(得分:0)

移动鼠标,按下按钮和其他操作将计为事件并放入队列中,因此代码if event.type == pygame.KEYUP and not len(curr_event) == 1: continue可能不可靠。

解决方案

您可以检查按钮的状态(如果按下或不按下),而不仅仅是按下和释放按钮的状态。 pygame.key.get_pressed()返回当前状态的所有键的列表:如果没有被按下则返回0,如果被按下则返回1。列表中的关键位置是它的整数常量表示。

key = pygame.key.get_pressed()
if key[pygame.K_LEFT]:
    x_change = -5
elif key[pygame.K_RIGHT]:
    x_change = 5

这没有跟踪是先按或按下的是什么,所以如果您按住两个按键,它就会向左移动。我尝试过另一种效果很好的解决方案。它基本上是一个列表,用于跟踪列表中的按键,并根据按下的最后一个键移动播放器。

import pygame
pygame.init()

screen = pygame.display.set_mode((500, 200))
clock = pygame.time.Clock()

x, y = 100, 100
car = pygame.Surface((32, 32))
velocity_dx = []
speed = 5
while True:
    clock.tick(60)

    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            quit()
        elif event.type == pygame.KEYDOWN:
            if event.key == pygame.K_LEFT:
                velocity_dx.insert(0, -speed)
            elif event.key == pygame.K_RIGHT:
                velocity_dx.insert(0, speed)
        elif event.type == pygame.KEYUP:
            if event.key == pygame.K_LEFT:
                velocity_dx.remove(-speed)
            elif event.key == pygame.K_RIGHT:
                velocity_dx.remove(speed)

    try:
        x += velocity_dx[0]  # Take the first value from the list
    except IndexError:  # if list is empty, catch the IndexError.
        pass
    screen.fill((255, 255, 255))
    screen.blit(car, (x, y))
    pygame.display.update()

    # print(velocity_dx)  # Uncomment to see what's happening in action!