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/opengl - problème de set_mode


Sujet :

Programmation multimédia/Jeux Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2011
    Messages
    136
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Avril 2011
    Messages : 136
    Par défaut Pygame/opengl - problème de set_mode
    Bonjour à tous,
    J'ai mis en pratique mon apprentissage Python en réalisant un petit projet :
    un labyrinthe 3D dans lequel on peut se promener et rencontrer d'autres joueurs connectés.
    J'utilise OpenGl pour le rendu 3D de mon labyrinthe.
    Au cours du jeu , sur l'action de Esc, on arrive sur un menu avec différentes options puis on revient sur le labyrinthe.
    Voici mon problème : je suis obligé de faire un pygame.display.quit() et de réinitaliser par pygame.display.set_mode avant de réafficher le labyrinthe ou le menu d'options (sinon le programme se plante).
    Le résultat est la disparition de la fenêtre et réaffichage d'une nouvelle fenêtre, ce qui est un peu désagréable.
    Avez-vous une solution pour éviter ce switch ?
    Je pense que cela vient du paramètrage de pygame.display.set_mode...
    Je sais que je ne suis pas très clair alors j'ai créé un petit exemple montrant mon problème : mon écran d'options est représenté par un carré rouge et mon labyrinthe, par une surface 3D.
    En appuyant sur le 'c', cela permet de switcher d'un écran à l'autre.
    Voici mon code exemple :
    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
    import pygame
    from pygame.locals import *
    from OpenGL.GLU import *
    from OpenGL.GL import *
     
    class testMode():     
        def __init__(self):
            self.windowWidth=800
            self.windowHeight=600
            self.modeOpenGpl = False
            pygame.init()
            self.withoutOpenGpl()
     
        def withOpenGpl(self):
            pygame.display.quit()
     
            pygame.display.set_mode((self.windowWidth,self.windowHeight), DOUBLEBUF|OPENGL|OPENGLBLIT)
            glMatrixMode(GL_PROJECTION); glLoadIdentity()
            gluPerspective(45, (self.windowWidth/self.windowHeight), 0.1, 200.0)        
            glMatrixMode(GL_MODELVIEW);  glLoadIdentity()
            glScalef(0.01,0.01,0.01)
            gluLookAt(0,0,0, 0,0,-1, 0,1,0)
            glBegin(GL_QUADS)        
            glTexCoord2f(0.0, 0.0); glVertex3f(0.0, -50.0, -1000.0)
            glTexCoord2f(1.0, 0.0); glVertex3f(0.0, -50.0, 100.0)
            glTexCoord2f(1.0, 1.0); glVertex3f(100.0, -50.0, 1000.0)
            glTexCoord2f(0.0, 1.0); glVertex3f(100.0, -50.0, -1000.0)
            glEnd()
            pygame.display.flip()
     
        def withoutOpenGpl(self):
            pygame.display.quit()
     
            self.windowInit = pygame.display.set_mode((self.windowWidth,self.windowHeight))
            carre = pygame.Surface((100,100))
            carre.fill((255,0,0))
            self.windowInit.blit(carre,(10,10))
            pygame.display.flip()
     
    tMode = testMode()
    while True:
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                pygame.quit(); import sys; sys.exit()
            elif event.type == pygame.KEYDOWN:
                if event.key == pygame.K_ESCAPE:                        
                    pygame.quit(); import sys; sys.exit()                
                elif event.key == pygame.K_c:
                    tMode.modeOpenGpl = not tMode.modeOpenGpl
                    if tMode.modeOpenGpl: tMode.withOpenGpl()
                    else: tMode.withoutOpenGpl()
     
        key = pygame.key.get_pressed()
     
    pygame.quit()
    Toute aide sera la bienvenue !
    Merci d'avance.

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


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    27 128
    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 128
    Billets dans le blog
    149
    Par défaut
    Bonjour,

    Normalement, vous n'avez pas besoin de faire ce pygame.display.quit() puis de redéfinir une fenêtre. Vous parlez d'un crash, je serai tenté d'investiguer dans ce sens (car je ne comprends pas la raison). Ou alors, c'est à cause du mélange OpenGL / pygame ? Mais je doute.
    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é
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2011
    Messages
    136
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Avril 2011
    Messages : 136
    Par défaut
    Merci pour ta réponse LittleWhite.

    Oui, c'est ce que la logique veut et c'est ce que j'ai fait au départ mais il semblerait que le mode DOUBLEBUF|OPENGL|OPENGLBLIT (relatif à OpenGl) soit incompatible avec mes lignes de code relatives aux surfaces (et autres objets j'ai créé pour les besoins de mon jeu tels que des listbox, boutons, curseurs, inputbox, textbox,...). C'est la raison pour laquelle j'ai fait un switch de modes.

    Lancez le script et vous pourrez constater le problème en enlevant le pygame.display.quit

    Je suis persuadé qu'il y a une solution simple et élégante mais je ne vois pas...

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


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    27 128
    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 128
    Billets dans le blog
    149
    Par défaut
    Chez moi, ce test passe plutôt bien :
    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
    import pygame
    from pygame.locals import *
    from OpenGL.GLU import *
    from OpenGL.GL import *
     
    class testMode():
        def __init__(self):
            self.windowWidth=800
            self.windowHeight=600
            self.modeOpenGpl = False
            pygame.init()
            self.windowInit = pygame.display.set_mode((self.windowWidth,self.windowHeight))
            self.withoutOpenGpl()
     
        def withOpenGpl(self):
            #pygame.display.quit()
     
            #pygame.display.set_mode((self.windowWidth,self.windowHeight), DOUBLEBUF|OPENGL|OPENGLBLIT)
            print("Pass1")
            self.windowInit.fill((0,128,32))
            glMatrixMode(GL_PROJECTION); glLoadIdentity()
            gluPerspective(45, (self.windowWidth/self.windowHeight), 0.1, 200.0)
            glMatrixMode(GL_MODELVIEW);  glLoadIdentity()
            glScalef(0.01,0.01,0.01)
            gluLookAt(0,0,0, 0,0,-1, 0,1,0)
            glBegin(GL_QUADS)
            glTexCoord2f(0.0, 0.0); glVertex3f(0.0, -50.0, -1000.0)
            glTexCoord2f(1.0, 0.0); glVertex3f(0.0, -50.0, 100.0)
            glTexCoord2f(1.0, 1.0); glVertex3f(100.0, -50.0, 1000.0)
            glTexCoord2f(0.0, 1.0); glVertex3f(100.0, -50.0, -1000.0)
            glEnd()
            pygame.display.flip()
     
        def withoutOpenGpl(self):
            print("Pass2")
            self.windowInit.fill((255,128,32))
            #pygame.display.quit()
     
            #self.windowInit = pygame.display.set_mode((self.windowWidth,self.windowHeight))
            carre = pygame.Surface((100,100))
            carre.fill((255,0,0))
            self.windowInit.blit(carre,(10,10))
            pygame.display.flip()
     
    tMode = testMode()
    while True:
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                pygame.quit(); import sys; sys.exit()
            elif event.type == pygame.KEYDOWN:
                if event.key == pygame.K_ESCAPE:
                    pygame.quit(); import sys; sys.exit()
                elif event.key == pygame.K_c:
                    tMode.modeOpenGpl = not tMode.modeOpenGpl
                    if tMode.modeOpenGpl: tMode.withOpenGpl()
                    else: tMode.withoutOpenGpl()
     
        key = pygame.key.get_pressed()
     
    pygame.quit()
    Juste le rendu OpenGL ne se fait pas.
    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.

  5. #5
    Membre confirmé
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2011
    Messages
    136
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Avril 2011
    Messages : 136
    Par défaut
    Là est le problème...je n'arrive pas à avoir les 2 types de rendu dans le même programme. J'ai cherché sur le web et je ne suis pas le seul chercher une solution...

  6. #6
    Membre très actif

    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
    Billets dans le blog
    1
    Par défaut
    Salut.

    J'ai trouvé ça (pypi) qui pourrait peut-être répondre à ton besoin, j'ai pas trop regardé en détail comment il s'y est prit pour rendre compatible les 2 rendus dans une même fenêtre, mais ça fonctionne même si ce script est assez vieux, (voir la demo du fichier pyg_lam.py dans le répertoire demos, avec 2 ou 3 modifs à faire si python3).

Discussions similaires

  1. Réponses: 10
    Dernier message: 08/06/2009, 11h30
  2. [OpenGL] problème de rotation 3D
    Par ReiVon dans le forum OpenGL
    Réponses: 3
    Dernier message: 11/04/2005, 09h47
  3. Réponses: 2
    Dernier message: 29/03/2005, 14h25
  4. [OpenGL] Problème d'éclairage
    Par Dev48 dans le forum OpenGL
    Réponses: 4
    Dernier message: 24/02/2005, 09h32
  5. [OpenGL] Problème de Vitesse d'éxécution
    Par stick059 dans le forum OpenGL
    Réponses: 9
    Dernier message: 19/11/2004, 13h57

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