【问题标题】:Pygame - why my game repeats instead of closing?Pygame - 为什么我的游戏重复而不是关闭?
【发布时间】:2015-09-12 23:20:40
【问题描述】:

首先,很抱歉我的菜鸟问题。

所以我正在尝试学习 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 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() 

【问题讨论】:

  • breaking 在退出事件后停止处理事件怎么样?
  • @ Reut Sharabani 我不知道为什么谈话会转移到另一个评论部分,但无论如何......我知道我可以使用 break 作为解决方法来退出游戏,以及解决方案您在答案中发布的内容非常有用。我不明白的是为什么游戏调用函数 "gameover()" ,退出游戏时不应调用该函数(因为它实际上重新启动了所述游戏),如果调用它的 "if" 语句的条件从未遇到过(或者不应该遇到,至少对于退出游戏而言)。另外,我无法调试我的脚本(是的,我就是那个菜鸟)......

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


【解决方案1】:

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

while Game == True:

    # some here code

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

 # proceed elsewhere
game_over()

或者在game_over中将流切回game_loop

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

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

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

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

【讨论】:

  • 我认为你第一次是对的,差不多。当我阅读问题时, game_over() 应该打印消息并开始新游戏。应该有另一个地方可以让用户退出应用程序。在这种情况下,他应该退出循环,但在 game_loop() 之后不应调用 game_over()。
  • 我认为game_loop 开始了新游戏,因此有效地创建了一个很好的代码。我没有看到其他“退出点”,可以说是循环中的 - 所以如果你到了那里,游戏就结束了:-)
  • 对不起。我跳过了“或者,...”这一行
  • 感谢您的回答,但我仍然不明白为什么当我尝试关闭游戏时会出现这种情况。 “game_over”不应该只在玩家通过屏幕边界时才被解释(“if x display_width - spacecore_width:”)?我知道这不会结束任何游戏(它只是再次调用该函数),但我不明白为什么在我尝试退出时考虑到这个陈述,因为条件从未满足(并且游戏正常关闭没有这样的声明)......
  • @Reut Sharabani 是的,确实如此。我只是不明白为什么它以前不起作用,因为 if 语句条件从未完成......
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-11
  • 1970-01-01
  • 1970-01-01
  • 2023-01-18
  • 2015-03-18
  • 1970-01-01
相关资源
最近更新 更多