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 :

Petit problème 2D avec OpenGL [Python 3.X]


Sujet :

Programmation multimédia/Jeux Python

  1. #1
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2015
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Aisne (Picardie)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2015
    Messages : 6
    Points : 4
    Points
    4
    Par défaut Petit problème 2D avec OpenGL
    Bonjour les amis amoureux du bon vieux python !

    Bon tout d'abord je suis un élève de prépa maths en deuxième année et on a fait un peu de python. Comme on ne faisait rien d'intéressant j'ai décider d'approfondir et faire des jeux 2D avec OpenGL !

    Bon j'ai fait un joli petit démineur assez facilement, et aussi un snake.

    Le problème étant que maintenant je me suis lancé sur un tétris T_T !

    Bon je vous explique :


    Le problème survient quand je veux translater mes petites figures de Tetris ( genre un carré ), j'ai tout bien programmé, la pièce bouge du bon coté et tout mais le problème c'est qu'elle met un certain temps pour se déplacer.
    En effet, j'ai mis un " time.sleep(0.5)" dans ma fonction qui fait descendre les pièces et que j'appelle à chaque tour de la boucle infini de OpenGL, et je pense que c'est pour ça que quand j'appuis sur la touche "flèche de droite" la pièce ne bouge qu'après avoir descendu d'un cran alors que je voudrai qu'elle bouge immédiatement.

    Donc je me demandais s'il y avais une solution à ce problème, peut être une alternative au "time.sleep(0.5)" entre chaque avancées de ma pièce ?

    Bon en tout cas merci de vos réponses, et n'hésitez pas à me demander plus d'informations si vous ne me trouvez pas très clair !

  2. #2
    Expert éminent

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4 300
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 300
    Points : 6 780
    Points
    6 780
    Par défaut
    Salut,

    À la place de time.sleep() utilise plutôt un timer:

    https://docs.python.org/3/library/th...#timer-objects

    Si ton framework est PyQt, tu as aussi QTimer.singleShot() qui fait la même chose.

    http://pyqt.sourceforge.net/Docs/PyQt4/qtimer.html

  3. #3
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2015
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Aisne (Picardie)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2015
    Messages : 6
    Points : 4
    Points
    4
    Par défaut
    Bonjour !
    Merci pour ta réponse :

    Mais bon je n'ai pas réussi à résoudre mon problème avec ce que tu m'as conseillé,

    Petite question, en OpenGL, n'y a-t-il pas un moyen pour qu'OpenGL check à chaque passage dans sa boucle infinie s'il une touche a été pressée ?
    parce que je remarque que quand aucune touche n'est pressée il ne passe pas du tout dans ma fonction "keyboard".

    Merci encore !

  4. #4
    Expert éminent

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4 300
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 300
    Points : 6 780
    Points
    6 780
    Par défaut
    Si tu nous montrais un bout de code testable, on pourrait probablement te répondre.

    Déjà, sans savoir avec quel framework graphique tu travailles ...

  5. #5
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2015
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Aisne (Picardie)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2015
    Messages : 6
    Points : 4
    Points
    4
    Par défaut
    Ah oui pardon je vous donne ça tout de suite !

    Tu ne pourras pas tester rien qu'avec ce bout de code par contre, voulez-vous vraiment tout mon code ? ( non pas qu'il soit long mais bon )

    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
     
     
    def avance():   # ma fonction avance est pas très claire, elle l'est pour moi au moins, je cherche tout les objets qui sont en mouvement, je les met dans un buffer, et ensuite dans ma matrice je les change en "rien" 
        global M, H, L                                           # ensuite je les descend tous d'un indice. ( entre temps je regarde si je peux avancer, en effet si en dessous de ma pièce il y a une autre pièce je ne peux pas avancer)
        buffer=[]
        bloque=False
        for i in range(H):
            for j in range(L):
                if M[i][j][2]==1:
                    buffer.append([i,j])
        for couple in buffer:
            i,j=couple
            if M[i-1][j][2]==0 and (M[i-1][j][0]==1 or M[i-1][j][0]==-1):
                bloque=True
        if bloque:
            for couple in buffer:
                i,j=couple
                M[i][j]=[1,M[i][j][1],0,0,0]
        else:
            buffer=[]
            for i in range(H):
                for j in range(L):
                    if M[i][j][2]==1:
                        buffer.append([i-1,j,M[i][j][1],M[i][j][3],M[i][j][4]])
                        M[i][j]=[0,0,0,0,0]
            for quintuplet in buffer:
                i,j,couleur,fig,position=quintuplet
                M[i][j]=[1,couleur,1,fig,position]
        time.sleep(0.7)                                        ####### mon time.sleep() est ici !
        glutPostRedisplay()
     
    def init():
        global H, L
        glClearColor(1, 1, 1, 1.0)
        gluOrtho2D(0,L,0,H-3)
     
    def specialkeys( key, x, y):
     
        if key == GLUT_KEY_LEFT:
            translation(0) # translate la pièce vers la gauche
        if key == GLUT_KEY_RIGHT:
            translation(1)
        glutPostRedisplay()
     
    def display_plateau():
        global M, touche  
     
        glClear(GL_COLOR_BUFFER_BIT)
     
        spawn_figure()
     
        avance()
     
        colorie_matrice()
     
        glutSwapBuffers()
     
     
     
     
    def main():
        glutInit(sys.argv)
        glutInitDisplayMode(GLUT_RGB|GLUT_DOUBLE)
        glutInitWindowPosition(0,0)
        glutInitWindowSize(480,720)
        glutCreateWindow(b"TETRIS")
        init()
        glutDisplayFunc(display_plateau)
        glutSpecialFunc(specialkeys)
        glutMainLoop()
     
    main()

    Je travaille avec une Matrice pour la gestion de mes données du Tetris:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
     
    def init_matrice():
        global H, L, M
        M=[ [ [0,0,0,0,0] for i in range(L) ] for j in range(H) ] # 1- s'il y a un objet, 2- sa couleur, 3- s'il est en mouvement 4- le numéro de la figure à laquelle il appartient 5- sa position ( dans quel sens in est tourné, 1 à 4 possibilités )
        for i in range(L):
            M[0][i]=[-1,0,0,0,0]    # Je met des frontières en bas à gauche et à droite de mon Tetris que je colorie en noir.
        for j in range(H):
            M[j][0]=[-1,0,0,0,0]
            M[j][L-1]=[-1,0,0,0,0]
    Ah et vous me parlez de Framework mais je ne sais pas du tout ce que c'est, j'utilise le module OpenGL qui est initialement dans ma version de PYZO ( je ne sais pas si vous connaissez ), pourriez-vous me préciser ce qu'est un Framework ?

  6. #6
    Expert éminent

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4 300
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 300
    Points : 6 780
    Points
    6 780
    Par défaut
    Pas testable, mais bon.

    Si tu remplace time.sleep(0.7) par:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    from threading import Timer
     
        ...
        Timer(0.7, glutPostRedisplay).start()
    tes déplacements devraient se faire pendant la pause.

    Éventuellement, mets des print aux événements clavier pour t'assurer que le problème ne vient pas de là.

  7. #7
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2015
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Aisne (Picardie)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2015
    Messages : 6
    Points : 4
    Points
    4
    Par défaut
    J'ai fais le changement, la pièce bouge comme je veux quand j'appuie sur une touche mais elle n'avance plus automatiquement après .... c'est embêtant !

    Je vais essayer de cherche une alternative !

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

Discussions similaires

  1. Modélisation d'un petit problème logique avec Prolog
    Par blackmisery dans le forum Prolog
    Réponses: 36
    Dernier message: 01/10/2012, 18h03
  2. [VB NET] Petit probléme simpliste avec GDI+ !
    Par archimed111 dans le forum Windows Forms
    Réponses: 2
    Dernier message: 06/05/2006, 09h17
  3. Petit problème avec Line Input
    Par GrosQuicK dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 14/09/2005, 12h47
  4. (Petit ?) problème avec une page contenant du Flash
    Par ologram dans le forum Balisage (X)HTML et validation W3C
    Réponses: 2
    Dernier message: 01/09/2005, 18h45
  5. Petit problème avec SDL
    Par Nyarlathotep dans le forum C
    Réponses: 10
    Dernier message: 01/07/2005, 09h10

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