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 :

Obstacles avec pygame


Sujet :

Programmation multimédia/Jeux Python

  1. #1
    Invité
    Invité(e)
    Par défaut Obstacles avec pygame
    Bonsoir, je travaille actuellement sur un projet "mini-rpg" en utilisant pygame. J'ai cherché comment gérer les collisions et j'ai trouvé sur un forum cette méthode :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    monpersonnage = pygame.Rect(1, 1, 32, 32)
    monmur = pygame.Rect(50, 50, 32, 32)
    mondeuxiememur = pygame.Rect(100, 100, 32, 32)
     
    # On créé un liste contenant tous les carrés collisionants :
    mescollisions = [monmur, mondeuxiememur]
     
    if monpersonnage.collidelist(mescollisions) == -1:
        #Le personnage ne peut pas bouger ! Il est en collision !
    else:
        # Le personnage peut bouger, il n'est pas en collision
    J'ai donc appliqué cette méthode a mon programme :

    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
    #Importation des bibliothèques
    import pygame
    from pygame.locals import *
    from classes import *
     
     
    pygame.init()
    # Création de la fenêtre
    fenetre = pygame.display.set_mode((1600, 900), FULLSCREEN)
    fond1 = pygame.image.load("Map001.png").convert()
    fond2 = pygame.image.load("Map002.png").convert()
    fond = [fond1, fond2]
    #Rafraichissement de l'écran
    pygame.display.flip()
    pygame.key.set_repeat(1,20)
    perso = Perso()
    #Collisions
    collision1 = pygame.Rect(427,584,27,25)
    collision2 = pygame.Rect(586,531,26,52)
    collisions = [collision1, collision2]
    #Boucle infinie
    continuer,k,n = 1,0,0
    while continuer:
        #Limitation de la boucle
        pygame.time.Clock().tick(50)
        #Boucle du jeu
        for event in pygame.event.get():
            #Attente des événements
            if event.type == KEYDOWN:
                if event.key == K_ESCAPE:
                    pygame.quit()
                    continuer = 0
                #déplacement vers le bas
                if event.key == K_DOWN:
                    if perso.position.collidelist(collisions) == -1:
                        perso.position = perso.position.move(0,-1)
     
                    else:
                        perso.position = perso.position.move(0,5)
                        perso.imagePerso = perso.persoBas[n]
     
                #Déplacement vers le haut
                if event.key == K_UP:
                    if perso.position.collidelist(collisions) == -1:
                        perso.position = perso.position.move(0,1)
     
                    else:
                        perso.position = perso.position.move(0,-5)
                        perso.imagePerso = perso.persoHaut[n]
     
                #Déplacement vers la droite
                if event.key == K_RIGHT:
                    if perso.position.collidelist(collisions) == -1:
                        perso.position = perso.position.move(-1,0)
     
                    else:
                        perso.position = perso.position.move(5,0)
                        perso.imagePerso = perso.persoDroite[n]
     
                #Déplacement vers la gauche
                if event.key == K_LEFT:
                    if perso.position.collidelist(collisions) == -1:
                        perso.position = perso.position.move(1,0)
     
                    else:
                        perso.position = perso.position.move(-5,0)
                        perso.imagePerso = perso.persoGauche[n]
                if n>=2:
                    n=1
                else:
                    n=n+1
     
            #Re-collage
            fenetre.blit(fond[k], (0,0))
            fenetre.blit(perso.imagePerso, perso.position)
            #Rafraichissement
            pygame.display.flip()
    J'ai aussi un fichier classes :

    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
    import pygame
    from pygame.locals import *
     
    class Perso(pygame.sprite.Sprite):
     
        def __init__(self):
     
            self.persoHaut1 = pygame.image.load("persoHaut1.png").convert_alpha()
            self.persoBas1 = pygame.image.load("persoBas1.png").convert_alpha()
            self.persoGauche1 = pygame.image.load("persoGauche1.png").convert_alpha()
            self.persoDroite1 = pygame.image.load("persoDroite1.png").convert_alpha()
            self.persoHaut2 = pygame.image.load("persoHaut2.png").convert_alpha()
            self.persoBas2 = pygame.image.load("persoBas2.png").convert_alpha()
            self.persoGauche2 = pygame.image.load("persoGauche2.png").convert_alpha()
            self.persoDroite2 = pygame.image.load("persoDroite2.png").convert_alpha()
            self.persoHaut3 = pygame.image.load("persoHaut3.png").convert_alpha()
            self.persoBas3 = pygame.image.load("persoBas3.png").convert_alpha()
            self.persoGauche3 = pygame.image.load("persoGauche3.png").convert_alpha()
            self.persoDroite3 = pygame.image.load("persoDroite3.png").convert_alpha()
            self.persoHaut = [self.persoHaut1,self.persoHaut2,self.persoHaut3]
            self.persoBas = [self.persoBas1,self.persoBas2,self.persoBas3]
            self.persoGauche = [self.persoGauche1,self.persoGauche2,self.persoGauche3]
            self.persoDroite = [self.persoDroite1,self.persoDroite2,self.persoDroite3]
            self.imagePerso = self.persoHaut1
            self.position = pygame.Rect(400,700,30,31)
    Le soucis c'est qu'au lancement du programme, le personnage fait l'inverse de ce qu'il devrait faire, lorsqu'il n'y a pas d'obstacle il se déplace d'un pixel à l'opposé de la bonne direction, et lorsque j'arrive sur un obstacle, il traverse l'obstacle et s'arrete a la bordure de celui-ci.

    Merci pour votre aide

  2. #2
    Invité
    Invité(e)
    Par défaut
    J'ai effectué des recherches, et j'ai réussi a résoudre mon problème d'obstacle, le personnage se déplace correctement, et est bloqué au mur, le soucis c'est que maintenant le personnage arrive a traverser le mur si j'appuie sur deux touches en même temps, y aurait t'il un moyen d'empêcher la pression de deux touches ?

    Voici mon programme modifié :

    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
    #Importation des bibliothèques
    import pygame
    from pygame.locals import *
    from classes import *
     
     
    pygame.init()
    # Création de la fenêtre
    fenetre = pygame.display.set_mode((1600, 900), FULLSCREEN)
    fond1 = pygame.image.load("Map001.png").convert()
    fond2 = pygame.image.load("Map002.png").convert()
    fond = [fond1, fond2]
    #Rafraichissement de l'écran
    pygame.display.flip()
    pygame.key.set_repeat(1,10)
    perso = Perso()
    #Collisions
    collision1 = pygame.Rect(427,584,27,27)
    collision2 = pygame.Rect(586,531,27,53)
    collisions = [collision1, collision2]
    #Boucle infinie
    continuer,k,n = 1,0,0
    while continuer:
        #Limitation de la boucle
        pygame.time.Clock().tick(30)
        #Boucle du jeu
        for event in pygame.event.get():
            #Attente des événements
            if event.type == KEYDOWN:
                if event.key == K_ESCAPE:
                    pygame.quit()
                    continuer = 0
                #déplacement vers le bas
                if event.key == K_DOWN:
                    #On teste si il y a un obstacle avant de se déplacer
                    testPos = pygame.Rect(perso.position.x,perso.position.y+3,30,31)
                    if testPos.collidelist(collisions) != -1:
                        perso.position = perso.position.move(0,-1)
     
                    else:
                        perso.position = perso.position.move(0,1)
                        perso.imagePerso = perso.persoBas[n]
     
                #Déplacement vers le haut
                elif event.key == K_UP:
                    testPos = pygame.Rect(perso.position.x,perso.position.y-3,30,31)
                    if perso.position.collidelist(collisions) != -1:
                        perso.position = perso.position.move(0,1)
     
                    else:
                        perso.position = perso.position.move(0,-1)
                        perso.imagePerso = perso.persoHaut[n]
     
                #Déplacement vers la droite
                elif event.key == K_RIGHT:
                    testPos = pygame.Rect(perso.position.x+3,perso.position.y,30,31)
                    if perso.position.collidelist(collisions) != -1:
                        perso.position = perso.position.move(-1,0)
     
                    else:
                        perso.position = perso.position.move(1,0)
                        perso.imagePerso = perso.persoDroite[n]
     
                #Déplacement vers la gauche
                elif event.key == K_LEFT:
                    testPos = pygame.Rect(perso.position.x-3,perso.position.y,30,31)
                    if perso.position.collidelist(collisions) != -1:
                        perso.position = perso.position.move(1,0)
     
                    else:
                        perso.position = perso.position.move(-1,0)
                        perso.imagePerso = perso.persoGauche[n]
                if n>=2:
                    n=1
                else:
                    n=n+1
     
            #Re-collage
            fenetre.blit(fond[k], (0,0))
            fenetre.blit(perso.imagePerso, perso.position)
            #Rafraichissement
            pygame.display.flip()

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


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 860
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 860
    Points : 219 062
    Points
    219 062
    Billets dans le blog
    120
    Par défaut
    Bonjour,

    Pour les touches, j'ai toujours préféré utiliser
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    keysState = pygame.key.get_pressed()
    	if keysState[pygame.K_ESCAPE]:
    		sys.exit()
    Au lieu de la boucle événementielle. Par contre, pour empêcher deux touches, je ne sais pas trop comment bien faire, car il y aura toujours priorité d'une touche sur une autre.
    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.

Discussions similaires

  1. créer un .exe avec pygame
    Par stefff285 dans le forum Déploiement/Installation
    Réponses: 2
    Dernier message: 19/08/2010, 23h30
  2. Problème avec Pygame
    Par zappa37 dans le forum Programmation multimédia/Jeux
    Réponses: 2
    Dernier message: 28/05/2009, 00h03
  3. portabilité du code avec pygame
    Par stefff285 dans le forum Programmation multimédia/Jeux
    Réponses: 0
    Dernier message: 05/04/2009, 19h33
  4. Rafraichissement de l'image avec pygame + opengl
    Par bourriquet_42 dans le forum OpenGL
    Réponses: 1
    Dernier message: 23/03/2009, 18h22

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