Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/343.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用列表调用最后一个按键关闭事件_Python_Pygame - Fatal编程技术网

Python 使用列表调用最后一个按键关闭事件

Python 使用列表调用最后一个按键关闭事件,python,pygame,Python,Pygame,我正在编写一些代码,试图用Pygame掌握一些基本的动画。其中一些代码是从我找到的Pygame教程中借来的 我试图做的是使用一个列表来存储所有的按键事件,并最终使用该列表来绘制我的角色精灵,以面对释放按键后最近的移动方向(我还没有写任何关于回忆列表中最后一项的内容)。目前,我有我的精灵重绘面朝下,而没有键被按下 我遇到的问题是,虽然收集KEYDOWN事件的函数确实会被调用,并在我每次按键时生成输出,但按键不会附加到列表中,控制台在每次按键时只显示空括号 我相信可能会有一个更有效的解决方案,我意识

我正在编写一些代码,试图用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