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

3D Python Discussion :

Mise a jours d'écran avec pygame.


Sujet :

3D Python

  1. #1
    Membre expérimenté
    Avatar de Luke spywoker
    Homme Profil pro
    Etudiant informatique autodidacte
    Inscrit en
    Juin 2010
    Messages
    1 077
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Etudiant informatique autodidacte

    Informations forums :
    Inscription : Juin 2010
    Messages : 1 077
    Points : 1 742
    Points
    1 742
    Par défaut Mise a jours d'écran avec pygame.
    Salut les pythons,
    je me rend a vous après de multiples essaies de rafraîchir un écran de pygame contenant un triangle qui devrai disparaître afin que l'on puisse en dessiner un nouveau par la suite mais les méthodes:

    -pygame.display.update()
    pygame.display.update

    update portions of the screen for software displays
    pygame.display.update(rectangle=None): return None
    pygame.display.update(rectangle_list): return None

    This function is like an optimized version of pygame.display.flip - update the full display Surface to the screen for software displays. It allows only a portion of the screen to updated, instead of the entire area. If no argument is passed it updates the entire Surface area like pygame.display.flip - update the full display Surface to the screen.

    You can pass the function a single rectangle, or a sequence of rectangles. It is more efficient to pass many rectangles at once than to call update multiple times with single or a partial list of rectangles. If passing a sequence of rectangles it is safe to include None values in the list, which will be skipped.

    This call cannot be used on pygame.OPENGL displays and will generate an exception.
    -et même pygame.display.flip()
    pygame.display.flip

    update the full display Surface to the screen
    pygame.display.flip(): return None

    This will update the contents of the entire display. If your display mode is using the flags pygame.HWSURFACE and pygame.DOUBLEBUF, this will wait for a vertical retrace and swap the surfaces. If you are using a different type of display mode, it will simply update the entire contents of the surface.

    When using an pygame.OPENGL display mode this will perform a gl buffer swap.
    Qui sont censés rafraîchir partiellement ou entièrement l'écran ca ne fonctionne pas et je débute avec ce module, j'ai essayer avec un objet qui contient les coordonnées du triangle comme attributs en espérant que la méthode pygame.display.update() mettrai a jours le triangle au lieu de ca il en dessine un nouveau...
    Je ne sais plus comment faire pour pouvoir effacer un élément inséré avec la classe pygame.draw...

    Voici un code qui marche mais qui ne fait pas ce que j'attends de lui:
    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
     
    # -*- coding: utf-8 -*-
    import pygame
    from pygame.locals import *
    from sys import exit
    pygame.init()
    screen=pygame.display.set_mode((800,600),0,32)
    #flache=pygame.Surface((800, 600)) Essaie avec une surface 
    class Test() :
      def trieck(self,a=(150,150),b=(150,300),c=(300,150),i=0) :
        self.a_x=a[0]
        self.a_y=a[1]
        self.b_x=b[0]
        self.b_y=b[1]
        self.c_x=c[0]
        self.c_y=c[1]
        self.i=i+1
        return [(self.a_x,self.a_y),(self.b_x,self.b_y),(self.c_x,self.c_y)]
     
    test=Test()
    test.trieck()
    koords=[]
    while True :
      for event in pygame.event.get() :
        if event.type == QUIT :
          exit()
        if event.type == MOUSEBUTTONDOWN :
          x,y=pygame.mouse.get_pos()
          koords.append((x,y))
          test.i +=1
          if test.i == 4 : 
            koords_liste=test.trieck(koords[0],koords[1],koords[2],0)
            pygame.draw.polygon(screen,(255,0,0),[(test.a_x,test.a_y),(test.b_x,test.b_y),(test.c_x,test.c_y)]) # Essaie avec une surface # avec pygame.draw.polygon(flache,(255,0,0),[(test.a_x,test.a_y),(test.b_x,test.b_y),(test.c_x,test.c_y)])
            #pygame.Surface.blit(screen,flache,(0,0))   Essaie avec une surface 
            koords=[]
            pygame.display.flip() # cette methode ne rafraichis pas l'écran.
     
      pygame.display.update()
    Je suis désespéré de ne même pas avoir de plan B...
    Avez vous eu des difficultés a assimilé ce module car pour moi c'est difficile d'arriver à ce que je veux ?
    Merci pour vos réponses.
    Pour faire tes armes:
    Use du présent pour construire ton futur sinon use de ce que tu as appris auparavant.
    Et sois toujours bien armé avant de te lancer.
    Le hasard ne sourit qu'aux gens préparés...
    Site: Website programmation international (www.open-source-projects.net)
    Site: Website imagerie 3D (www.3dreaming-imaging.net)
    Testez aux moins pendant une semaine l'éditeur avec terminaux intégrées it-edit Vous l'adopterai sûrement !
    FUN is HARD WORK !!!

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

    Informations forums :
    Inscription : Avril 2004
    Messages : 1 046
    Points : 1 376
    Points
    1 376
    Par défaut
    chez moi ce code fait ce qu'on lui demande ...
    je clique à 3 endroits différents de la fenêtre et ça affiche un triangle ... et un nouveau à chaque fois puisque tu n'effaces pas l'ancien.


    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
    # -*- coding: utf-8 -*-
    import pygame
    from pygame.locals import *
    screen=pygame.display.set_mode((800,600),0,32)
     
    class Test() :
      def trieck(self,a=(150,150),b=(150,300),c=(300,150),i=0) :
        self.a_x=a[0]
        self.a_y=a[1]
        self.b_x=b[0]
        self.b_y=b[1]
        self.c_x=c[0]
        self.c_y=c[1]
        self.i=i+1
        return [(self.a_x,self.a_y),(self.b_x,self.b_y),(self.c_x,self.c_y)]
     
    test=Test()
    test.trieck()
    koords=[]
    while True :
      event = pygame.event.wait()
      if event.type == QUIT :
        break
      elif event.type == MOUSEBUTTONDOWN :
        koords.append(event.pos)
        test.i +=1
        if test.i == 4 :
          koords_liste=test.trieck(koords[0],koords[1],koords[2],0)
          screen.fill(0) # efface la fenetre
          pygame.draw.polygon(screen,(255,0,0),[(test.a_x,test.a_y),(test.b_x,test.b_y),(test.c_x,test.c_y)])
          koords=[]
          pygame.display.flip()
     
    pygame.quit()

  3. #3
    Expert confirmé Avatar de PauseKawa
    Homme Profil pro
    Technicien Help Desk, maintenance, réseau, système et +
    Inscrit en
    Juin 2006
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien Help Desk, maintenance, réseau, système et +
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 725
    Points : 4 005
    Points
    4 005
    Par défaut
    Et tout simplement (je n'utilise pas pygame) ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    p = None
    while True :
        ...
          if p:
              del(p)
          p = pygame.draw.polygon(screen,(255,0,0),[(test.a_x,test.a_y),(test.b_x,test.b_y),(test.c_x,test.c_y)])
    Merci d'utiliser le forum pour les questions techniques.

  4. #4
    Expert confirmé Avatar de PauseKawa
    Homme Profil pro
    Technicien Help Desk, maintenance, réseau, système et +
    Inscrit en
    Juin 2006
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien Help Desk, maintenance, réseau, système et +
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 725
    Points : 4 005
    Points
    4 005
    Par défaut
    Même pas besoin de la condition en fait
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    p = None
    while True :
        ...
          del(p)
          p = pygame.draw.polygon(screen,(255,0,0),[(test.a_x,test.a_y),(test.b_x,test.b_y),(test.c_x,test.c_y)])
    Je pense que pygame.draw.polygon doit retourner une instance donc avec del cela devrais supprimer l'objet : a tester.

    @+
    Merci d'utiliser le forum pour les questions techniques.

  5. #5
    Membre expérimenté
    Avatar de Luke spywoker
    Homme Profil pro
    Etudiant informatique autodidacte
    Inscrit en
    Juin 2010
    Messages
    1 077
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Etudiant informatique autodidacte

    Informations forums :
    Inscription : Juin 2010
    Messages : 1 077
    Points : 1 742
    Points
    1 742
    Par défaut
    Pardon j'ai répondu trop vite et d'ailleurs je ne pensais pas que mon message était poster (je l'ai supprimer c'était une erreur). Et en attendant PauseKawa a poster j'ai essayer de supprimer l'instance avec exactement le même code avant de poster ça ne marchait pas les triangles s'accumulaient et j'ai réessayer c'est pareil.
    Mais je me pose la question, ce code remplis de noir l'écran mais je ne pense pas que ça efface l'ancien triangle, proprement dit mais le couvre de noir, ce qui donnerai une occupation certaine de l'espace (de nom et de l'écran)...
    Je débute avec pygame et pour cette raison que ce n'est pas grave mais je ne pense pas que ce soit une solution pour créer un vrai jeu mais pour mes expérimentations c'est suffisant ou me tromperai je sur le coté technique ?
    Il est un peu.. disont pervers ce module dont il faut connaître la méchanique sinon un simple code de quelque ligne ne fonctionne pas pour une raison X, ce qui m'est arriver, bref je galère un peu avec mes expérimentations et pas de moyens dans la classer pygame.draw pour effacer c'est un peu bizarre.
    Merci pour la solution a mon problème et n'hésitez pas a me corrigé si je me trompe sur le coté technique.
    Pour faire tes armes:
    Use du présent pour construire ton futur sinon use de ce que tu as appris auparavant.
    Et sois toujours bien armé avant de te lancer.
    Le hasard ne sourit qu'aux gens préparés...
    Site: Website programmation international (www.open-source-projects.net)
    Site: Website imagerie 3D (www.3dreaming-imaging.net)
    Testez aux moins pendant une semaine l'éditeur avec terminaux intégrées it-edit Vous l'adopterai sûrement !
    FUN is HARD WORK !!!

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

    Informations forums :
    Inscription : Avril 2004
    Messages : 1 046
    Points : 1 376
    Points
    1 376
    Par défaut
    complètement ...

    il n'y a pas d'instance de triangle; draw. dessine des trucs et retourne un rectangle Rect(), et c'est tout. Et ce rectangle n'a d'existence que si tu l'affectes à une variable, sinon c'est perdu.

    Il n'y a aucun lien entre un Rect() et une Surface().

    fill(0) ne "recouvre" pas, mais remplit l'écran de noir, il n'y a pas d'accumulation.

  7. #7
    Membre expérimenté
    Avatar de Luke spywoker
    Homme Profil pro
    Etudiant informatique autodidacte
    Inscrit en
    Juin 2010
    Messages
    1 077
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Etudiant informatique autodidacte

    Informations forums :
    Inscription : Juin 2010
    Messages : 1 077
    Points : 1 742
    Points
    1 742
    Par défaut
    Merci pour ces précisions et j'ai remarquer que tu ne donnai pas de tuple RGB mais un zéro en argument a la méthode pygame.Surface.fill(), syntaxe dont il n'est pas question dans la doc.
    Est-ce un raccourcis pour (0,0,0) ?
    Mais le code de Pausekawa ne fonctionne pas: on ne peut effacer l'instance d'un pygame.draw avec la primitive del(), en tout cas dans ce cas, ça ne marche pas.
    Le problème est résolu et je me suis bien trompé mais l'on apprend de ses erreurs...
    Merci pour vos réponse.
    PS: Pygame n'est pas facile apprendre en mains au début, je n'arrive toujours pas a combiner deux touches (Non modifier) pour un event mais je n'ose imaginer l'époque ou il fallait écrire le code pour les drivers graphique et des périphériques d'entré...
    Pour faire tes armes:
    Use du présent pour construire ton futur sinon use de ce que tu as appris auparavant.
    Et sois toujours bien armé avant de te lancer.
    Le hasard ne sourit qu'aux gens préparés...
    Site: Website programmation international (www.open-source-projects.net)
    Site: Website imagerie 3D (www.3dreaming-imaging.net)
    Testez aux moins pendant une semaine l'éditeur avec terminaux intégrées it-edit Vous l'adopterai sûrement !
    FUN is HARD WORK !!!

  8. #8
    Expert confirmé Avatar de PauseKawa
    Homme Profil pro
    Technicien Help Desk, maintenance, réseau, système et +
    Inscrit en
    Juin 2006
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien Help Desk, maintenance, réseau, système et +
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 725
    Points : 4 005
    Points
    4 005
    Par défaut
    Citation Envoyé par Luke spywoker Voir le message
    Mais le code de Pausekawa ne fonctionne pas: on ne peut effacer l'instance d'un pygame.draw avec la primitive del(), en tout cas dans ce cas, ça ne marche pas.
    J'en suis étonné.
    Je jetterais un œil à pygame un de ses jours.

    @+
    Merci d'utiliser le forum pour les questions techniques.

  9. #9
    Expert confirmé Avatar de PauseKawa
    Homme Profil pro
    Technicien Help Desk, maintenance, réseau, système et +
    Inscrit en
    Juin 2006
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien Help Desk, maintenance, réseau, système et +
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 725
    Points : 4 005
    Points
    4 005
    Par défaut
    Bonsoir Luke spywoker,

    Je viens d'installer pygame et del fonctionne avec un rectangle Rect.
    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
    # -*- coding: utf-8 -*-
    import pygame
    from pygame.locals import *
     
     
    screen = pygame.display.set_mode((800, 600), 0, 32)
     
    class Test() :
        def trieck(self, a=(150, 150), b=(150, 300), c=(300, 150), i=0) :
            self.a_x = a[0]
            self.a_y = a[1]
            self.b_x = b[0]
            self.b_y = b[1]
            self.c_x = c[0]
            self.c_y = c[1]
            self.i = i + 1
            return [(self.a_x,self.a_y), (self.b_x,self.b_y), (self.c_x,self.c_y)]
     
    test = Test()
    test.trieck()
    koords = []
    p = None
     
    while True :
        event = pygame.event.wait()
        if event.type == QUIT:
            break
        elif event.type == MOUSEBUTTONDOWN:
            koords.append(event.pos)
            test.i +=1
            if test.i == 4:
                koords_liste = test.trieck(koords[0], koords[1], koords[2], 0)
                screen.fill(0) # efface la fenetre
                del(p)
                p = pygame.draw.polygon(screen,(255,0,0), [(test.a_x,test.a_y),
                                                           (test.b_x,test.b_y),
                                                           (test.c_x,test.c_y)])
                koords = []
                pygame.display.flip()
     
    pygame.quit()
    @+
    Merci d'utiliser le forum pour les questions techniques.

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

    Informations forums :
    Inscription : Avril 2004
    Messages : 1 046
    Points : 1 376
    Points
    1 376
    Par défaut
    del() supprime la variable, mais nl'efface pas sa correspondance de l'écran.
    par contre tu peux mettre en place un système de "calques" en ajoutant dans une liste une nouvelle surface vierge sur laquelle dessiner.

    fill() accept des tuples, des listes, des int (ex: fill(-1) pour remplir avec du blanc) et des Color() ...

  11. #11
    Expert confirmé Avatar de PauseKawa
    Homme Profil pro
    Technicien Help Desk, maintenance, réseau, système et +
    Inscrit en
    Juin 2006
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien Help Desk, maintenance, réseau, système et +
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 725
    Points : 4 005
    Points
    4 005
    Par défaut
    Citation Envoyé par josmiley Voir le message
    del() supprime la variable, mais nl'efface pas sa correspondance de l'écran.
    C'est pourtant bien ce qui se produit chez moi. Plateforme dépendant ?
    Merci d'utiliser le forum pour les questions techniques.

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

    Informations forums :
    Inscription : Avril 2004
    Messages : 1 046
    Points : 1 376
    Points
    1 376
    Par défaut
    Citation Envoyé par PauseKawa Voir le message
    C'est pourtant bien ce qui se produit chez moi. Plateforme dépendant ?
    c'est le screen.fill(0) à la ligne 33 qui t'efface l'écran ...

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

Discussions similaires

  1. Mise a jour des imports avec Talend
    Par skouza dans le forum Installation, migration et administration
    Réponses: 3
    Dernier message: 20/04/2011, 09h35
  2. mise a jours 1 table avec 2 table
    Par Commandeur dans le forum Langage SQL
    Réponses: 5
    Dernier message: 18/12/2009, 13h55
  3. Réponses: 3
    Dernier message: 11/04/2009, 04h27
  4. Réponses: 1
    Dernier message: 07/04/2009, 03h12
  5. mise a jour des colones avec smo
    Par casimir24 dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 12/12/2005, 15h13

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