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

Bibliothèques tierces Python Discussion :

[Pygame] Problème pour animer et recevoir des événements en même temps [Python 3.X]


Sujet :

Bibliothèques tierces Python

  1. #1
    Candidat au Club Avatar de Fokushy
    Homme Profil pro
    J'apprends le développement
    Inscrit en
    Août 2018
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : J'apprends le développement

    Informations forums :
    Inscription : Août 2018
    Messages : 2
    Par défaut [Pygame] Problème pour animer et recevoir des événements en même temps
    Bonjour,

    Voici ce que j'aimerais faire ;
    J'ai fini le TP du jeu Donkey Kong, du chapitre Pygame, et je voudrais l'améliorer, par exemple en y rajoutant des animations faites à partir de boucles whiles, de time.sleep() et de sprites.

    Nom : Deepin Capture-écran_zone de sélection _20180810192814.png
Affichages : 698
Taille : 302,8 Ko

    Voyez par exemple cet écran d'accueil, je voudrais faire une animation des flèches pour la sélection du niveau, qui s'écartent et se rapprochent toutes les 0,5 secondes.

    Mais je voudrais que Pygame continue à recevoir les événements (donc celui où la touche "Entrée" est appuyée), pendant qu'il fasse l'animation des flèches, que je fais donc grâce à des boucles while. Des idées ? Merci d'avance ! (Une fois terminé je mettrais le projet sur Github pour ceux qui veulent jouer ou regarder le code)

    Pour mieux comprendre ce que je recherche à faire, vous pouvez aussi imaginer un timer, qui s'incrémente en même temps qu'on joue.

    La boucle du menu :

    (J'ai un peu tout commenté pour mieux comprendre )

    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
    import pygame
    import constants
    import classes
    from pygame import *
    from constants import *
     
    pygame.init()
     
    pygame.display.set_icon(icon) #D'ailleurs l'icône ne veut pas s'afficher et je ne comprends absolument pas pourquoi
    pygame.display.set_caption("DK's Maze !")
     
    window = pygame.display.set_mode(size)
    Game = classes.Game(window)
     
    Game.home() #Affichage du menu
     
    pygame.key.set_repeat(400, 30) #On permet la répétition de touches, si on reste appuyé dessus
    run = 1
    ingame = 0
    level = 1
    while run:
        while ingame == 0:
            pygame.time.Clock().tick(30) #On évite de surchauffer le processeur
            Game.select(level)
            for event in pygame.event.get():
                if event.type == QUIT:
                    run = 0
                if event.type == KEYDOWN:
                    if event.key == K_RETURN: #Si l'on séléctionne un niveau, on fait une instance de Donkey et on initialise le niveau
                        Donkey = classes.Donkey(window, level)
                        Game.initlevel(level)
                        pos_donkey = [0, 0]
                        home = 0
                        ingame = 1
                        Game.level()
                    if event.key == K_DOWN or event.key == K_UP: #On bouge les flèches si l'on appuie sur la touche Bas ou Haut
                        if level == 1:
                            level = 2
                        else:
                            level = 1
                    if event.key == K_ESCAPE:
                        exit()
    La classe Game :

    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
    import pygame
    import constants
    from pygame import *
    from constants import *
    from time import sleep
     
    pygame.init()
     
     
    class Game:
        def __init__(self, window):
            self.lines = []
            self.window = window
     
        def home(self):
        #Affiche le menu
            self.window.blit(home, (0, 0))
            pygame.display.flip()
     
        def select(self, level):
        #On déplace les flèches en fonction de la touche appuyée (Haut / Bas)
            if level == 1:
                self.home()
                self.window.blit(select1, (0, 0)) #select1 = Flèches écartées sur le choix du niveau 1
                sleep(0.5)
                self.window.blit(select1b, (0, 0)) #select1b = Flèches rapprochées sur le choix du niveau 1
            if level == 2:
                self.home()
                self.window.blit(select2, (0, 0)) #select2 = Flèches écartées sur le choix du niveau 2
                sleep(0.5)
                self.window.blit(select2b, (0, 0)) #select2b = Flèches rapprochées sur le choix du niveau 2
            pygame.display.flip()
     
        def initlevel(self, level):
        #On lit les lignes du fichier de niveau en fonction du niveau choisi, pour les réutiliser après
            name = "levels/lev" + str(level)
            with open(name, "r") as file:
                self.lines = file.readlines()
            file.close()
            self.dkstart = True
            return self.lines
     
        def level(self):
        #On affiche le niveau grâce aux lignes du fichier de niveau
            self.window.blit(background, (0, 0))
            y = 0
            for line in self.lines:
                x = 0
                for chara in line:
                    if chara == "d":
                        self.window.blit(start, (x, y))
                    if chara == "w":
                        self.window.blit(brick, (x, y))
                    if chara == "a":
                        self.window.blit(end, (x, y))
                    x += 30
                y += 30
            if self.dkstart == True:
            #Permet d'initialiser Donkey Kong sur la case de départ seulement au début
                self.window.blit(dkdown, (0, 0))
            self.dkstart = False
            pygame.display.flip()

  2. #2
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 782
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 782
    Par défaut
    Salut,


    Citation Envoyé par Fokushy Voir le message
    Mais je voudrais que Pygame continue à recevoir les événements (donc celui où la touche "Entrée" est appuyée), pendant qu'il fasse l'animation des flèches, que je fais donc grâce à des boucles while. Des idées ?
    Le plus simple est de demander à pygame d'expédier un évènement particulier toutes les 0.5s qui pourra être détecté parmi les autres et qui commande l'animation des flèches. Çà se fait avec pygame.time.set_timer. Et vous pouvez chercher sur Internet des exemples d'utilisation pour voir comment çà fonctionne.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  3. #3
    Candidat au Club Avatar de Fokushy
    Homme Profil pro
    J'apprends le développement
    Inscrit en
    Août 2018
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : J'apprends le développement

    Informations forums :
    Inscription : Août 2018
    Messages : 2
    Par défaut
    Citation Envoyé par wiztricks Voir le message
    Salut,




    Le plus simple est de demander à pygame d'expédier un évènement particulier toutes les 0.5s qui pourra être détecté parmi les autres et qui commande l'animation des flèches. Çà se fait avec pygame.time.set_timer. Et vous pouvez chercher sur Internet des exemples d'utilisation pour voir comment çà fonctionne.

    - W
    Merci ! Ca marche niquel Malgré qu'on peut voir une perte de fluidité, ce n'est pas trop dérangeant.

    Pour les curieux, voici comment je l'ai intégré (regardez les commentaires dans le code) ;

    La boucle qui gère le menu :

    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
    pygame.key.set_repeat(400, 30)
    run = 1
    ingame = 0
    level = 1
    MOVESELECT = USEREVENT + 1 #Ici j'initialise l'événement qui va faire bouger les flèches de choix de niveau
    pygame.time.set_timer(MOVESELECT, 250) #Puis ici le timer, qui va faire déclencher l'événement toutes les 250 millisecondes
    Game.select(1)
    while run:
        while ingame == 0:
            pygame.time.Clock().tick(30)
            for event in pygame.event.get():
                if event.type == QUIT:
                    run = 0
                if event.type == MOVESELECT:
                    Game.select(level)
                if event.type == KEYDOWN:
                    if event.key == K_RETURN:
                        Donkey = classes.Donkey(window, level)
                        Game.initlevel(level)
                        pos_donkey = [0, 0]
                        home = 0
                        ingame = 1
                        Game.level()
                        pygame.time.set_timer(MOVESELECT, 0) #Si on rentre en jeu, on arrête le timer en mettant les millisecondes à 0
                    if event.key == K_DOWN or event.key == K_UP:
                        if level == 1:
                            level = 2
                        else:
                            level = 1
                    if event.key == K_ESCAPE:
                        exit()
    La classe Game :

    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
    class Game:
        def __init__(self, window):
            self.lines = []
            self.window = window
            self.selectpos = 0
     
        def home(self):
            self.window.blit(home, (0, 0))
            pygame.display.flip()
     
        def select(self, level): #C'est ici qu'il faut regarder, on interchange entre les flèches rapprochées et écartées grâce à cette fonction
            if self.selectpos == 0: #Si les flèches sont rapprochées
                self.selectpos = 1 #On les écarte
                if level == 1: #Ici on détermine sur quel choix de niveau placer les flèches rapprochées
                    self.home()
                    self.window.blit(select1, (0, 0))
                if level == 2:
                    self.home()
                    self.window.blit(select2, (0, 0))
            else: #Si les flèches sont écartées
                self.selectpos = 0 #On les rapproche
                if level == 1: #Et ici on détermine sur quel choix de niveau placer les flèches écartées
                    self.home()
                    self.window.blit(select1b, (0, 0))
                if level == 2:
                    self.home()
                    self.window.blit(select2b, (0, 0))
            pygame.display.flip()
     
        def initlevel(self, level):
            name = "levels/lev" + str(level)
            with open(name, "r") as file:
                self.lines = file.readlines()
            file.close()
            self.dkstart = True
            return self.lines
     
        def level(self):
            self.window.blit(background, (0, 0))
            y = 0
            for line in self.lines:
                x = 0
                for chara in line:
                    if chara == "d":
                        self.window.blit(start, (x, y))
                    if chara == "w":
                        self.window.blit(brick, (x, y))
                    if chara == "a":
                        self.window.blit(end, (x, y))
                    x += 30
                y += 30
            if self.dkstart == True:
                self.window.blit(dkdown, (0, 0))
            self.dkstart = False
            pygame.display.flip()

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

Discussions similaires

  1. Problème pour changer le format des données
    Par Lize50 dans le forum SAS Base
    Réponses: 10
    Dernier message: 20/05/2008, 14h51
  2. Réponses: 0
    Dernier message: 03/10/2007, 13h11
  3. Problème pour animer un sprite
    Par Soward dans le forum SDL
    Réponses: 17
    Dernier message: 02/08/2007, 16h30
  4. [8.5]Problème pour calculer le nombre des personnes d'une liste
    Par Gotch59 dans le forum SAP Crystal Reports
    Réponses: 9
    Dernier message: 21/06/2007, 09h47
  5. problème pour fixer la taille des div dans template
    Par damien40 dans le forum Mise en page CSS
    Réponses: 2
    Dernier message: 24/05/2007, 11h05

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