Partage
  • Partager sur Facebook
  • Partager sur Twitter

Créer un menu Pygame

18 mai 2017 à 11:10:53

Bonjour,

Je souhaiterai réaliser un menu avec pygame pour mon jeux qui me permettrait de soit fermer la fenêtre en cliquant sur le bouton quitter soit cliquer sur jouer pour commençer a jouer. Ne trouvant pas de documentation clair je viens vous demandé de l'aide. Je me suis chargé de regardé des exemples de menu sur pygame.org mais impossible de les télécharger.. 404 page not found.

Merci de votre aide

  • Partager sur Facebook
  • Partager sur Twitter
18 mai 2017 à 11:52:54

Bonjour,

Je suppose que tu as une boucle de jeu, et une (ou plusieurs) fonctions te permettant de lancer ton jeu.

Pour créer un menu, tu recréées une fonction, tu y blit tes images pour qu'il ressemble à ce que tu veux ...

Dans ta boucle de jeu, tu testes en permanence si une certaine variable, que j'appellerai 'jeu'  est par exemple égale à 1, et si c'est le cas, tu lances ton jeu, et si elle est égale à 0 le menu se lance. La variable 'jeu' sera à l'initialisation de ton programme bien sur, égale à 0, pour que le menu se lance quand tu lances le jeu.

Ensuite, tu testes pour tout les évenements, si il y a un clic, puis si il est au bonne coordonnée.

Une fois que tu as fait ce test, tu passe ta variable 'jeu' à 1, pour que le jeu se lance.

Pour le bouton quitter, tu retestes à nouveau les coordonnées du clic, et si les coordonnées sont égales à celles de ton bouton quitter tu fais 

pygame.quit()

Voila, je sais pas si c'est la meilleure solution mais c'est celle que j'utilise.

  • Partager sur Facebook
  • Partager sur Twitter
19 mai 2017 à 20:55:50

Aurais-tu un exemple ? car j'ai du mal la je t'avoue..

Je recréé une fonction ? Laquelle de fonction ? J'ai déjà ma fenetre en plus sa veut dire que je créé une deuxième fenetre ? Avant ou après celle du jeux ? 

Après je suis larguer. Je veux simplement une page d’accueil dans laquelle j’intégrerai une image qui représentera mon menu.( je pense que c'est le plus simple a faire ). Si le joueur appuie sur entrer alors le jeux commence. 

Après effectivement effectivement c'est pas mal l'histoire du clic et des coordonnée mais j'ai aucune idée je trouve aucun exemple sur pygame d'un menu rédigé c'est dingue je trouve

-
Edité par ProgramAce 19 mai 2017 à 20:57:36

  • Partager sur Facebook
  • Partager sur Twitter
20 mai 2017 à 0:02:07

Salut,

Votre menu est fait comme un jeu. Il faut que vous créez des boutons/images, donc vous devez blitter des rectangles/textes/images. Puisqu'un bouton est simplement un rectangle avec du texte/image à l'intérieur.

Ensuite, vous faite encore comme un jeu, vous détectez le clique de souris, si la position de la souris est dans le rectangle (x1, y1, x2, y2).

S'il est dedans, vous changez de fonction, ou de blit directement. Ce qui enlèvera le menu et affichera le jeu. Puisque le blit est dans la boucle.

Dans cette exemple,  j'ai créer une variable afficher , auquel j'affecterai une des fonctions désiré (sans l'instancer donc, sans parenthèse)

Ensuite, dans la boucle, j'exécute afficher(), qui exécutera soit menu() soit jeu()

Il y a beaucoup de répétitions, mais c'est pour vous faire comprendre :D)

import pygame

pygame.init()
pygame.font.init()

RUNNING = True

fenetre = pygame.display.set_mode((500,500))

myfont = pygame.font.SysFont('Helvetic', 20)


def gerer_events_principale():
    global RUNNING
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            RUNNING = False

def menu():
    rect = pygame.draw.rect(
        fenetre,
        (255,0,0),
        pygame.Rect(100, 200, 100, 100))

    text = myfont.render('ButtonA', False, (255,255,255))
    fenetre.blit(text, (100,200))

    gerer_mouse_menu(rect)
    
def jeu():
    rect = pygame.draw.rect(
        fenetre,
        (0,255,0),
        pygame.Rect(100, 200, 100, 100))

    text = myfont.render('ButtonB', False, (255,255,255))
    fenetre.blit(text, (100,200))

    gerer_mouse_jeu(rect)
    
def gerer_mouse_jeu(rectangle):
    global afficher
    
    mouse = pygame.mouse.get_pressed()
    if mouse[0]: # UP
        mouse_pos = pygame.mouse.get_pos()
        
        if rectangle.collidepoint(mouse_pos):
            print('Cliqué sur:', rectangle)
            afficher = menu

def gerer_mouse_menu(rectangle):
    global afficher
    
    mouse = pygame.mouse.get_pressed()
    if mouse[0]: # UP
        mouse_pos = pygame.mouse.get_pos()
        
        if rectangle.collidepoint(mouse_pos):
            print('Cliqué sur:', rectangle)
            afficher = jeu

## Affecte la fonction menu
afficher = menu

def boucle_principale():
    while RUNNING:
        fenetre.fill( (0,0,0) )
        
        gerer_events_principale()
        
        ## Exécute la fonction affecté à afficher (menu/jeu)
        afficher()
        
        
        pygame.display.update()
        
    pygame.quit()



boucle_principale()

Comme vous le voyez, vous prenez votre menu, comme un jeu. Que vous changez, selon le choix.

Il n'est pas parfait, puisqu'il maintient le clique, donc peut revenir à sa couleur initiale.

Bonne chance

A+

-
Edité par nolimitech 20 mai 2017 à 0:03:06

  • Partager sur Facebook
  • Partager sur Twitter
20 mai 2017 à 19:20:52

Je vous remercie de votre poste car il m'a aidé à comprendre pas mal de chose. En ayant tester votre code je me suis rendu compte que le clic était très rapide. Il m'arrive de cliquer une fois et que l'image change deux fois. Peut-être faudrait-il attendre le relâchement du clic avant de changer d'image, qu'en pensez vous ?
  • Partager sur Facebook
  • Partager sur Twitter
20 mai 2017 à 22:11:24

Salut,

Effectivement, comme j'ai dis à la dernière ligne. :) :) :)

""" Il n'est pas parfait, puisqu'il maintient le clique, donc peut revenir à sa couleur initiale """

Il faudra user de votre imagination. (C'est de moins en moins facile, avec internet, de nos jours. Tout est copier/coller)

On prend la programmation, comme une salle de gym. On prend nos anabolisants sur internet, pour grossir plus vite. Sans se concentrez sur notre apprentissage.  :)

Vous demandiez des explications, ou un script déjà tout fait?

Vous vous demandiez comment créer un menu. Maintenant, vous l'avez. Ensuite, il faut comprendre et essayez n'importe quoi.

Recevoir exactement ce qu'il faut, pour que vous créez un autre post, avec un autre bout de code. Au bout, es-ce que vous comprenez quelque chose?

Donc, à vous de voir, ce que vous pourriez faire. Vous êtes déjà dans une boucle while. Utilisez-là :)

Comme un compteur, comme un détecteur de MouseUP MouseDown, comme peu importe :)

Honnêtement, vous feriez mieux d'essayer n'importe quoi, et de poster du code que vous comprenez pas. N'attendez pas d'Exemple, à chaque fois, même si vous avez de beau yeux. :waw:

Bonne chance

A+

  • Partager sur Facebook
  • Partager sur Twitter
21 mai 2017 à 11:51:18

J'ai réussi merci 

-
Edité par ProgramAce 21 mai 2017 à 16:44:40

  • Partager sur Facebook
  • Partager sur Twitter
21 mai 2017 à 22:09:54

Chouette,

Fait plaisir. Comme je vous dis, n'hésitez pas pour les questions :)

Bonne chance

A+

  • Partager sur Facebook
  • Partager sur Twitter
30 mai 2017 à 19:24:56

J'aurai une petite question :

Pourriez vous m'expliquer que représente le ( 255,0,0), ?

Je ne comprend pas cette manière de l'écrire à la ligne. Que représente - il ? Pourquoi ne pas l'avoir mis a la suite de fenêtre ?

def menu():
    rect = pygame.draw.rect(
        fenetre,
        (255,0,0),
        pygame.Rect(100, 200, 100, 100))

Merci :)

  • Partager sur Facebook
  • Partager sur Twitter
1 juin 2017 à 5:10:25

Salut,

Pour votre première question c'est uniquement le code RGB de la couleur.

##(R, G, B)
#(255, 0, 0)

Red = 255
Green = 0
Blue = 0

Voici un exemple:

import pygame

pygame.init()
fenetre.display.set_mode((200,200))

COULEURS = {
    'white': (255,255,255),
    'black': (0,0,0),
    'red': (255,0,0),
    'green': (0,255,0),
    'blue': (0,0,255),
    'yellow': (255,255,0),
}

white True:
    fenetre.fill( COULEURS['white'] )
    pygame.display.flip()

pygame.quit()

Pour votre deuxième question, c'est uniquement une méthode, pour commenter (j'ai avais enlevés, je pensais que vous en aviez pas besoin), les arguments donnés.

Exemple:

    rect = pygame.draw.rect(
        ## La surface
        fenetre,
        ## La couleur
        (255,0,0),
        ## Le rectangle
        pygame.Rect(100, 200, 100, 100))

De plus, selon le PEP 8 de python, les lignes doivent posséder un maximum de 79 caractères. S'il possède un long texte c'est 72 caractères par lignes.

Voici le lien de python :)

Le comment du pourquoi, j'en ai aucune idée :)

C'est juste un "style" standard, pour que les programmeurs se comprennent un peu entre-eux, en structurant le code. (Je crois, ce qui serait logique, puisqu'il y a tellement de chemin qui mène à Rome :))

Surtout si les écrans, ne sont pas de la même grandeur, dans le monde. Cela devient fatiguant de déplacer le curseur à droite, pour lire/exécuter du code, surtout s'il n'est pas le vôtre.

Exemple:

## CECI:
salut = "Coucou, ça va bien? Moi oui, très bien. Alors, la journée, c'est bien passé? Bien sure, comme d'habitude. Qu'elle belle température, vous trouvez pas? De que c? Hakuna Matata"


## OU CECI:
salut = "Coucou, ça va bien? Moi oui, très bien. " + \
        "Alors, la journée, c'est bien passé? " + \
        "Bien sure, comme d'habitude. " + \
        "Qu'elle belle température, vous trouvez pas? " + \ 
        "De que c? Hakuna Matata"



Bonne chance

A+

-
Edité par nolimitech 1 juin 2017 à 5:19:18

  • Partager sur Facebook
  • Partager sur Twitter
1 juin 2017 à 12:22:37

Merci de votre réponse

Je comprend un peu mieux, en revanche si je ne souhaite pas avoir une couleur pour le rectangle car je souhaite mettre une image. J'ai simplement blit l'image par dessus car si j'enlève la couleur du rect sa ne marche plus. 

De plus je comprend pas c'est qu'est rectangle.collidepoint, on défini un rect mais on appelle un rectangle, comment sait-il ce qu'est rectangle ? Car il faut bien exprimer la collision de point entre la souris et le rect non ?

  • Partager sur Facebook
  • Partager sur Twitter
2 juin 2017 à 0:13:51

Salut,

Pour commencer, tout fonctionne par couche. Étape par étape, ligne par ligne. Dans votre boucle WHILE, chaque .fill() et .blit() seront affiché par couche. Donc, du premier au dernier, selon l'ordre écrit.

Si vous .blit() l'image, avant un .fill(), votre image est caché par ce fill. (Il rempli l'écran de couleur, après)

Ensuite, chaque surface à son propre rectangle. Donc:

import pygame

pygame.init()

#### Surfaces ####
## Surface Fenetre
fenetre = pygame.display.set_mode((200,200))

## Surface Images
image = pygame.image.load('image.gif')
# Rectangle de l'image
image_rect = image.get_rect()
# Position du départ, de l'image dans la fenêtre
image_rect.topleft = (100,100)


while True:
    ## SI C'EST UNE COULEUR UNIE (ARRIÈRE-PLAN)
    #fenetre.fill( (0,0,0) )

    ## SI C'EST UNE IMAGE D'ARRIÈRE-PLAN #Pos (0,0)
    fenetre.blit(image, (0,0)) #

    ## SI C'EST UNE IMAGE À PLACER #Pos (100,100)
    #fenetre.blit(image, image_rect)


    pygame.display.update()

pygame.quit()

Si cela ne répond pas à votre première question, il faudrait voir votre code. Es-ce le code que j'ai écris? Sinon, vous pouvez l'écrire.

En fait, vous devez pas créer de rectangle, si c'est une image. Puisque vous prenez le rectangle de cette image. Donc, l'Exemple de l'autre post devrait être ceci:

image = pygame.image.load('image.gif')
image_rect = image.get_rect() ## Son Rectangle
image_rect.topleft = (0,0) # Sa Position

def menu():
## Blit, à la place de créer un Rectangle
    fenetre.blit(image, (0,0))
    #fenetre.blit(image, image_rect) 


    text = myfont.render('ButtonA', False, (255,255,255))
    fenetre.blit(text, (100,200))
 
    gerer_mouse_menu(rect)

Pour en ajouter, quelque fois, on remarque le contour de l'image, donc c'est deux fonctions peuvent être utile.

imageRGB = pygame.image.load('image.gif').convert() ## RGB
imageRGBA = pygame.image.load('image.gif').convert_alpha() ## RGBA (Transparence, .png)

De plus, si cela ne fonctionne toujours pas, on déclare une variable couleur_background, que l'on donne à tous les rectangles, ce qui cachera le contour, en le camouflant, avec l'arrière-plan. (Ce qui est utile, lorsque l'on veut une forme géométrique, autre que le rectangle.)

Pour votre deuxième question, comme je vous disais plus haut, tous les SURFACES ont leurs propres RECTANGLES. Donc, vous pouvez comparez à tout moment deux rectangles (donc, deux surfaces), pour collisions.

Le colliderect, prend un rectangle(x1,y1,x2,y2) comme argument.

Le collidepoint, prend des points(x,y), comme argument.

Donc, il va prendre son propre rectangle et le comparez avec soit un autre rectangle ou un point.

rectangle.collidepoint(x, y)
rectangle.colliderect(rect)

Puisque, pygame.mouse.get_pos() retourne une coordonnées X et Y (Donc, un point), on prend le rectangle.collidepoint(x, y), pour détecter le clique de souris ce le rectangle.

Si vous avez deux rectangles(donc, deux surfaces), on fait comme cet exemple.

Voici un exemple:

import pygame
 
pygame.init()
 
RUNNING = True
 
fenetre = pygame.display.set_mode((500,500))

image = pygame.image.load('image.gif')
image_rect = image.get_rect()
image_rect.topleft = (100,100)

def all_evenements():
    global RUNNING
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            RUNNING = False

    ## Faire bouger personnage
    pressed = pygame.key.get_pressed()
    if pressed[pygame.K_UP]:
        image_rect.y -= 1
    if pressed[pygame.K_DOWN]:
        image_rect.y += 1
    if pressed[pygame.K_LEFT]:
        image_rect.x -= 1
    if pressed[pygame.K_RIGHT]:
        image_rect.x += 1

def gerer_collisions(rectA, rectB):
    collision = rectA.colliderect(rectB)
    if collision:
        print('COLLISION...')
     

while RUNNING:
    fenetre.fill( (0,0,0) )
    
    fenetre.blit(image, image_rect)

    obstacle = pygame.draw.rect(
        fenetre,
        (0,255,0),
        pygame.Rect(0, 0, 100, 100))
 
    all_evenements()
    gerer_collisions(image_rect, obstacle) ## Comparez deux rectangles
         
    pygame.display.update()
        
pygame.quit()

N'hésitez pas pour les questions.

Bonne chance

A+

-
Edité par nolimitech 2 juin 2017 à 0:18:28

  • Partager sur Facebook
  • Partager sur Twitter
11 janvier 2019 à 11:18:09

bonjour jai un projet a rendre mardi qui consiste a faire des sos dans un tableau avec pygame. je pricise que c'est deux joueurs Qui s'affrontent .

jai reussi a afficher le tableau mais je n'arrive pas a implementer les sos . je voudrais quand le joueur 1 selectionne une casse quand il clique une premiere fois que sa affiche un S une deuxieume fois un O et s'il reclique que ca affiche un 0 . si c'est necessaire d'envoyer mon code dite le moi.

Merci je compte sur votre aide

  • Partager sur Facebook
  • Partager sur Twitter
17 mai 2022 à 9:39:36 - Message modéré pour le motif suivant : Merci de créer votre propre sujet


17 mai 2022 à 15:06:55

Bonjour,

Déterrage

Citation des règles générales du forum :

Avant de poster un message, vérifiez la date du sujet dans lequel vous comptiez intervenir.

Si le dernier message sur le sujet date de plus de deux mois, mieux vaut ne pas répondre.
En effet, le déterrage d'un sujet nuit au bon fonctionnement du forum, et l'informatique pouvant grandement changer en quelques mois il n'est donc que rarement pertinent de déterrer un vieux sujet.

Au lieu de déterrer un sujet il est préférable :

  • soit de contacter directement le membre voulu par messagerie privée en cliquant sur son pseudonyme pour accéder à sa page profil, puis sur le lien "Ecrire un message"
  • soit de créer un nouveau sujet décrivant votre propre contexte
  • ne pas répondre à un déterrage et le signaler à la modération

Je ferme ce sujet. En cas de désaccord, me contacter par MP.

  • Partager sur Facebook
  • Partager sur Twitter