Python 如何在pygame中使用两种按键输入法?

Python 如何在pygame中使用两种按键输入法?,python,pygame,Python,Pygame,我发现我只能用一种方法输入键。下面我有两种方法(movementsprite和movementspritevert),我发现我只能有一个工作。如果我同时启动这两个,最上面的一个运行,第二个什么也不做。有办法解决这个问题吗?我做错什么了吗 原始程序 ----运动文件------ spritex = 320 spritey = 320 screen = pygame.display.set_mode((640, 640)) def movementsprite(events): glob

我发现我只能用一种方法输入键。下面我有两种方法(movementsprite和movementspritevert),我发现我只能有一个工作。如果我同时启动这两个,最上面的一个运行,第二个什么也不做。有办法解决这个问题吗?我做错什么了吗

原始程序 ----运动文件------

spritex = 320
spritey = 320
screen = pygame.display.set_mode((640, 640))
def movementsprite(events):  
    global spritex
    keys = pygame.key.get_pressed()

    for event in events:
         if event.type == pygame.QUIT:
             running = False
         elif event.type == pygame.KEYDOWN:

             if event.key == pygame.K_RIGHT:
                 if spritex == 576:
                     spritex += 0
                 else:
                     spritex += 32 

             elif event.key == pygame.K_LEFT:              
                 if spritex == 32:
                     spritex -= 0
                 else:
                     spritex -= 32

    return spritex
def movementspritevert(events):   
    global spritey
    keys = pygame.key.get_pressed()

    for event in events:
         if event.type == pygame.QUIT:
             running = False
         elif event.type == pygame.KEYDOWN:

             if event.key == pygame.K_DOWN:
                 if spritey == 576:
                     spritey += 0
                 else:
                     spritey += 32 

             elif event.key == pygame.K_UP:              
                 if spritey == 32:
                     spritey -= 0
                 else:
                     spritey -= 32

    return spritey
-------主文件-------]

------显示文件----

------可能的解决办法------------- -主文件----

-----显示文件-----

------密钥输入文件-----------

---错误---

回溯(最近一次呼叫最后一次):
文件“C:\Users\Eric\Dropbox\oryxgame\oryxgame.py”,第12行,在
背景资料
backgroundmain中第11行的文件“C:\Users\Eric\Dropbox\oryxgame\oryxdisplay.py”
spritey=movementspritevert(事件)
TypeError:movementspritevert()不接受任何参数(给定1个)

--------

问题在于event.get()从队列中删除事件(请参阅)。因此,当您的第二个函数使用event.get()时,队列中不会有任何剩余事件,除非它们能够在极短的调用间隔内滑入

要查看此问题的实际情况,请在pygame.event.get()中调用事件的
后,在第一个函数中放置一个
打印事件
,然后在第二个函数中尝试

解决这个问题的一个方法是

    events = pygame.event.get()
    function1(events)
    function2(events)
然后使用for循环覆盖
事件


编辑:以阐明如何实施

您的代码可能抛出错误,因为在初始化pygame之前调用了
pygame.event.get()
。你可以用这样的东西

def backgroundmain():
    events = pygame.event.get()                #save events
    spritex = movementsprite(events)           #added events arg
    spritey = movementspritevert(events)       #added events arg
    backdrop = pygame.Rect(0, 0, 640, 640) 
    screen.fill((50,50,50))
    playingfeildwidth = (32, 608)
    playingfeildheight = (32, 608)

    screen.blit(warrior1, (spritex, spritey))
然后,从以下位置更改移动功能:

def movementspritevert():   

    #Do stuff ...

    for event in pygame.event.get():
         if event.type == pygame.QUIT:
             running = False
         elif event.type == pygame.KEYDOWN:
为此:

def movementspritevert(events):   

    #Do stuff ...

    for event in events:
        if event.type == pygame.QUIT:
            running = False
        elif event.type == pygame.KEYDOWN:

关键是每次使用event.get()时,它都会删除事件,因此下次调用不会获得相同的事件。基本上,如果希望所有移动函数都使用一次按键,则将事件另存为变量并将其传递给函数。

问题在于event.get()会从队列中删除事件(请参阅)。因此,当您的第二个函数使用event.get()时,队列中不会有任何剩余事件,除非它们能够在极短的调用间隔内滑入

要查看此问题的实际情况,请在pygame.event.get()中调用事件的
后,在第一个函数中放置一个
打印事件
,然后在第二个函数中尝试

解决这个问题的一个方法是

    events = pygame.event.get()
    function1(events)
    function2(events)
然后使用for循环覆盖
事件


编辑:以阐明如何实施

您的代码可能抛出错误,因为在初始化pygame之前调用了
pygame.event.get()
。你可以用这样的东西

def backgroundmain():
    events = pygame.event.get()                #save events
    spritex = movementsprite(events)           #added events arg
    spritey = movementspritevert(events)       #added events arg
    backdrop = pygame.Rect(0, 0, 640, 640) 
    screen.fill((50,50,50))
    playingfeildwidth = (32, 608)
    playingfeildheight = (32, 608)

    screen.blit(warrior1, (spritex, spritey))
然后,从以下位置更改移动功能:

def movementspritevert():   

    #Do stuff ...

    for event in pygame.event.get():
         if event.type == pygame.QUIT:
             running = False
         elif event.type == pygame.KEYDOWN:
为此:

def movementspritevert(events):   

    #Do stuff ...

    for event in events:
        if event.type == pygame.QUIT:
            running = False
        elif event.type == pygame.KEYDOWN:


关键是每次使用event.get()时,它都会删除事件,因此下次调用不会获得相同的事件。基本上,如果您希望所有移动功能都使用一次按键,则将事件另存为变量并将其传递给功能。

是否发布了所有代码来演示您的问题?我看不到这些函数在哪里被调用或引用。我添加了其余的文件/代码。我想问题出在按键部分,所以我只把它包括在内@matt B为什么不能在movementsprite中使用两个globals,并简单地处理各种情况?另外,我注意到您实际上调用了这两个函数两次——在backgroundmain()中调用movementsprite,然后在同一个循环中再次调用它。每个循环只需读取一次输入。我试图使用两个全局的运动精灵,但它会导致精灵沿对角线移动@Dwerner您是否发布了所有代码来演示您的问题?我看不到这些函数在哪里被调用或引用。我添加了其余的文件/代码。我想问题出在按键部分,所以我只把它包括在内@matt B为什么不能在movementsprite中使用两个globals,并简单地处理各种情况?另外,我注意到您实际上调用了这两个函数两次——在backgroundmain()中调用movementsprite,然后在同一个循环中再次调用它。每个循环只需读取一次输入。我试图使用两个全局的运动精灵,但它会导致精灵沿对角线移动@德韦内尔所以我尝试了你的建议。我在我的函数上方的顶部添加了
events=pygame.event.get()
。我收到一个错误
错误:视频系统未初始化
。所以我删除了
()
。我知道我做错了。我在问题的底部添加了更改后的代码@ClosedIt听起来像是在pygame.init()之前使用了pygame.event.get()。我用一种方法更新了我的答案,你可以进行更改。所以我得到了一个错误
spritey=movementspritevert(events)
然后
TypeError:movementspritevert()不带参数(给定1个)
我不确定这是什么意思。你知道吗@关闭我不认为您已将调用更改为
def movementspritevert(事件):
。看看Closed写了什么并复制了它(请记住他忘了缩进
running=False
),谢谢你抓住了错误的凹痕!能否在脚本中搜索“def movementspritevert():”?正如HammyThepic所说,它看起来要么没有被更改(要么定义了不止一次)。因此我尝试了您的建议。我在函数上方的顶部添加了
events=pygame.event.get()
。我收到一个错误
错误:视频系统未初始化
。所以我删除了
()
。我知道我做错了。我在问题的底部添加了更改后的代码@ClosedIt听起来像是在pygame.init()之前使用了pygame.event.get()。我用一种你可以修改的方法更新了我的答案。所以我得到了错误
spritey=movementspr
def movementspritevert():   

    #Do stuff ...

    for event in pygame.event.get():
         if event.type == pygame.QUIT:
             running = False
         elif event.type == pygame.KEYDOWN:
def movementspritevert(events):   

    #Do stuff ...

    for event in events:
        if event.type == pygame.QUIT:
            running = False
        elif event.type == pygame.KEYDOWN: