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

Programmation multimédia/Jeux Python Discussion :

probleme pygame event [Python 3.X]


Sujet :

Programmation multimédia/Jeux Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    70
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 70
    Par défaut probleme pygame event
    Bonsoir,

    je suis en train de programmer un jeu d'escape game avec pygame, cela va fonctionner avec la recherche de numéros cachés sur une image et résoudre des énigmes. Pour saisir les numéros, j'utilise un digicode : je sais que je pourrais utiliser le pavé numérique pour plus de facilité.
    Mon problème est que lorsque je clique sur le digicode, je peux faire un print de chaque bouton mais pas de 2 chiffre ou plus.
    j'arrive à afficher 1, 2, 3, 4, etc... séparément, Ce que je voudrais faire c'est par exemple afficher 15 après avoir cliqué sur 1 puis 5 et pour finir sur "ok". Et avec "cancel", faire un reset de ce que l'on vient de saisir avant.

    voici mon code :
    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
     
    import pygame,sys
    import time
    from pygame.locals import *
     
    pygame.display.init()
    ecran = pygame.display.set_mode((1920, 1080)) #Crée la fenêtre de tracé
    ecran.fill((127,127,127))
    bg = pygame.image.load("images/plan_1.png") #charge une image à partir d'un fichier
    bg= pygame.transform.scale(bg, (1280, 720))
    ecran.blit(bg, (0,0)) #Colle l'image en haut à gauche de la fenêtre de tracé (ici, l'ecran)
    pygame.display.flip() #L'affichage devient effectif : l'image est rendue visible.
     
     
    buttons=[]
    # Create Buttons
    buttons.append({ "image" : pygame.image.load("images/1.png"), "position" : (1350, 25)})
    buttons.append({ "image" : pygame.image.load("images/2.png"), "position" : (1540, 25)})
    buttons.append({ "image" : pygame.image.load("images/3.png"), "position" : (1730, 25)})
    buttons.append({ "image" : pygame.image.load("images/4.png"), "position" : (1350, 215)})
    buttons.append({ "image" : pygame.image.load("images/5.png"), "position" : (1540, 215)})
    buttons.append({ "image" : pygame.image.load("images/6.png"), "position" : (1730,215)})
    buttons.append({ "image" : pygame.image.load("images/7.png"), "position" : (1350, 405)})
    buttons.append({ "image" : pygame.image.load("images/8.png"), "position" : (1540, 405)})
    buttons.append({ "image" : pygame.image.load("images/9.png"), "position" : (1730, 405)})
    buttons.append({ "image" : pygame.image.load("images/cancel.png"), "position" : (1350, 595)})
    buttons.append({ "image" : pygame.image.load("images/0.png"), "position" : (1540, 595)})
    buttons.append({ "image" : pygame.image.load("images/ok.png"), "position" : (1730, 595)})
     
    def drawButtons():
      for button in buttons:
        ecran.blit(button["image"], button["position"])
     
    def event_mouse():
        for button in buttons:
            but_img = button['image']
            buttonSize = button['image'].get_rect().size
            buttonPosition = button['position']
            return but_img
     
    def click_button(but_img):
        nbre="" # j'ai mis ceci car UnboundLocalError: local variable 'nbre' referenced before assignment
        if event.type == pygame.MOUSEBUTTONDOWN:
            x, y = event.pos
            if but_img.get_rect(topleft=(1350, 25)).collidepoint(x,y):
                nbre="1"
            if but_img.get_rect(topleft=(1540, 25)).collidepoint(x,y):
                nbre="2"
            if but_img.get_rect(topleft=(1730, 25)).collidepoint(x,y):
                nbre="3"
            if but_img.get_rect(topleft=(1350, 215)).collidepoint(x,y):
                nbre="4"
            if but_img.get_rect(topleft=(1540, 215)).collidepoint(x,y):
                nbre="5"
            if but_img.get_rect(topleft=(1730, 215)).collidepoint(x,y):
                nbre="6"
            if but_img.get_rect(topleft=(1350, 405)).collidepoint(x,y):
                nbre="7"
            if but_img.get_rect(topleft=(1540, 405)).collidepoint(x,y):
                nbre="8"
            if but_img.get_rect(topleft=(1730, 405)).collidepoint(x,y):
                nbre="9"
            if but_img.get_rect(topleft=(1350, 595)).collidepoint(x,y):
                nbre="cancel"
            if but_img.get_rect(topleft=(1540, 595)).collidepoint(x,y):
                nbre="0"
            if but_img.get_rect(topleft=(1730, 595)).collidepoint(x,y):
                nbre="ok"
            print(nbre)
     
     
    loop=True
     
    while loop: #Boucle d'événements
        time.sleep(0.1)
     
        for event in pygame.event.get(): #parcours de la liste des événements
            if(event.type==pygame.QUIT or ( event.type==pygame.KEYDOWN and event.key==pygame.K_ESCAPE)): #interrompt la boucle si nécessaire
                loop = False
     
            drawButtons()
            click_button(event_mouse())
     
     
     
        pygame.display.update()
    pygame.quit()
     
    loop = True
    Pouvez-vous m'aider?
    Merci

  2. #2
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    27 141
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 27 141
    Billets dans le blog
    150
    Par défaut
    Bonjour,

    La variable contenant l'entrée de l'utilisateur doit être mis à jour à chaque appuie (et doit donc s'utiliser comme une liste de chiffre).
    Par exemple :
    Si on tente d'afficher ça, on a la chaîne de caractères "13". Chaîne qui peut s'utiliser comme un tableau, que l'on va parcourir pour faire l'affichage dans le jeu.
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    70
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 70
    Par défaut
    Bonjour,

    c'est ce que j'avais fais, mais je n'avais qu'un chiffre qui s'affichait : à cause du debut de ma fonction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    def click_button(but_img):
        nbre="" # j'ai mis ceci car UnboundLocalError: local variable 'nbre' referenced before assignment
    j'ai mis nbre="" au debut du programme, et remplacer la ligne par global nbre

    Merci

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    70
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 70
    Par défaut
    Bonjour,
    J'ai reouvert le fil, car j'ai un nouveau problème : dans ma fonction affiche_texte(nbre).

    TypeError: object of type 'NoneType' has no len()
    au niveau de nb_char=len(nbre).

    j'ai même mis nb_char=len(nbre) à la fin de la fonction click_button(but_img) et global nb_char dans affiche_texte(nbre),

    mais cette fois ci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ecran.fill((127,127,127),(0,720,(nb_char)*27,49))
    NameError: name 'nb_char' is not defined

    voici mon code :
    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
    import pygame,sys
    import time
    from pygame.locals import *
     
    pygame.init()
    pygame.display.init()
    ecran = pygame.display.set_mode((1920, 1080)) #Crée la fenêtre de tracé
    ecran.fill((127,127,127))
    bg = pygame.image.load("images/plan_1.png") #charge une image à partir d'un fichier
    bg= pygame.transform.scale(bg, (1280, 720))
    ecran.blit(bg, (0,0)) #Colle l'image en haut à gauche de la fenêtre de tracé (ici, l'ecran)
    pygame.display.flip() #L'affichage devient effectif : l'image est rendue visible.
     
     
     
     
    buttons=[]
    # Create Buttons
    buttons.append({ "image" : pygame.image.load("images/1.png"), "position" : (1350, 25)})
    buttons.append({ "image" : pygame.image.load("images/2.png"), "position" : (1540, 25)})
    buttons.append({ "image" : pygame.image.load("images/3.png"), "position" : (1730, 25)})
    buttons.append({ "image" : pygame.image.load("images/4.png"), "position" : (1350, 215)})
    buttons.append({ "image" : pygame.image.load("images/5.png"), "position" : (1540, 215)})
    buttons.append({ "image" : pygame.image.load("images/6.png"), "position" : (1730,215)})
    buttons.append({ "image" : pygame.image.load("images/7.png"), "position" : (1350, 405)})
    buttons.append({ "image" : pygame.image.load("images/8.png"), "position" : (1540, 405)})
    buttons.append({ "image" : pygame.image.load("images/9.png"), "position" : (1730, 405)})
    buttons.append({ "image" : pygame.image.load("images/cancel.png"), "position" : (1350, 595)})
    buttons.append({ "image" : pygame.image.load("images/0.png"), "position" : (1540, 595)})
    buttons.append({ "image" : pygame.image.load("images/ok.png"), "position" : (1730, 595)})
     
    def drawButtons():
     
      for button in buttons:
        ecran.blit(button["image"], button["position"])
     
    nbre=""
    police = pygame.font.SysFont('dejavuserif.ttf', 72)
    del_lettre=False
    loop = True
     
    def event_mouse():
        for button in buttons:
            but_img = button['image']
            buttonSize = button['image'].get_rect().size
            buttonPosition = button['position']
            return but_img
     
    def click_button(but_img):
        global nbre,police
     
        if event.type == pygame.MOUSEBUTTONDOWN:
            x, y = event.pos
            if but_img.get_rect(topleft=(1350, 25)).collidepoint(x,y):
                nbre+="1"
            elif but_img.get_rect(topleft=(1540, 25)).collidepoint(x,y):
                nbre+="2"
            elif but_img.get_rect(topleft=(1730, 25)).collidepoint(x,y):
                nbre+="3"
            elif but_img.get_rect(topleft=(1350, 215)).collidepoint(x,y):
                nbre+="4"
            elif but_img.get_rect(topleft=(1540, 215)).collidepoint(x,y):
                nbre+="5"
            elif but_img.get_rect(topleft=(1730, 215)).collidepoint(x,y):
                nbre+="6"
            elif but_img.get_rect(topleft=(1350, 405)).collidepoint(x,y):
                nbre+="7"
            elif but_img.get_rect(topleft=(1540, 405)).collidepoint(x,y):
                nbre+="8"
            elif but_img.get_rect(topleft=(1730, 405)).collidepoint(x,y):
                nbre+="9"
            elif but_img.get_rect(topleft=(1350, 595)).collidepoint(x,y):
                del_lettre = True
                nbre=nbre[:-1]
            elif but_img.get_rect(topleft=(1540, 595)).collidepoint(x,y):
                nbre+="0"
            elif but_img.get_rect(topleft=(1730, 595)).collidepoint(x,y):
                nbre+="ok"
            else:
                nbre+=""
            return nbre
     
    def affiche_texte(nbre):
    '''Fonction qui doit afficher les chiffres saisi par le digicode et si on supprime une lettre
        global del_lettre
        print("lettre=",del_lettre)
        nb_char=len(nbre)
        image_texte = police.render ( nbre, 1 , (255,255,255) )
        text=ecran.blit(image_texte, (0,720))    
        pygame.display.update()
        if del_lettre==True:
            ecran.fill((127,127,127),(0,720,(nb_char)*27,49))
            image_texte = police.render ( nbre, 1 , (255,255,255) )
            text=ecran.blit(image_texte, (0,720))    
        pygame.display.update()
        return text
     
    while loop: #Boucle d'événements
        time.sleep(0.1)
     
        for event in pygame.event.get(): #parcours de la liste des événements
            if(event.type==pygame.QUIT or ( event.type==pygame.KEYDOWN and event.key==pygame.K_ESCAPE)): #interrompt la boucle si nécessaire
                loop = False
     
        drawButtons() # affiche les boutons
        texte=click_button(event_mouse())
    Pouvez vous m'aider.
    Merci

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    70
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 70
    Par défaut
    Il y a une chose que je ne comprend pas.
    C'est que si dans ecran.fill((127,127,127),(0,720,(nb_char)*27,49)), je remplace nb_char par len(nbre)+1 cela fonctionne.

  6. #6
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    27 141
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 27 141
    Billets dans le blog
    150
    Par défaut
    Je ne vois pas l'appel à affiche_texte. Peut être le paramètre est incorrect.
    Sinon, le len(nbre)+1 fonctionne, car il y a le +1. Si la partie à gauche ne donne pas de résultat correct, il est possible que le +1 rattrape la chose est fasse que le résultat soit 1.
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

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

Discussions similaires

  1. probleme Key event
    Par champity dans le forum Débuter
    Réponses: 2
    Dernier message: 24/04/2009, 17h11
  2. Probleme avec Events Worksheet_Change
    Par reymat dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 28/02/2009, 09h46
  3. [Irrlicht] Probleme avec event.KeyInput.Key
    Par samiblide dans le forum Irrlicht
    Réponses: 1
    Dernier message: 09/07/2007, 01h46
  4. [WebForms][2.0]MasterPage content, problem d'event
    Par zeavan dans le forum ASP.NET
    Réponses: 3
    Dernier message: 07/11/2006, 17h06
  5. [MFC] Probleme Key Events
    Par vainsoul dans le forum MFC
    Réponses: 11
    Dernier message: 08/08/2005, 12h01

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