如何在Pygame中获取用户的输入并将其保存为变量?

时间:2014-12-30 23:04:03

标签: python input pygame python-3.4

我的想法是我想从游戏中的用户那里得到一些输入,比如用户的名字,然后我想把它放在屏幕上。也许在开始游戏或游戏中间之前,它很重要。

  

我试过了InputBox等但是它实际上没有工作,我尝试了一些   像这样的模块,但没有工作,其中一些只是键入我的   屏幕上的文字就是全部,我想要的是我想要那个输入   并在pygame屏幕上放置一些地方。

所以我必须将输入保存为变量。有没有可行的方法呢?

  

示例:

font1 = pygame.font.SysFont("None", 30)
score=0
text=font1.render("{}".format(score), True,(255,255,255))
...
...
if sneakeattheapple:
    score += 1
    text=font1.render("{}".format(score), True,(255,255,255))
...
...
screen.blit(text,(275,6))

这将在屏幕上放置得分变量,然后当我想像在蛇游戏中更新得分时,偷偷吃苹果时我可以更新文本所以我可以更新得分变量。但是这个得分变量已经定义了,我想用用户给出的变量来做。

  

编辑:我已经在SO中检查所有答案和问题,这些不是我要求的和我想要的。有一些方法可以打印这些变量,正如我所说,这是。抓住键盘事件并打印它们不是我问题的任何部分。我举了一个名字'但是THIS问题与我的问题无关

     

编辑2:让我更清楚。在Python中我们可以做到这一点;

x=input("Do you want to do this?(y/n): ")
if x=="y":
    #do something
if x=="n":
    #do something

我们可以随时随地问这个问题,无论我们想要什么..这就是我想在Pygame中做的事情。

  

5 个答案:

答案 0 :(得分:4)

我目前假设此功能与您的程序一起使用是成功的并且不会引发任何错误。以下是您提供给我们的链接中的一项功能:

def ask(screen, question):
    "ask(screen, question) -> answer"
    pygame.font.init()
    current_string = []
    display_box(screen, question + ": " + string.join(current_string,""))
    while 1:
      inkey = get_key()
      if inkey == K_BACKSPACE:
        current_string = current_string[0:-1]
      elif inkey == K_RETURN:
        break
      elif inkey == K_MINUS:
        current_string.append("_")
      elif inkey <= 127:
        current_string.append(chr(inkey))
      display_box(screen, question + ": " + string.join(current_string,""))
    return string.join(current_string,"")

看起来这就是你如何从具有pygame屏幕的用户那里获得输入的权利?让我们看看这个函数的第4行:

current_string = []

用户输入的内容存储在此列表中。假设您知道如何获取字符串并将其放在屏幕上,您可以保存字符串,如下所示:

string_input = ''.join(current_string)

如果你可以做一个类似的功能(如果这个不起作用),你可以做同样的事情!只需保存列表中的第一项,将字符串保存在变量中,如上所示。如果您有任何问题,请发表评论,以便我可以编辑我的答案。
现在到下一部分。您可以随时激活此功能。您可能希望在发生某些事情时激活。一个例子是当蛇吃苹果时。你可能有一个我相信的功能。你可以像这样制作一个变量:

Eat = 0

并加入该功能。当该变量等于0.没有什么能真正激活另一个函数。当蛇吃苹果时,将变量重置为1,然后激活如下函数:

if Eat = 0:
    someclassname.ask()

你在许多其他场合都这样做。我希望这更清楚,更有帮助!

答案 1 :(得分:3)

为此,没有任何事情可以融入Pygame。您将需要使用第三方GUI库,或者自己构建它。示例:如果文本框具有焦点,请执行所有keydown事件,并附加到字符串。每个框架,绘制一个框,然后在顶部绘制字符串。

构建一个简单的那个不应该那么难,但如果你想要一个更全功能的,那么使用一个库可能会更容易。

答案 2 :(得分:2)

您是否尝试过获取重要事件,然后将它们组合在一起形成某些内容?你可以把这样的东西放在主游戏循环中。

input = ''
for event in pygame.event.get():
        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_ESCAPE:
                playing = False
            if event.key == pygame.K_w:
                input = input + "w"
            if event.key == pygame.K_s:
                input = input + "s"
            if event.key == pygame.K_a:
                input = input + "a"

然后,您可以检查用户何时完成输入(按钮/输入键),并最终确定变量。 有了这个,你可能会遇到一个问题,即按键保持的时间更长,所以只需按一次按钮就可以获得3个小时。如果是这种情况你可以1.不允许另一个输入,直到某个时间过去(可能是.25秒?)或2.使用pygame.KEYUP而不是pygame.KEYDOWN并专门检查笔画。

答案 3 :(得分:-1)

这是一个可能的解决方案,对于像我这样也遇到这个问题的未来访问者来说,这可能非常有用。这是;

  

首先制作文字渲染功能

def text1(word,x,y):
    font = pygame.font.SysFont(None, 25)
    text = font.render("{}".format(word), True, RED)
    return screen.blit(text,(x,y))

然后一个函数就像input;

一样
def inpt():
    word=""
    text1("Please enter your name: ",300,400) #example asking name
    pygame.display.flip()
    done = True
    while done:
        for event in pygame.event.get():
            if event.type==pygame.QUIT:
                pygame.quit()
                quit()
            if event.type == pygame.KEYDOWN:
                if event.key == pygame.K_a:
                    word+=str(chr(event.key))
                if event.key == pygame.K_b:
                    word+=chr(event.key)
                if event.key == pygame.K_c:
                    word+=chr(event.key)
                if event.key == pygame.K_d:
                    word+=chr(event.key)
                if event.key == pygame.K_RETURN:
                    done=False
                #events...
    return text1(word,700,30)

如你所见,这个函数捕获键盘事件,它也有自己的while循环,这很重要。按Enter按钮if event.key == pygame.K_RETURN: done=False时,我打破了循环。然后用text1函数返回我们的单词,显示。其他事件可以设置为基于意见的,如空格按钮等。

  

然后,实际上我们必须创建一个intro函数,我们会在那里询问用户的名字,例如,当intro函数完成时,名称将在屏幕上设置,直到游戏结束

def game_intro():
intro=True

while intro:
    for event in pygame.event.get():
        if event.type==pygame.QUIT:
            pygame.quit()
            quit()
        if event.type==pygame.KEYDOWN:
            if event.key==pygame.K_RETURN:
                intro=False
    inpt() #Here we are calling our function
    screen.fill(white)

    pygame.display.update()
    clock.tick(15)

看到我们再次使用Enter按钮打破此循环。因此,我们会在介绍中询问用户我们的问题,然后我们会将其设置在屏幕上,例如右上角。

答案 4 :(得分:-4)

使用户输入内容 输入

variable = input()

现在用户可以输入内容 使它做一些类型

if variable = ('input'):
print('the input works')

现在,如果我输入输入,它会说 输入工作