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