首先,这是我的代码:
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;右键"按压..
我该如何解决?问题是什么?
答案 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!