#1 Le 16/10/2023, à 12:43
- chris7522
probleme de compréhension jeux pygame (python)
Bonjour a toutes et a tous,
J’ai du mal a comprendre quelque chose dans ce code que j’ai récupéré: qu’est ce qui fait que les animations du jeux sont «gelées» lorsque Je clique le bouton Pause . Qu'est ce qui a stopé toutes les animations a l'ecran sans pour autant les faire disparaitre . Lorsque je clique sur reprise , toutes les animations reprennent la ou elles ont été arreté .
J’ai éssayé de simplifier ce code , pas sur que ce soit claire .
J’ai dabord dans mon fichier main.py:
def start():
pygame.init()
game = True
menu = True
run = False
while game:
while menu:
number = men.menu(win)
if number == 0:
menu = False
game = False
elif number == 1:
run = True
menu = False
while run:
num = gamerun.run(win, org_win)
if num == 0:
run = False
game = False
if num == 1:
run = False
menu = True
if __name__ == '__main__':
start()
Ensuite dans mon fichier gamerun.py:
battleship = Spaceship('spaceship1_', 250, 120) # instance héro
aliens = []
aliens2 = []
alien3 = []
stars = []
enemyspaceships = []
def run(win):
redrawGameWindow(win)
if battleship.health <= 0:
if not ru: #initialisé a True en début de fichier
go = gameover(win)
if go == 0 or go == 1:
ru = True
return go
ru = False
if len(aliens) == 0 and len(enemyspaceships) == 0 and len(aliens2) == 0 and len(alien3) == 0:
generateLevel(win) #fonction qui permet l’avancement dans les différents niveau
redrawGameWindow(win) #affiche tous les éléments graphiques
keys = pygame.key.get_pressed()
if pausebutton or keys[pygame.K_ESCAPE]:
pausebutton = False
pau = True
while pau:
g = pause(win)
if g == 1:
pau = False
elif g == 0:
pau = False
return 1
pygame.display.update()
a fonction redrawGameWindow() affiche tout ce qu’il y a a l’ecran .
La fonction gameover() dans l’intégralité :
def gameover(win):
global alienkills
global spaceshipkills
global totaltestseconds
global level
global levelcounter
global aliens
global alien3
global aliens2
global lasers
global enemyspaceships
global enemylasers
global timee
pygame.mixer.music.stop()
helplevel = level
ptime = calculateTime()
if int(ptime[1]) < 10:
timee = ptime[0] + ':0' + ptime[1]
else:
timee = ptime[0] + ':' + ptime[1]
if helplevel > s.readlevel():
s.save(helplevel, alienkills, spaceshipkills, timee, totaltestseconds)
highscoreloop = True
hslo = 0
ybutton = 370
elif helplevel == s.readlevel() and totaltestseconds > s.readseconds():
s.save(helplevel, alienkills, spaceshipkills, timee, totaltestseconds)
highscoreloop = True
hslo = 0
ybutton = 370
else:
highscoreloop = False
ybutton = 350
f = True
g = True
h = True
i = True
j = True
k = True
l = True
m = True
n = True
while f:
try:
aliens.pop()
except:
f = False
while i:
try:
aliens2.pop()
except:
i = False
while j:
try:
alien3.pop()
except:
j = False
while k:
try:
enemyspaceships.pop()
except:
k = False
while g:
try:
lasers.pop()
except:
g = False
while h:
try:
enemylasers.pop()
except:
h = False
while l:
try:
aliens2_lasers.pop()
except:
l = False
while m:
try:
aliens2_lasers2.pop()
except:
m = False
while n:
try:
alien3_lasers.pop()
except:
n = False
gaov = True
while gaov:
clock.tick(30)
for event in pygame.event.get():
if event.type == pygame.QUIT:
ptime = calculateTime()
if int(ptime[1]) < 10:
timee = ptime[0] + ':0' + ptime[1]
else:
timee = ptime[0] + ':' + ptime[1]
return 0
pygame.draw.rect(win, yellow, (50, 75, 600, 400)) # cadre resultat final
pygame.draw.rect(win, black, (60, 85, 580, 380))
gameoverfont = pygame.font.Font(set.font, 50)
text = gameoverfont.render('Game Over!', 1, yellow)
win.blit(text, (350 - round(text.get_width() / 2), 80))
statfont = pygame.font.Font(set.font, 30)
text = statfont.render('Level: ' + str(helplevel), 1, white)
win.blit(text, (350 - round(text.get_width() / 2), 160))
text = statfont.render('Aliens killed: ' + str(alienkills), 1, white)
win.blit(text, (350 - round(text.get_width() / 2), 190))
text = statfont.render('Enemy spaceships destroyed: ' + str(spaceshipkills), 1, white)
win.blit(text, (350 - round(text.get_width() / 2), 220))
if highscoreloop: # si True : nouveau score
hslo += 1 # la boucle hslo va permettre l'affichage par intermitence de
# 'New Highscore!'
if hslo < 15:
highfont = pygame.font.Font(set.font, 40)
text = highfont.render('New Highscore!', 1, yellow)
win.blit(text, (350 - round(text.get_width() / 2), 290))
elif hslo == 30:
hslo = 0
text = statfont.render('Survived time: ' + timee, 1, white)
win.blit(text, (350 - round(text.get_width() / 2), 250))
exbutton = t.button(win, 'Main Menu', 250, ybutton, 200, 50, yellow, black, yellow)
if exbutton:
reset()
return 1
pygame.display.update()
Et la fonction pause() dans l’intégralité:
def pause(win):
global timee
for event in pygame.event.get():
if event.type == pygame.QUIT:
ptime = calculateTime()
if int(ptime[1]) < 10:
timee = ptime[0] + ':0' + ptime[1]
else:
timee = ptime[0] + ':' + ptime[1]
return 0
pygame.draw.rect(win, green, (150, 115, 600, 380))
pygame.draw.rect(win, black, (160, 125, 580, 360))
paufont = pygame.font.Font(set.font, 50)
text = paufont.render('Pause', 1, green)
win.blit(text, (350 - round(text.get_width() / 2), 150))
notefont = pygame.font.Font(set.font, 30)
text = notefont.render('NOTE: if you quit, you can go back to the current', 1, green)
win.blit(text, (180, 340))
text = notefont.render('save by just starting the game via the main menu.', 1, green)
win.blit(text, (180, 360))
text = notefont.render('If you close the whole game with an unfinished save,', 1, green)
win.blit(text, (180, 380))
text = notefont.render('it will be saved regularly but you wont be able to', 1, green)
win.blit(text, (180, 400))
text = notefont.render('finish it.', 1, green)
win.blit(text, (180, 420))
resumebutton = t.button(win, 'Reprise', 250, 200, 200, 50, green, black, green)
if resumebutton: # si clique sur resumebutton
return 1
quitbutton = t.button(win, 'Quit', 250, 260, 200, 50, green, black, green)
if quitbutton: # si clique sur quitbutton
ptime = calculateTime()
if int(ptime[1]) < 10:
timee = ptime[0] + ':0' + ptime[1]
else:
timee = ptime[0] + ':' + ptime[1]
return 0
pygame.display.update()
Dans cette partie de code du fichier gamerun.py :
keys = pygame.key.get_pressed()
if pausebutton or keys[pygame.K_ESCAPE]:
pausebutton = False
pau = True
while pau:
g = pause(win)
if g == 1:
pau = False
elif g == 0:
pau = False
return 1
Lorsque je clique sur pause (pausebutton) , pausebutton renvoie True , on rentre dans la condition , pausebutton est au passage réinitialisé a False pour la fois suivante , on rentre dans la boucle 'pau'.
1 ere possibilité : Le retour de pause est 1 ( si cliqué sur reprise) on sort de la boucle et le jeu reprend .
2 eme possibilité : Le retour de pause est 0 ( si cliqué sur quit) , on sort de la boucle , on retourne 1 donc run = False et menu = True (on quitte la partie et on revient au menu )
Lorsque la fonction pause() est appelé , il y a une fenetre qui est crée , a l'intérieure de celle-ci du texte est ecrit :
notefont = pygame.font.Font(set.font, 30)
text = notefont.render('NOTE: if you quit, you can go back to the current', 1, green)
win.blit(text, (180, 340))
text = notefont.render('save by just starting the game via the main menu.', 1, green)
win.blit(text, (180, 360))
text = notefont.render('If you close the whole game with an unfinished save,', 1, green)
win.blit(text, (180, 380))
text = notefont.render('it will be saved regularly but you wont be able to', 1, green)
win.blit(text, (180, 400))
text = notefont.render('finish it.', 1, green)
win.blit(text, (180, 420))
resumebutton = t.button(win, 'Reprise', 250, 200, 200, 50, green, black, green)
if resumebutton: # si clique sur resumebutton
return 1
quitbutton = t.button(win, 'Quit', 250, 260, 200, 50, green, black, green)
En espérant que vous puissiez m’aider , je vous remercie de votre aide .
Hors ligne