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