Pygame - 为什么我的游戏会重复而不是关闭?

时间:2015-09-12 23:20:40

标签: python function loops python-3.x pygame

首先,对不起我的noob问题。

所以我正在尝试学习pygame,为此我创建了一个“”游戏“”,当有人点击顶部角落的关闭按钮(“x”按钮“)时,它应该会退出。窗口,但整个游戏重新启动。 我使用“Game = False”指出游戏需要关闭,因为游戏所做的一切都位于一个只以“Game = True”开头的循环中,并且在游戏结束时(循环结束后)有一个“pygame.quit()”和一个“sys.exit()”。这是工作正常,但重新加入我添加了以下几行:

if x < 0 or x > display_width - spacecore_width:
            game_over()  

那些应该调用“game_over”函数,通过调用覆盖整个游戏的另一个函数来重置游戏(循环位于此函数内部)。但是当有人点击“x”按钮退出游戏时,这不应该发生,我不知道为什么在这样的事情发生时也会发生这种情况(除了按预期工作,只重复游戏,如果“x&lt; ; 0或x&gt; display_width - spacecore_width“。

我已经知道如何避免它(我只需要用那些退出命令替换“Game = False”)但我想知道为什么问题首先发生。

这是完整的代码:

import pygame, sys, time

pygame.init()

display_width = 800
display_height = 600

DISPLAY = pygame.display.set_mode((display_width,display_height))

pygame.display.set_caption("Não enconste nas bordas da tela") 

WHITE = (255,255,255)
RED = (255,0,0) 

SPACECORE = pygame.image.load("spacecore.png")

spacecore_width = 100

clock = pygame.time.Clock()


def text_and_rect(text,font):
    text_surface = font.render(text,True,RED)
    return text_surface, text_surface.get_rect()


def message_display(text):
    font = pygame.font.Font("freesansbold.ttf",50)
    text_surf, text_rect = text_and_rect(text,font)
    text_rect.center = ((display_width/2),(display_height/2))
    DISPLAY.blit(text_surf,text_rect) 
    pygame.display.update()
    time.sleep(2)   



def game_over():
    message_display("Você morreu de morte morrida")
    game_loop()


def player(x,y):
    DISPLAY.blit(SPACECORE,(x,y))



def game_loop():
    Game = True

    x = display_width * 0.5
    y = display_height * 0.8

    mod_x = mod_y = 0



    while Game == True:
        pygame.display.update()
        DISPLAY.fill(WHITE) 



        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                Game = False


            if event.type == pygame.KEYDOWN:
                if event.key == pygame.K_LEFT:
                    mod_x = -5
                if event.key == pygame.K_RIGHT:
                    mod_x = 5
                if event.key == pygame.K_UP:
                    mod_y = -5
                if event.key == pygame.K_DOWN:
                    mod_y = 5


            if event.type == pygame.KEYUP:
                if event.key == pygame.K_LEFT or event.key == pygame.K_RIGHT:
                    mod_x = 0
                if event.key == pygame.K_UP or event.key == pygame.K_DOWN:
                    mod_y = 0

        x += mod_x
        y += mod_y

        clock.tick(60) 

        player(x,y)

        if x < 0 or x > display_width - spacecore_width:
            game_over()  



game_loop()
pygame.quit()
sys.exit() 

1 个答案:

答案 0 :(得分:0)

确保您已经退出循环,然后再次调用循环函数:

while Game == True:

    # some here code

    if x < 0 or x > display_width - spacecore_width:
        break # leave while loop

 # proceed elsewhere
game_over()

或者将流量切回game_loop中的game_over

def game_over():
    message_display("Você morreu de morte morrida")
    # game_loop() # removed

目前,当游戏结束时你永远不会打破循环 - 你只是以相互递归的方式调用其他函数(反过来又激活另一个循环),实际上这永远不会结束任何游戏。

此外,如果您收到退出事件,您可能希望{for循环中出现break

for event in pygame.event.get():
        if event.type == pygame.QUIT:
            Game = False
            break