Affichage / Quitter Part 3

Publié le par Prissille

Un petit menu ça vous tente.
 
On va ajouter une couleur de fond, du noir. Sous BGCOLOR :
BGBCOLOR = (  0,   0,   0) #BLACK
 
Maintenant on ajoute une boucle avant direction = 'NO':
def game():
 
Notre boucle de jeu va englober : direction jusque FPSCLOCK.tick(FPS)
 
On ajoute une boucle pour le menu :
def menu():
    while True:
        for event in pygame.event.get(): # event handling loop
            if event.type == QUIT:
                pygame.quit()
                sys.exit()
            elif event.type == KEYDOWN:
                if event.key == K_ESCAPE:
                    pygame.quit()
                    sys.exit()
                elif (event.key == K_SPACE):
                    return
        DISPSCREEN.fill(BGBCOLOR)
        pygame.display.update()
        FPSCLOCK.tick(FPS)
 
Chaque ecran du menu doit avoir ses propres réactions aux touches du clavier et affichage. Dans ce cas pour voir la différence, j'affiche le fond en noir et on presse la touche espace pour lancer le jeu.
 
Sous le premier while True: de la boucle main(), on ajoute :
menu()
game()
 
On ajoute aussi dans la boucle game, au niveau des evenements clavier les deux lignes suivantes sous le test de la touche RIGHT :
elif (event.key == K_SPACE):
                    return
 
Quand le programme tournera dans sa boucle principale, il lancera la boucle menu et tournera dans celle-ci tant qu'elle sera vraie. Si on appuie sur la barre espace, on lance un return et sort de la boucle menu. La boucle game() prend la main et ainsi de suite.
 
 
Le code complet:

import pygame, sys, random
from pygame.locals import *

FPS = 30
WWIDTH = 640
WHEIGHT = 480
BGCOLOR = (  255,   0,   0) #RED
BGBCOLOR = (  0,   0,   0) #BLACK


class Raquette(pygame.sprite.Sprite):
    speed = 5
    
    def __init__(self):
        pygame.sprite.Sprite.__init__(self)

        barWall = pygame.Surface((50,10)).convert()
        barWall.fill((255,255,255))
        self.image = barWall
        self.rect = self.image.get_rect()
        
        self.rect.x = 320
        self.rect.y = 440

        
def main():

    global FPSCLOCK, DISPSCREEN
    pygame.init()
    FPSCLOCK = pygame.time.Clock()
    DISPSCREEN = pygame.display.set_mode((WWIDTH, WHEIGHT))
    pygame.display.set_caption('MyGame')

    
    
    while True:
        menu()
        game()

def game():

    direction = 'NO'

    raquette = Raquette()
    
    while True:
        for event in pygame.event.get(): # event handling loop
            if event.type == QUIT:
                pygame.quit()
                sys.exit()
            elif event.type == KEYDOWN:
                if event.key == K_ESCAPE:
                    pygame.quit()
                    sys.exit()
                elif (event.key == K_LEFT):
                    direction = "LEFT"
                elif (event.key == K_RIGHT):
                    direction = "RIGHT"
                elif (event.key == K_SPACE):
                    return
            elif event.type == KEYUP:
                if event.key == K_LEFT and direction == "LEFT":
                    direction = 'NO'
                elif event.key == K_RIGHT and direction == "RIGHT":
                    direction = 'NO'


        if (direction == "LEFT" and raquette.rect.x > 0):
            raquette.rect.x -= raquette.speed
        elif (direction == "RIGHT" and raquette.rect.x < (WWIDTH -50)):
            raquette.rect.x += raquette.speed
            
        DISPSCREEN.fill(BGCOLOR)
        DISPSCREEN.blit(raquette.image, (raquette.rect.x, raquette.rect.y))
        pygame.display.update()
        FPSCLOCK.tick(FPS)
        
def menu():

    while True:
        for event in pygame.event.get(): # event handling loop
            if event.type == QUIT:
                pygame.quit()
                sys.exit()
            elif event.type == KEYDOWN:
                if event.key == K_ESCAPE:
                    pygame.quit()
                    sys.exit()
                elif (event.key == K_SPACE):
                    return

        DISPSCREEN.fill(BGBCOLOR)
        pygame.display.update()
        FPSCLOCK.tick(FPS)
                    
if __name__ == '__main__':
    main()

 

Et si on ajoutait un peu de texte à l'écran du menu. Du code svp :
 
au début de la boucle menu, ajouter :

    font = pygame.font.Font(None, 144)
    text = font.render("START", 1, (255, 255, 255))
    textpos = text.get_rect()
    textpos.centerx = 320
    textpos.centery = 100

    font1 = pygame.font.Font(None, 36)
    text1 = font1.render("press SPACE to start", 1, (255, 255, 255))
    text1pos = text1.get_rect()
    text1pos.centerx = 320
    text1pos.centery = 300

 
 
Et après le remplissage du fond de l'écran:
        DISPSCREEN.blit(text, textpos)
        DISPSCREEN.blit(text1, text1pos)
 
On commence par créer une font avec une police et une taille, puis un texte avec une phrase, un style et une couleur. On capture la taille du texte et on centre la position.
 
Pour l'affichage on fait juste un blit.
 
La prochaine partie, on ajoutera les collisions avec des balles, la gestion du temps et du score pour avoir un mini jeu.
Affichage / Quitter Part 3

Publié dans Tutorial

Commenter cet article