首先,对不起我的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()
答案 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