【问题标题】:How to blit a string in pygame [duplicate]如何在pygame中blit一个字符串[重复]
【发布时间】:2020-04-15 20:04:30
【问题描述】:

我正在编写一个游戏,其中玩家输入其名称,我想在屏幕上显示它。

我是这样取名字的(名字是一个字符串,在下面的函数中被放在全局中):

while player_name_screen:
        for event in pygame.event.get():
            if event.type == pygame.KEYDOWN:
                if event.key == pygame.K_RETURN:
                    print(name)
                    menu_screen = False
                    player_name_screen = False
                    game_animation = True
                    enemy_animation = True
                    standing = True
                else:
                    name += event.unicode
                    name_text = game_font.render(name, True, (125, 156, 255))
        win.blit(name_text, (500, 500))            
        pygame.display.update()
        clock.tick(fps)

这就是我想要 blit 玩家名字的方式(以下代码在一个函数中,在我的主循环中调用):

if game_animation:
        win.blit(name_text, (100, 300))

但是屏幕上什么也没有出现,当我在 shell 中打印它时,它看起来像这样:<Surface(63x50x32 SW)> 我怎样才能让它在屏幕上正确地闪烁?我已经在寻找类似的问题,但找不到能回答我问题的问题。 感谢您的帮助

编辑: 这是实现此功能所需的全部内容:

name = ""
name_text = game_font.render('', True, (255, 255, 255))

def input_player_name():
    global menu_screen
    global game_animation
    global enemy_animation
    global standing
    global deluxe_or_not
    global name
    global name_text
    #print("Enter player's name")
    player_name_screen = True
    win.blit(playerNameImg, (0, 0))
    while player_name_screen:
        for event in pygame.event.get():
            if event.type == pygame.KEYDOWN:
                if event.key == pygame.K_RETURN:
                    print(name)
                    menu_screen = False
                    player_name_screen = False
                    game_animation = True
                    enemy_animation = True
                    standing = True
                    imperial_march.play()
                    if "deluxe.ver" in name:
                        print("deluxe.ver.exe")
                        deluxe_or_not = 1
                else:
                    name += event.unicode
                    #print(name)
                    name_text = game_font.render(name, True, (125, 156, 255))
        win.blit(name_text, (500, 500))            
        pygame.display.update()
        clock.tick(fps)

def rwg():
    if game_animation:
        win.blit(name_text, (100, 300))
        print(name_text)

run = True
while run:
     for event in pygame.event.get():
          if event.type == pygame.KEYDOWN:
               if event.key == pygame.K_SPACE and menu_screen == True:
                    input_player_name()

     rwg()

【问题讨论】:

标签: python pygame


【解决方案1】:

您不更新屏幕。您仅在input_player_name 函数中更新屏幕,但是当您获取名称并且停止被调用时,没有更新来更新屏幕。

所以在循环末尾添加pygame.display.update()

run = True
while run:
     for event in pygame.event.get():
          if event.type == pygame.KEYDOWN:
               if event.key == pygame.K_SPACE and menu_screen == True:
                    input_player_name()

     rwg()
     pygame.display.update()

然后你可以去掉input_player_name 中的那个,因为循环中的那个发生在非常帧中,你不想在一帧中更新屏幕两次

【讨论】:

  • 如果我删除 input_player_name 中的显示更新并在 rwg() 之后添加它,当我调用播放器名称的函数时它会冻结屏幕编辑:我忘了说当然显示更新rwg 函数,我的程序的其余部分(大约 1k 行)运行良好
  • @bappi 我的错,没有意识到你在input_player_name() 中有另一个循环。这是我不推荐的。但它可以工作,所以将pygame.display.update() 保留在函数中,一切都会正常工作
  • 别担心,它仍然不起作用,我只是想把名字blit,它仍然没有出现在屏幕上。
  • @bappi 所以,我运行了你的代码,它对我有用,我确实摆脱了 and menu_screen == True: 并将文本从 (500,500) 移动到 (200,200) 并且它有效,我猜只是确保你的屏幕足够大,背景颜色和menu_screen = True不一样。如果它仍然不起作用,请发布您的所有代码。
  • 我明白了,我并不清楚。一旦我退出input_player_name()```, which is ìf game_animation :win.blit(name, (100, 300)) ```,我正在尝试对名称进行blit。如果我试图做的事情难以理解,我不知道是否有办法显示视频。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-22
  • 2016-01-23
  • 2021-01-10
  • 2012-08-30
  • 2014-04-17
相关资源
最近更新 更多