Python 使用列表调用最后一个按键关闭事件
我正在编写一些代码,试图用Pygame掌握一些基本的动画。其中一些代码是从我找到的Pygame教程中借来的 我试图做的是使用一个列表来存储所有的按键事件,并最终使用该列表来绘制我的角色精灵,以面对释放按键后最近的移动方向(我还没有写任何关于回忆列表中最后一项的内容)。目前,我有我的精灵重绘面朝下,而没有键被按下 我遇到的问题是,虽然收集KEYDOWN事件的函数确实会被调用,并在我每次按键时生成输出,但按键不会附加到列表中,控制台在每次按键时只显示空括号 我相信可能会有一个更有效的解决方案,我意识到其中的一些代码可能有点僵硬,但我当然会感谢任何指导Python 使用列表调用最后一个按键关闭事件,python,pygame,Python,Pygame,我正在编写一些代码,试图用Pygame掌握一些基本的动画。其中一些代码是从我找到的Pygame教程中借来的 我试图做的是使用一个列表来存储所有的按键事件,并最终使用该列表来绘制我的角色精灵,以面对释放按键后最近的移动方向(我还没有写任何关于回忆列表中最后一项的内容)。目前,我有我的精灵重绘面朝下,而没有键被按下 我遇到的问题是,虽然收集KEYDOWN事件的函数确实会被调用,并在我每次按键时生成输出,但按键不会附加到列表中,控制台在每次按键时只显示空括号 我相信可能会有一个更有效的解决方案,我意识
def get_pygame_events():
pygame_events = pygame.event.get()
return pygame_events
def last_pressed():
global running
keys_pressed = get_pygame_events()
keys_pressed_list = []
for event in keys_pressed:
if event.type == pygame.KEYDOWN:
if event.key == K_LEFT:
keys_pressed_list.append("left")
elif event.key == K_RIGHT:
keys_pressed_list.append("right")
elif event.key == K_UP:
keys_pressed_list.append("up")
elif event.key == K_DOWN:
keys_pressed_list.append("down")
elif event.key == K_ESCAPE:
running = False
if event.type == QUIT:
running = False
print(keys_pressed_list)
#main loop
running = True
while running:
clock.tick(18)
for event in pygame.event.get():
if event.type == KEYDOWN:
last_pressed()
if event.key == K_ESCAPE:
running = False
elif event.type == QUIT:
running = False
keys = pygame.key.get_pressed()
if keys[pygame.K_LEFT] and char_x > 5:
char_x -= velocity
move_left = True
move_right = False
move_down = False
move_up = False
elif keys[pygame.K_RIGHT] and char_x < win_x - char_width//2 - 5:
char_x += velocity
move_right = True
move_left = False
move_down = False
move_up = False
elif keys[pygame.K_UP] and char_y > 5:
char_y -= velocity
move_up = True
move_down = False
move_right = False
move_left = False
elif keys[pygame.K_DOWN] and char_y < win_y - char_height//2 - 5:
char_y += velocity
move_down = True
move_up = False
move_right = False
move_left = False
else:
move_down = False
move_up = False
move_right = False
move_left = False
redrawGameWindow()
def get_pygame_events():
pygame_events=pygame.event.get()
返回pygame_事件
上次按def时()
全球运行
按键按下=获取游戏事件()
按键\u按下\u列表=[]
对于按键中的事件,\u按下:
如果event.type==pygame.KEYDOWN:
如果event.key==K_LEFT:
按键按下列表。追加(“左”)
elif event.key==K_RIGHT:
按键按下列表。追加(“右”)
elif event.key==K_UP:
按键按下列表。追加(“向上”)
elif event.key==K_DOWN:
按键\u按下\u列表。追加(“向下”)
elif event.key==K_转义:
运行=错误
如果event.type==退出:
运行=错误
打印(按键按下列表)
#主回路
运行=真
运行时:
时钟滴答(18)
对于pygame.event.get()中的事件:
如果event.type==KEYDOWN:
上一次()
如果event.key==K_转义:
运行=错误
elif event.type==退出:
运行=错误
keys=pygame.key.get_pressed()
如果键[pygame.K_LEFT]和char_x>5:
char_x-=速度
向左移动=真
向右移动=错误
向下移动=错误
上移=假
elif键[pygame.K_RIGHT]和char_x5:
char_y-=速度
上移=真
向下移动=错误
向右移动=错误
向左移动=错误
elif键[pygame.K_DOWN]和char_y
这里有两个问题,第一个按键\u按下\u列表
是上次按下()函数中的一个局部变量。所以它实际上只在函数执行时存在。您可以全局声明它以增加范围。可能会对这个问题有更多的了解
第二个问题是,keys\u pressed\u list
在last\u pressed()
函数的开头被设置为空,因此即使它是全局范围,列表仍然会被清空
一些代码如下:
keys_pressed_list = []
def last_pressed():
global running, keys_pressed_list
keys_pressed = get_pygame_events()
for event in keys_pressed:
if event.type == pygame.KEYDOWN:
if event.key == K_LEFT:
keys_pressed_list.append("left")
...
将修复这些范围,并清除问题
根据您的描述,听起来您只需要录制最近按下的按键。这是为了确定播放器位图的最终方向(对吗?)。因此,代码实际上只需要记住最后按下的键,而不是整个列表。也就是说,代码基本相同
last_key_pressed = None # any non-movement key
def last_pressed():
global running, last_key_pressed
keys_pressed = get_pygame_events()
for event in keys_pressed:
if event.type == pygame.KEYDOWN:
if event.key == K_LEFT:
last_key_pressed = K_LEFT
...
当然,这不适用于上次按下多个键的情况,但这可能并不重要。这里有两个问题,第一个问题是keys\u pressed\u list
是last\u pressed()
函数中的局部变量。所以它实际上只在函数执行时存在。您可以全局声明它以增加范围。可能会对这个问题有更多的了解
第二个问题是,keys\u pressed\u list
在last\u pressed()
函数的开头被设置为空,因此即使它是全局范围,列表仍然会被清空
一些代码如下:
keys_pressed_list = []
def last_pressed():
global running, keys_pressed_list
keys_pressed = get_pygame_events()
for event in keys_pressed:
if event.type == pygame.KEYDOWN:
if event.key == K_LEFT:
keys_pressed_list.append("left")
...
将修复这些范围,并清除问题
根据您的描述,听起来您只需要录制最近按下的按键。这是为了确定播放器位图的最终方向(对吗?)。因此,代码实际上只需要记住最后按下的键,而不是整个列表。也就是说,代码基本相同
last_key_pressed = None # any non-movement key
def last_pressed():
global running, last_key_pressed
keys_pressed = get_pygame_events()
for event in keys_pressed:
if event.type == pygame.KEYDOWN:
if event.key == K_LEFT:
last_key_pressed = K_LEFT
...
当然,这不适用于上次按下多个键的情况,但这可能并不重要。它看起来像是在上次按下的中,您每次按下键时,都会将键列表设置为空列表。尝试在每次新按键时检查的循环之外的某个地方声明按键列表
。它看起来像是在上次按键
中,您每次使用此按键列表=[]
时都再次将按键列表
设置为空列表。尝试在每次按下新键时检查的循环之外的某个地方声明键\u pressed\u list
。