【问题标题】:Key press recognition within while loops. Pythonwhile 循环内的按键识别。 Python
【发布时间】:2018-04-10 07:53:52
【问题描述】:

我正在尝试在游戏中编写一个简单的对话框。我正在为整个游戏循环使用 while 循环。以及由玩家按下空格激活的循环内的while循环。我希望玩家按空格(speech()函数)进入第二个while循环并按A(speech_end())退出这个循环。但是,speech_end 在第二个循环中不起作用,除非我已经持有 A。我已经在这个循环之外对其进行了测试,它工作正常。任何帮助表示赞赏。

#Classes
class Bertha(object):

    image = pygame.image.load("bertha.png")

    def __init__(self, berthax, berthay, screen):
        self.screen = screen
        self.screen_rect = screen.get_rect()


        self.rect = self.image.get_rect()
        self.rect.x = berthax
        self.rect.y = berthay

    def draw(self, screen):
        screen.blit(self.image, self.rect)



class Player(object):

    # one image for all instances
    image = pygame.image.load('player.png')

    def __init__(self, playerx, playery, screen):
        self.screen = screen
        self.screen_rect = screen.get_rect()

        # every instance can have own image
        #self.image = pygame.image.load('test.jpg')

        self.rect = self.image.get_rect()
        self.rect.x = playerx
        self.rect.y = playery


#moving with Arrow keys
    def movement(self):

        for event in pygame.event.get():

            self.dist_x = 0
            self.dist_y = 0
            keys = pygame.key.get_pressed()

            if keys[pygame.K_RIGHT]:
                self.dist_x += 5
                if keys[pygame.K_UP]:
                    self.dist_y -= 5
                elif keys[pygame.K_DOWN]:
                    self.dist_y += 5

            elif keys[pygame.K_LEFT]:
                self.dist_x -= 5
                if keys[pygame.K_UP]:
                    self.dist_y -= 5
                elif keys[pygame.K_DOWN]:
                    self.dist_y += 5

            elif keys[pygame.K_UP]:
                self.dist_y -= 5
                if keys[pygame.K_RIGHT]:
                    self.dist_x += 5
                elif keys[pygame.K_LEFT]:
                    self.dist_x -= 5

            elif keys[pygame.K_DOWN]:
                self.dist_y += 5
                if keys[pygame.K_RIGHT]:
                    self.dist_x += 5
                elif keys[pygame.K_LEFT]:
                    self.dist_x -= 5




#------------Confirming player position--------------


        self.rect.x += self.dist_x
        self.rect.y += self.dist_y


    def draw(self, screen):
        screen.blit(self.image, self.rect)





# --------Talking to another character----------------



def speech():

    keys1 = pygame.key.get_pressed()
    global talking
    if keys1[pygame.K_SPACE]:
        talking = 1



def speech_end():

    keys2 = pygame.key.get_pressed()
    global talking
    if keys2[pygame.K_a]:
        talking = 2
        print("speech_end")










# ----- Bertha Messages



def bertha_text(screen, font):

    text = font.render("spacebar worked!", True, BLACK)

    text_rect = text.get_rect()

    text_rect.center = (400, 20)

    screen.blit(text, text_rect)

    pygame.display.update()






# - other -

font = pygame.font.SysFont("moon_get-Heavy.ttf", 40)
clock = pygame.time.Clock()

playerx = 100
playery = 100

berthax = 400
berthay = 400


player_one = (Player(playerx, playery, screen))
bertha_npc = (Bertha(berthax, berthay, screen))




talking = 0

# - mainloop -


running = True


while running:

    talking = 0


    screen.blit(map_img, (0, 0))

#Player


    player_one.movement()
    player_one.draw(screen)



#Bertha
    bertha_npc.draw(screen)
#------Show the text------


    speech()

    while talking == 1:

        bertha_text(screen, font)
        speech_end()

        print(talking)

        if talking == 2:

            print("talking == False")
            talking -= 2
            break





#UPDATE

    pygame.display.update()
        # - FPS -
    clock.tick(60)



# - end -

pygame.quit()
quit()

【问题讨论】:

  • 请阅读mcve page。我们喜欢简洁且可执行的示例。

标签: python loops while-loop pygame


【解决方案1】:

您必须在内部 while 循环中处理事件。调用pygame.event.pump() 或使用其他事件函数之一,例如for event in pygame.event.get():

另外,在内循环中调用clock.tick(60)

while talking == 1:
    pygame.event.pump()
    bertha_text(screen, font)
    speech_end()

    print(talking)

    if talking == 2:
        print("talking == False")
        talking -= 2
        break

    clock.tick(60)

【讨论】:

  • 顺便说一句,最好从您的播放器类中删除事件循环 (for event in pygame.event.get():) 并将其插入到主 while 循环中。当您的代码正常运行时,您可以将其(完整的、可运行的版本)发布到 codereview.stackexchange.com/questions/tagged/pygame 以获得一些重构技巧。
  • 为冗长的帖子道歉,我认为更多的细节总比更少的好。下次我会记住的。
  • 您可以(或应该)仍然尝试为其他审阅者或有相同问题的人改进问题。欢迎来到 Stack Overflow!
  • Gotcha 明天就可以了。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-24
  • 2014-11-02
  • 2016-03-14
  • 2011-06-19
相关资源
最近更新 更多