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 :

PyGame : Affichage des fonts


Sujet :

Programmation multimédia/Jeux Python

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    33
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 33
    Points : 22
    Points
    22
    Par défaut PyGame : Affichage des fonts
    Bonjour ou rebonjour pour certains,

    J'ai fabriqué ma première petite animation avec PyGame : utilisations des Rect (merci à josmiley pour le coup de main !). Je suis donc passé à la suite : intéragir avec l'utilisateur.
    Pour cela, je me suis dis qu'un simple morpion ferait l'affaire. J'ai passé 2 bonnes heures dessus mais j'y suis arrivé.
    Pour corser un peu la chose, j'ai voulu tenter d'afficher qui était le vainqueur en cas de victoire (voir match nul et réinitialisation pourquoi pas) !
    Et bien je bloque totalement sur ce fichu affichage. J'essaye d'afficher un message au milieu de la fenêtre et centré en fonction de la longueur du texte. Et bien je galère pas mal. Mais ce qui m'empêche le plus d'avancer c'est l'affichage du texte. Au moment ou je déclenche le display du texte, il ne s'affiche pas. Mais le plus étonnant c'est que le texte s'affiche uniquement si je réduit la fenêtre (direction la barre des tâches ouindoz) et que je la réaffiche.
    J'avoue être totalement bluffé par ce "fonctionnement". Ma gestion des event est pourtant assez simpliste, je catch uniquement les click souris.

    Quelque chose vous parait étrange la dedans ?
    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
     
    from pygame import *
    import random
     
    init()
    scrrect = Rect(0,0,300,300) # rectangle de la fenetre
    screen = display.set_mode(scrrect.size) # creation de a fenetre
     
    class Plateau(Rect):
     
        def __init__(self, rect):
            self.lignes = [Ligne(0), Ligne(1), Ligne(2)]
            self.colonnes = [Colonne(0, self.lignes), Colonne(1, self.lignes), Colonne(2, self.lignes)]
            self.diagonales = [Diagonale(self.lignes, 0, 1), Diagonale(self.lignes, 2, -1)]
            self.rect = rect
            self.joueurActif = 1
            self.annonce = Annonce(self.rect)
     
        def switchPlayer(self):
            if self.joueurActif == 1:
                self.joueurActif = 2
            elif self.joueurActif == 2:
                self.joueurActif = 1
     
        def click(self, xclick, yclick):
            for ligne in self.lignes:
                for case in ligne.cases:
                    if case.joueur == 0 and case.collidepoint(xclick, yclick):
                        case.update(self.joueurActif)
                        return True
            return False
     
        def checkWin(self):
            for ligne in self.lignes:
                if ligne.checkComplete():
                    return True
            for colonne in self.colonnes:
                if colonne.checkComplete():
                    return True
            for diagonale in self.diagonales:
                if diagonale.checkComplete():
                    return True
            return False
     
        def displayWinner(self):
            self.annonce.display("Joueur "+str(self.joueurActif)+" gagne !", self)
     
    class Diagonale():
        def __init__(self, lignes, y, pas):
            self.cases = [lignes[0].cases[y+0*pas], lignes[1].cases[y+1*pas], lignes[2].cases[y+2*pas]]
            self.complete = False
     
        def checkComplete(self):
            prems = self.cases[0].joueur
            if prems == 0:
                return False
            for c in self.cases:
                if c.joueur != prems:
                    return False
            return True
     
    class Ligne():
     
        def __init__(self, index):
            self.cases = [Case(0, index), Case(1, index), Case(2, index)]
            self.idx = index
            self.complete = False
     
        def checkComplete(self):
            prems = self.cases[0].joueur
            if prems == 0:
                return False
            for c in self.cases:
                if c.joueur != prems:
                    return False
            return True
     
    class Colonne():
     
        def __init__(self, index, lignes):
            self.cases = [lignes[0].cases[index], lignes[1].cases[index], lignes[2].cases[index]]
            self.idx = index
            self.complete = False
     
        def checkComplete(self):
            prems = self.cases[0].joueur
            if prems == 0:
                return False
            for c in self.cases:
                if c.joueur != prems:
                    return False
            return True
     
    class Case(Rect):
        rect = Rect(0,0,100,100)
     
        def __init__(self, ligne, colonne):
            self.joueur = 0
            self.ligne = ligne
            self.colonne = colonne
            self.img = None
            Rect.__init__(self,Case.rect.move((self.ligne)*100,(self.colonne)*100))
     
        def update(self, joueur):
            self.img = image.load("player"+str(joueur)+".png")
            self.joueur = joueur
            screen.blit(self.img,self)
     
    class Annonce(Rect):
        fontObj = font.Font(None, 50)
        font = fontObj.render("",1,(255,255,255))
        rect = font.get_rect()
     
        def __init__(self, pltRect):
            Rect.__init__(self, Annonce.rect.move(pltRect.w/2 - Annonce.rect.w/2, pltRect.h/2 - Annonce.rect.h/2))
     
        def display(self, text, pltRect):
            font = Annonce.fontObj.render(text,1,(255,255,255))
            rect = font.get_rect()
            self.move(pltRect.w/2 - rect.w/2, pltRect.h/2 - rect.h/2)
            screen.blit(font, self)
     
     
     
     
    pltJeu = Plateau(Rect(0,0,300,300))
    state = 0
     
    while state != 2:
        action = event.wait()
        if action.type == QUIT:
            state = 2
        elif action.type == MOUSEBUTTONDOWN:
            if state == 1:
                state == 2
            else:
                x,y = mouse.get_pos()
                if pltJeu.rect.collidepoint(x,y):
                    if pltJeu.click(x,y):
                        display.flip()
                        if pltJeu.checkWin():
                            state = 1
                            pltJeu.displayWinner()
                        else:
                            pltJeu.switchPlayer()
    display.quit()
    sys.exit()

  2. #2
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    1 049
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 1 049
    Points : 1 380
    Points
    1 380
    Par défaut
    essayes en remplaçant la ligne 121 par:

    display.update(screen.blit(font, self))

    apparement tu oublies d'actualiser l'affichage, ce que fait ton OS quand tu rapelles ta fenêtre sur la bureau ....

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    33
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 33
    Points : 22
    Points
    22
    Par défaut
    Effectivement, ta ligne de code corrige mon problème d'affichage. Par contre, comment se fait-il que mes "blit" fonctionnent sans problème pour d'autre objets ? Des images par exemple.

  4. #4
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    1 049
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 1 049
    Points : 1 380
    Points
    1 380
    Par défaut
    tu as un display.flip() dans ton mainloop qui semble être appelé régulièrement, donc actualise l'affichage régulièrement. Peut-être qu'à la fin de la partie tu blit le nom du gagant puis tu sors du mainloop sans actualiser l'affichage ... à moins que la ligne 135 soit en cause, car c'est un test et non une affectation
    j'ai pas testé ton code car j'ai la flemme de créer des images à charger.

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    33
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 33
    Points : 22
    Points
    22
    Par défaut
    Hum, trop de lacunes ... je vais étudier les fonctions flip, blit etc ... pour bien comprendre à quoi elles servent.
    En attendant, le soucis de la ligne 135 empêchai mon programme de s'arrêter normalement. Même si ce n'était pas le sujet, je pense que tu viens de m'épargner quelques touffes de cheveux en moins là (les erreurs les plus évidentes prennent beaucoup de temps !).

    Merci beaucoup, encore une fois, pour ton aide !

    Ps : mais tu es le seul qui pratique PyGame ici ? Je vais avoir des remords à te déranger sans arrêt

  6. #6
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    1 049
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 1 049
    Points : 1 380
    Points
    1 380
    Par défaut
    Citation Envoyé par Ziranium Voir le message
    Je vais avoir des remords à te déranger sans arrêt
    aucun problème

    par contre, presque 150 lignes pour un morpion ça fair beaucoup non ?
    j'ai codé ça ce matin:

    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
    from pygame import *
    from random import sample
    font.init()
    police = font.Font(None,50)
     
    def game():
        scr = display.set_mode((302,302))
        rects = [scr.fill(-1,(x,y,100,100)).inflate(-25,-25) for x in 0,101,202 for y in 0,101,202]
        display.flip()
     
        grid = ['']*9
        combi = lambda: (grid[0:3],grid[3:6],grid[6:9],grid[0:7:3],grid[1:8:3],grid[2:9:3],grid[0:9:4],grid[2:7:2])
        ai = sample(range(9),9)
        player = 0
     
        def play():
            if player:
                while True:
                    ev = event.wait()
                    if ev.type == MOUSEBUTTONDOWN:
                        index = ev.pos[0]/101*3+ev.pos[1]/101
                        if grid[index] == '':
                            grid[index] = player
                            display.update(draw.ellipse(scr,0xa00000,rects[index],10))
                            break
            else:
                while grid[ai[-1]] != '': ai.pop()
                index = ai.pop()
                grid[index] = player
                draw.line(scr,0x0000a0,rects[index].topright,rects[index].bottomleft,10)
                display.update(draw.line(scr,0x0000a0,rects[index].topleft,rects[index].bottomright,10))
     
     
        play()
        for coup in range(9):
            if coup == 8:
                txt = police.render("aucun gagnant",1,(0,0,0),(240,240,255))
                break
            player = ~player
            play()
            if [player]*3 in combi():
                txt = police.render(("ordi","humain")[player]+" gagne",1,(0,0,0),(240,240,255))
                break
        rect = txt.get_rect()
        rect.center = 156,156
        display.update(scr.blit(txt,rect))
     
    game()
    while True:
        ev = event.wait()
        if ev.type == QUIT: break
        elif ev.type == MOUSEBUTTONDOWN: game()

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    33
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 33
    Points : 22
    Points
    22
    Par défaut
    Oui je suis tout à fait d'accord avec toi, c'est beaucoup pour le peu que je cherche à faire.
    Par contre, j'ai volontairement utilisé plusieurs classes pour me familiariser avec le Python Objet, car je n'en ai pas l'habitude.
    J'aurais pus effectivement me limiter à un simple plateau sans chercher à coder les objets Ligne, Colonne, ou Diagonale.

    Je me suis dis aussi que si j'avais besoin de le modifier en y ajoutant des lignes, par exemple un morpion de 5x5 ou 7x7, ce serait plutôt simple à modifier.
    Je me suis arrêté hier soir sur le soucis d'afficher mon message annoncant le gagnant au milieu de l'écran, pour l'instant c'est un echec. C'est le coin supérieur gauche qui est centré et non le Rect contenant le texte.
    D'ailleurs, connais-tu un moyen simple de "colorier" le fond d'un objet Rect afin de voir réellement son placement ?

  8. #8
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    1 049
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 1 049
    Points : 1 380
    Points
    1 380
    Par défaut
    Pour aligner des rectangles on se sert de leurs properties.
    Regardes dans mon code, c'est un truc qui ressemble à ça ...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    rect_du_screen = (0,0,600,600)
     
    rect_du_text = surface_du_txt.get_rect()
    rect_du_text.center = rect_du_screen.center
    screen.blit(surface_du_txt,rect_du_text)

  9. #9
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    33
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 33
    Points : 22
    Points
    22
    Par défaut
    Et bien je n'ai pas réussi du premier coup, mais j'ai décelé une autre erreur dans mon code du coup

    Ca fonctionne désormais comme je le voulais, merci !

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

Discussions similaires

  1. Font de l'affichage des choix proposés par autocompletion
    Par Manulegosny dans le forum Windows Forms
    Réponses: 1
    Dernier message: 12/03/2008, 00h05
  2. affichage des pièces jointe sous outllook 2000
    Par darkbm dans le forum Autres Logiciels
    Réponses: 2
    Dernier message: 29/10/2003, 11h32
  3. Réponses: 1
    Dernier message: 06/03/2003, 11h57
  4. Forcer l'affichage des dizaines...
    Par pataluc dans le forum Langage
    Réponses: 4
    Dernier message: 26/11/2002, 19h38
  5. [VB6] [Flexgrid] Format d'affichage des numériques
    Par yansolo dans le forum VB 6 et antérieur
    Réponses: 5
    Dernier message: 19/10/2002, 21h00

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