Python 如何在pygame中获得键盘输入?

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 它工作得太好了。船开得太快了。几乎不可能让它只移动一个位置,向左或向右。我怎样才能使飞船在每次按键时只移动一次呢?

我正在PyGame1.9.2中制作一个游戏。 这是一个失败的简单游戏,其中一艘船在五列坏人之间移动,这些坏人通过缓慢向下移动进行攻击。我正试图让它,使船舶左,右移动与左右箭头键。这是我的密码:

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)