IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Python Discussion :

Création d'un Menu [JEU]


Sujet :

Python

  1. #1
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2017
    Messages
    95
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 24
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2017
    Messages : 95
    Points : 80
    Points
    80
    Par défaut Création d'un Menu [JEU]
    Bonsoir,

    Je fais appel à vous aujourd'hui j'aurai besoin d'aide afin de pouvoir créer une page d'accueil pour un jeu.

    J'aimerai que ma page d'accueil puisse avoir deux boutons ''Start'' et "Quitter" et une sorte de musique de fond (Je sais la mettre mais ce n'est pas une priorité).

    Je vous met mon avancement sur le programme tout en bas (Pour l'instant c'est juste l'affichage d'une interface graphique avec un fond gris) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
     
    import pygame
    pygame.init()
     
    pygame.display.set_caption("ISN ILIES")
     
    surfaceW = 800 #Dimension de la fenêtre / Largeur
    surfaceH = 600 #Dimension de la fenêtre / Longueur
     
     
    screen = pygame.display.set_mode((surfaceW,surfaceH)) #Taille Ecran
    myfont = pygame.font.SysFont('Helvetic', 20)
     
    gris = (150,150,150) #Intensité de luminosité MAX 255 / RVB
     
    def cloture(): #Structure
        #Fermeture de la fenêtre
        game_over = False #Le Programme tourne normalement
        while not game_over: #Tant qu'il tourne = NP
            for event in pygame.event.get():
                if event.type == pygame.QUIT: #Si l'événement de Pygame qui s'execute est égale au boutton rouge X
                    game_over= True   #La page se ferme
     
            screen.fill(gris) #Fond écran en gris
            pygame.display.update() #rafraichissement du fond
     
     
     
    cloture()
    pygame.quit()
    quit()
    Je vous remercie d'avance sur vos futurs aides, sinon je vais essayer d'avancer de mon coté.

  2. #2
    Membre confirmé

    Homme Profil pro
    Bidouilleur
    Inscrit en
    Avril 2016
    Messages
    721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Bidouilleur

    Informations forums :
    Inscription : Avril 2016
    Messages : 721
    Points : 503
    Points
    503
    Billets dans le blog
    1
    Par défaut
    Salut,

    Qu'est-ce qu'au final un menu dans pygame ?
    Ce n'est qu'un ensemble de surfaces représentant les boutons du menu.

    Un exemple très basique sans fioritures.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    import pygame
     
    surfaceW = 800 #Dimension de la fenêtre / Largeur
    surfaceH = 600 #Dimension de la fenêtre / Longueur
     
    class Menu :
        """ Création et gestion des boutons d'un menu """
        def __init__(self, application, *groupes) :
            self.couleurs = dict(
                normal=(0, 200, 0),
                survol=(0, 200, 200),
            )
            font = pygame.font.SysFont('Helvetica', 24, bold=True)
            # noms des menus et commandes associées
            items = (
                ('JOUER', application.jeu),
                ('QUITTER', application.quitter)
            )
            x = 400
            y = 200
            self._boutons = []
            for texte, cmd in items :
                mb = MenuBouton(
                    texte,
                    self.couleurs['normal'],
                    font,
                    x,
                    y,
                    200,
                    50,
                    cmd
                )
                self._boutons.append(mb)
                y += 120
                for groupe in groupes :
                    groupe.add(mb)
     
        def update(self, events) :
            clicGauche, *_ = pygame.mouse.get_pressed()
            posPointeur = pygame.mouse.get_pos()
            for bouton in self._boutons :
                # Si le pointeur souris est au-dessus d'un bouton
                if bouton.rect.collidepoint(*posPointeur) :
                    # Changement du curseur par un quelconque
                    pygame.mouse.set_cursor(*pygame.cursors.tri_left)
                    # Changement de la couleur du bouton
                    bouton.dessiner(self.couleurs['survol'])
                    # Si le clic gauche a été pressé
                    if clicGauche :
                        # Appel de la fonction du bouton
                        bouton.executerCommande()
                    break
                else :
                    # Le pointeur n'est pas au-dessus du bouton
                    bouton.dessiner(self.couleurs['normal'])
            else :
                # Le pointeur n'est pas au-dessus d'un des boutons
                # initialisation au pointeur par défaut
                pygame.mouse.set_cursor(*pygame.cursors.arrow)
     
        def detruire(self) :
            pygame.mouse.set_cursor(*pygame.cursors.arrow) # initialisation du pointeur
     
     
     
    class MenuBouton(pygame.sprite.Sprite) :
        """ Création d'un simple bouton rectangulaire """
        def __init__(self, texte, couleur, font, x, y, largeur, hauteur, commande) :
            super().__init__()
            self._commande = commande
     
            self.image = pygame.Surface((largeur, hauteur))
     
            self.rect = self.image.get_rect()
            self.rect.center = (x, y)
     
            self.texte = font.render(texte, True, (0, 0, 0))
            self.rectTexte = self.texte.get_rect()
            self.rectTexte.center = (largeur/2, hauteur/2)
     
            self.dessiner(couleur)
     
        def dessiner(self, couleur) :
            self.image.fill(couleur)
            self.image.blit(self.texte, self.rectTexte)
     
        def executerCommande(self) :
            # Appel de la commande du bouton
            self._commande()
     
     
    class Jeu :
        """ Simulacre de l'interface du jeu """
        def __init__(self, jeu, *groupes) :
            self._fenetre = jeu.fenetre
            jeu.fond = (0, 0, 0)
     
            from itertools import cycle
            couleurs = [(0, 48, i) for i in range(0, 256, 15)]
            couleurs.extend(sorted(couleurs[1:-1], reverse=True))
            self._couleurTexte = cycle(couleurs)
     
            self._font = pygame.font.SysFont('Helvetica', 36, bold=True)
            self.creerTexte()
            self.rectTexte = self.texte.get_rect()
            self.rectTexte.center = (surfaceW/2, surfaceH/2)
            # Création d'un event
            self._CLIGNOTER = pygame.USEREVENT + 1
            pygame.time.set_timer(self._CLIGNOTER, 80)
     
        def creerTexte(self) :
            self.texte = self._font.render(
                'LE JEU EST EN COURS D\'EXÉCUTION',
                True,
                next(self._couleurTexte)
            )
     
        def update(self, events) :
            self._fenetre.blit(self.texte, self.rectTexte)
            for event in events :
                if event.type == self._CLIGNOTER :
                    self.creerTexte()
                    break
     
        def detruire(self) :
            pygame.time.set_timer(self._CLIGNOTER, 0) # désactivation du timer
     
     
    class Application :
        """ Classe maîtresse gérant les différentes interfaces du jeu """
        def __init__(self) :
            pygame.init()
            pygame.display.set_caption("ISN ILIES")
     
            self.fond = (150,)*3
     
            self.fenetre = pygame.display.set_mode((surfaceW,surfaceH))
            # Groupe de sprites utilisé pour l'affichage
            self.groupeGlobal = pygame.sprite.Group()
            self.statut = True
     
        def _initialiser(self) :
            try:
                self.ecran.detruire()
                # Suppression de tous les sprites du groupe
                self.groupeGlobal.empty()
            except AttributeError:
                pass
     
        def menu(self) :
            # Affichage du menu
            self._initialiser()
            self.ecran = Menu(self, self.groupeGlobal)
     
        def jeu(self) :
            # Affichage du jeu
            self._initialiser()
            self.ecran = Jeu(self, self.groupeGlobal)
     
        def quitter(self) :
            self.statut = False
     
        def update(self) :
            events = pygame.event.get()
     
            for event in events :
                if event.type == pygame.QUIT :
                    self.quitter()
                    return
     
            self.fenetre.fill(self.fond)
            self.ecran.update(events)
            self.groupeGlobal.update()
            self.groupeGlobal.draw(self.fenetre)
            pygame.display.update()
     
     
    app = Application()
    app.menu()
     
    clock = pygame.time.Clock()
     
    while app.statut :
        app.update()
        clock.tick(30)
     
    pygame.quit()
    Si tu es assez familier avec l'objet en python, cela ne devrait je pense, pas être trop difficile à comprendre.
    Le menu relie les boutons (qui sont des surfaces) à l'application, application qui se charge de gérer les affichages selon les appels fait aux méthodes jeu et menu, on peut bien évidemment ajouter d'autres boutons, par exemple pour définir les options éventuelles du jeu, les scores, etc.

    Ici, la sélection d'un bouton menu se fait via un clic souris, ce qui est cohérent si ton jeu utilise la souris, néanmoins si ton jeu se joue exclusivement au clavier, il serait sans doute préférable d'en faire de même pour le menu, la touche tab pour parcourir les boutons du menu, entrée ou espace pour simuler l'appui sur un bouton.

    C'est bien entendu dans la classe Jeu que devra se situer le code gérant le déroulement de ton jeu.
    Tout ceci n'est qu'une ébauche, mais les bases principales sont là, à toi de modifier cela selon tes besoins.

    Bon courage.
    Le temps ronge l'amour comme l'acide.

  3. #3
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2017
    Messages
    95
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 24
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2017
    Messages : 95
    Points : 80
    Points
    80
    Par défaut CODE MENU
    Bonsoir,

    Merci pour ta/votre réponse !

    Mais.. le programme est trop compliqué pour que je puisse le comprendre.
    Je comprends l'utilité de quelques fonctions, mais à plusieurs moments je m'y perds.

    Serait-il possible d'y aller pas à pas avec moi s'il vous plait ?

    Merci ! (Encore désolé du retard..)

  4. #4
    Membre confirmé

    Homme Profil pro
    Bidouilleur
    Inscrit en
    Avril 2016
    Messages
    721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Bidouilleur

    Informations forums :
    Inscription : Avril 2016
    Messages : 721
    Points : 503
    Points
    503
    Billets dans le blog
    1
    Par défaut
    Salut,

    Difficile de t'expliquer quelque chose, ce code reste assez rudimentaire, après si tu n'as aucune notion avec l'objet en python, je comprends que tu puisses être perdu.
    Mais lorsque tu utilises pygame, tu te sers déjà de l'objet

    Le mieux serait déjà de suivre un tutoriel sur la poo en python pour au moins en comprendre le fonctionnement et sa syntaxe.
    Sinon, montre toujours les portions de ce code qui te semble difficile à comprendre, j'essaierai (ou quelqu'un d'autre) d'expliquer un peu.
    Le temps ronge l'amour comme l'acide.

  5. #5
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2019
    Messages
    1
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 24
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2019
    Messages : 1
    Points : 1
    Points
    1
    Par défaut Besoin d'aide
    Clicgauche ,*_= pygame.mouse.get_pressed() <== je me suis permis de faire une copie de ce code pour le tester et voir jusqu'où ça pourrait me mener et j'ai trouver cette erreur que je n'arrive pas à résoudre , je suis en pls sur de la base un peu d'aide serait la bienvenue merci bien .

  6. #6
    Membre confirmé

    Homme Profil pro
    Bidouilleur
    Inscrit en
    Avril 2016
    Messages
    721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Bidouilleur

    Informations forums :
    Inscription : Avril 2016
    Messages : 721
    Points : 503
    Points
    503
    Billets dans le blog
    1
    Par défaut
    Salut.

    De quelle erreur parles-tu ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    clicGauche, *_ = pygame.mouse.get_pressed()
    Fonctionne parfaitement, pygame.mouse.get_pressed retourne 3 valeurs, seule la première est utilisée, donc on utilise l'unpacking (le *) pour dire à python de stocker le restant des valeurs dans la variable _ qui par convention comme dans d'autres langages est une sorte de variable « poubelle ». Si on n'utilisait pas l'opérateur *, python jetterait une erreur.
    Le temps ronge l'amour comme l'acide.

  7. #7
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 287
    Points : 36 776
    Points
    36 776
    Par défaut
    Citation Envoyé par bistouille Voir le message
    pour dire à python de stocker le restant des valeurs dans la variable _ qui par convention comme dans d'autres langages est une sorte de variable « poubelle ». Si on n'utilisait pas l'opérateur *, python jetterait une erreur.
    C'est une syntaxe qui demande une version de Python >=3.5.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  8. #8
    Membre confirmé

    Homme Profil pro
    Bidouilleur
    Inscrit en
    Avril 2016
    Messages
    721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Bidouilleur

    Informations forums :
    Inscription : Avril 2016
    Messages : 721
    Points : 503
    Points
    503
    Billets dans le blog
    1
    Par défaut
    Peut-être > 3.4.2 ou 3.4.4 ?

    Car en 3.4.8, cela fonctionne, je n'ai plus de version antérieure à la 3.4.8 en version 3 pour voir, et la flemme de chercher dans l'historique des versions

    Edit: Cela fonctionne aussi avec python 3.4.2, j'en avvais toujours une version planquée, donc, je vois pas.
    Le temps ronge l'amour comme l'acide.

  9. #9
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 287
    Points : 36 776
    Points
    36 776
    Par défaut
    Citation Envoyé par bistouille Voir le message
    Edit: Cela fonctionne aussi avec python 3.4.2, j'en avvais toujours une version planquée, donc, je vois pas.
    ah oui... après quelques recherches, çà date de la 3.0 avec le PEP 3132.
    La 3.5 améliore aussi les choses de ce côté mais dans un tout autre domaine voir PEP 448.
    Désolé... mais rien ne dit que le PO n'utilise pas une version 2

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  10. #10
    Membre confirmé

    Homme Profil pro
    Bidouilleur
    Inscrit en
    Avril 2016
    Messages
    721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Bidouilleur

    Informations forums :
    Inscription : Avril 2016
    Messages : 721
    Points : 503
    Points
    503
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par wiztricks Voir le message
    mais rien ne dit que le PO n'utilise pas une version 2 :mouarf
    C'est plus que probable

    Et merci du lien, je ne savais pas que l'on pouvait utiliser des dictionnaires ainsi comme paramètres de fonctions.
    Le temps ronge l'amour comme l'acide.

  11. #11
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2019
    Messages
    1
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2019
    Messages : 1
    Points : 1
    Points
    1
    Par défaut Aide
    Bonjour, je me permet de réutiliser ce programme et j'aimerais changer le fond de la fenêtre pour mon programme d'ISN. Comment puis je faire pour importer mon image comme fond ?

  12. #12
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 689
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 689
    Points : 30 983
    Points
    30 983
    Billets dans le blog
    1
    Par défaut
    Bonjour

    Il te faut écrire screen.blit(pygame.image.load("image.jpg"), (0, 0)) quand tu veux charger ton image (donc à priori avant d'afficher ton jeu). "screen" étant l'écran dédié à l'affichage du jeu (donc créé par pygame.display.set_mode(size)).

    Et ce n'est pas poli de squatter un forum pour y poser une question qui n'a rien à voir avec la question initiale...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [FLASH MX2004] Création d'un menu.
    Par ALCINA dans le forum Flash
    Réponses: 1
    Dernier message: 16/02/2006, 09h36
  2. [Inno Setup] Création d'un menu d'install "propre"
    Par gizmo2 dans le forum Autres langages
    Réponses: 1
    Dernier message: 18/01/2006, 16h27
  3. Création d'un menu (de langue) dynamiquement
    Par neb-toi dans le forum Langage
    Réponses: 7
    Dernier message: 21/11/2005, 15h27
  4. Création d'un menu
    Par gros bob dans le forum OpenGL
    Réponses: 3
    Dernier message: 15/01/2004, 08h43
  5. [Flash 5] Création d'un menu
    Par WriteLN dans le forum Flash
    Réponses: 4
    Dernier message: 09/10/2003, 13h37

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo