Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 16/10/2023, à 13: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