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

GLH*_*LHF 6 python pygame input 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))
Run Code Online (Sandbox Code Playgroud)

这将把得分变量放在屏幕上,然后当我想像在蛇游戏中更新得分时,偷偷吃苹果我可以更新文本,这样我就可以更新得分变量.但这个得分变量已经定义,我想要使用用户给出的变量来做到这一点.

编辑:我已经检查了所有答案和问题,这些不是我问的问题和我想要的.有一些方法可以打印这些变量,这不是我想要的,正如我所说.抓住键盘事件并打印它们不是我的问题的任何部分.我给出了"名字"的例子,但这个问题与我的问题没有关系

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

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

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

use*_*614 5

Pygame 中没有为此做任何准备。您将需要使用第 3 方 GUI 库,或者自己构建它。示例:如果文本框具有焦点,则获取所有 keydown 事件,并附加到字符串。每一帧,画一个盒子,然后在上面画绳子。

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

  • 没有那些工作?http://pygame.org/wiki/gui#GUI 库 (3认同)

Ant*_*ham 5

我目前假设此功能与您的程序配合使用是成功的并且不会引发任何错误。这是您给我们的链接中的一个函数:

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,"")
Run Code Online (Sandbox Code Playgroud)

看起来这就是您从具有 pygame 屏幕的用户那里获取输入的方式,对吧?我们看一下这个函数的第 4 行:

current_string = []
Run Code Online (Sandbox Code Playgroud)

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

string_input = ''.join(current_string)
Run Code Online (Sandbox Code Playgroud)

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

Eat = 0
Run Code Online (Sandbox Code Playgroud)

并放入该函数。当该变量等于 0 时。没有任何东西真正激活另一个函数。当蛇吃掉苹果时,将变量重置为 1,然后激活函数,如下所示:

if Eat = 0:
    someclassname.ask()
Run Code Online (Sandbox Code Playgroud)

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


GLH*_*LHF 2

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

首先制作一个文本渲染函数

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

然后一个函数的工作原理如下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)
Run Code Online (Sandbox Code Playgroud)

正如你所看到的,这个函数捕获键盘事件,它也有自己的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)
Run Code Online (Sandbox Code Playgroud)

See that we break this loop with the Enter button again. So we will ask the user our question in intro, then we will set it on the screen, top-right corner for example.