Python 如何在pygame中获得键盘输入?
我正在PyGame1.9.2中制作一个游戏。 这是一个失败的简单游戏,其中一艘船在五列坏人之间移动,这些坏人通过缓慢向下移动进行攻击。我正试图让它,使船舶左,右移动与左右箭头键。这是我的密码:Python 如何在pygame中获得键盘输入?,python,pygame,keyboard,Python,Pygame,Keyboard,我正在PyGame1.9.2中制作一个游戏。 这是一个失败的简单游戏,其中一艘船在五列坏人之间移动,这些坏人通过缓慢向下移动进行攻击。我正试图让它,使船舶左,右移动与左右箭头键。这是我的密码: keys=pygame.key.get_pressed() 如果键[K_左]: 位置-=1 如果位置==-1: 位置=0 如果键[K_RIGHT]: 位置+=1 如果位置==5: 位置=4 它工作得太好了。船开得太快了。几乎不可能让它只移动一个位置,向左或向右。我怎样才能使飞船在每次按键时只移动一次呢?
keys=pygame.key.get_pressed()
如果键[K_左]:
位置-=1
如果位置==-1:
位置=0
如果键[K_RIGHT]:
位置+=1
如果位置==5:
位置=4
它工作得太好了。船开得太快了。几乎不可能让它只移动一个位置,向左或向右。我怎样才能使飞船在每次按键时只移动一次呢?你可以从pygame获取事件,然后注意
KEYDOWN
事件,而不是查看get_pressed()返回的按键。
(它提供当前按下的键,而KEYDOWN
事件显示该帧上按下的键)
你的代码现在的情况是,如果你的游戏以30fps的速度渲染,并且你按住左箭头键半秒,你会更新15次位置
events=pygame.event.get()
对于事件中的事件:
如果event.type==pygame.KEYDOWN:
如果event.key==pygame.K_左:
位置-=1
如果event.key==pygame.K_RIGHT:
位置+=1
为了在按住关键点的同时支持连续移动,您必须建立某种限制,或者基于游戏循环的强制最大帧速率,或者通过一个计数器,该计数器只允许您在循环中每隔这么多次移动一次
move\u ticker=0
keys=pygame.key.get_pressed()
如果键[K_左]:
如果move_ticker==0:
移动股票代码=10
位置-=1
如果位置==-1:
位置=0
如果键[K_RIGHT]:
如果move_ticker==0:
移动股票代码=10
位置+=1
如果位置==5:
位置=4
然后在游戏循环中的某个地方,你会做如下操作:
如果移动\u ticker>0:
移动股票代码-=1
这将只允许您每10帧移动一次(因此,如果您移动,股票代码将设置为10,10帧后将允许您再次移动)您应该使用
时钟。如中所述,勾选(10)
。尝试以下操作:
keys=pygame.key.get_pressed()
if keys[K_LEFT]:
if count == 10:
location-=1
count=0
else:
count +=1
if location==-1:
location=0
if keys[K_RIGHT]:
if count == 10:
location+=1
count=0
else:
count +=1
if location==5:
location=4
这意味着你只移动了1/10的时间。如果它仍然移动得很快,你可以尝试增加你设置的“计数”值。import pygame
pygame.init()
pygame.display.set_mode()
尽管如此:
对于pygame.event.get()中的事件:
如果event.type==pygame.QUIT:
pygame.quit();#sys.exit()如果导入sys
如果event.type==pygame.KEYDOWN:
如果event.key==pygame.K_0:
打印(“嘿,你按了‘0’!”)
如果event.key==pygame.K_1:
打印(“做任何事”)
请注意,K_0和K_1并不是唯一的键,要查看所有键,请参阅pygame文档,否则,请在键入后点击tab
皮加梅
(注意.after pygame)进入一个空闲程序。注意K必须是大写。还要注意,如果你不给pygame一个显示大小(pass no args),那么它将自动使用计算机屏幕/显示器的大小。愉快的编码!以上所有答案都太复杂了,我只需将变量改为0.1,而不是1 这使船慢了10倍 如果仍然过快,则将变量更改为0.01 这使船慢了100倍 试试这个
仅供参考,如果你想确保飞船不会因为
location-=1
if location==-1:
location=0
你也许可以更好地使用它
location -= 1
location = max(0, location)
这样,如果它跳过-1您的程序没有中断要降低游戏速度,请使用
pygame.clock.tick(10)
我想您可以使用:
pygame.time.delay(delayTime)
其中,delayTime
以毫秒为单位
将其置于事件之前。这背后的原因是pygame窗口以60 fps(每秒帧数)的速度运行,当您按键1秒时,它会根据事件块的循环更新60帧
clock=pygame.time.clock()
flag=true
而国旗:
时钟滴答(60)
请注意,如果您的项目中有动画,那么图像的数量将定义勾选()
中的值的数量。假设您有一个角色,它需要20组图像才能行走和跳跃,那么您必须勾选勾选(20)
以正确的方式移动字符。返回每个键的状态列表。如果按住键,键的状态为True
,否则为False
。用于评估按钮的当前状态并获得连续移动:
为True时:
keys=pygame.key.get_pressed()
x+=(键[pygame.K_RIGHT]-键[pygame.K_LEFT])*速度
y+=(键[pygame.K_向下]-键[pygame.K_向上]*速度
键盘事件(请参阅模块)仅在按键状态更改时发生一次。每次按下按键时,KEYDOWN
事件发生一次。keydup
每次松开按键时发生一次。将键盘事件用于单个动作或移动:
为True时:
对于pygame.event.get()中的事件:
如果event.type==pygame.KEYDOWN:
如果event.key==pygame.K_左:
x-=速度
如果event.key==pygame.K_RIGHT:
x+=速度
如果event.key==pygame.K_UP:
y-=速度
如果event.key==pygame.K_向下:
y+=速度
另见
连续移动的最小示例:
导入pygame
pygame.init()
window=pygame.display.set_模式((300300))
clock=pygame.time.clock()
rect=pygame.rect(0,0,20,20)
rect.center=window.get_rect().center
水平=5
运行=真
运行时:
时钟滴答(60)
对于pygame.event.get()中的事件:
pygame.time.delay(delayTime)