Bonjours à vous,
Je suis un développeur relativement débutant, et j'ai commencé un petit jeu 2D vue du dessus, cependant je suis tombé sur un bug que je ne comprend pas.
Dans le jeu, on est un smiley qui se déplace de case en case, et il y a des flèches qui se déplace dans leur direction toutes les 0,1 seconde, le bug étant que les flèches qui vont vers le bas et celles qui vont vers la droite se déplacent instantanément alors que les autres n'ont aucun problème.
Mon Threat et mon timer :
Ma première fonction qui gère les flèches :
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 Verrou = RLock() class Timer_Fleche(Thread): #S'effectue en parallèle def __init__(self, Delais): Thread.__init__(self) self.Delais = Delais def run(self): #Fonction qui se répète chaque "Delais" seconde Start = time.time() while (1): if (time.time() - Start >= self.Delais): with Verrou: #Attendre que chaque dépacement s'effectue avant de continuer Fleche_Mouvement() Start = time.time() #Mouvements : #Appel des threats : # Création des threads Fleches = Timer_Fleche(0.1) # Les fleches bougent toutes les 0.1 secondes # Lancement des threads Fleches.start()
Ma seconde fonction :
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 def Fleche_Mouvement(): #Fonction pour bouger la totalité des fleches for i in range(625): if Fleche_Carre_Haut_Liste[i] != 0: #Fleche Carree Haut Fleche_Mouvement_2(i, 'FLECHE_CARRE_HAUT', Fleche_Carre_Haut_Liste, -25, 0, -20) elif Fleche_Carre_Bas_Liste[i] != 0: #Fleche Carree Bas Fleche_Mouvement_2(i, 'FLECHE_CARRE_BAS', Fleche_Carre_Bas_Liste, 25, 0, 20) # ---XBUGX--- elif Fleche_Carre_Gauche_Liste[i] != 0: #Fleche Carree Gauche Fleche_Mouvement_2(i, 'FLECHE_CARRE_GAUCHE', Fleche_Carre_Gauche_Liste, -1, -20, 0) elif Fleche_Carre_Droite_Liste[i] != 0: #Fleche Carree Droite Fleche_Mouvement_2(i, 'FLECHE_CARRE_DROITE', Fleche_Carre_Droite_Liste, 1, 20, 0) # ---XBUGX--- elif Fleche_Rond_Haut_Liste[i] != 0: #Fleche Ronde Haut Fleche_Mouvement_2(i, 'FLECHE_ROND_HAUT', Fleche_Rond_Haut_Liste, -25, 0, -20) elif Fleche_Rond_Bas_Liste[i] != 0: #Fleche Ronde Bas Fleche_Mouvement_2(i, 'FLECHE_ROND_BAS', Fleche_Rond_Bas_Liste, 25, 0, 20) # ---XBUGX--- elif Fleche_Rond_Gauche_Liste[i] != 0: #Fleche Ronde Gauche Fleche_Mouvement_2(i, 'FLECHE_ROND_GAUCHE', Fleche_Rond_Gauche_Liste, -1, -20, 0) elif Fleche_Rond_Droite_Liste[i] != 0: #Fleche Ronde Droite Fleche_Mouvement_2(i, 'FLECHE_ROND_DROITE', Fleche_Rond_Droite_Liste, 1, 20, 0) # ---XBUGX---
Quand je crée mes flèches :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 def Fleche_Mouvement_2(i, Objet, Objet_Liste, Direction, Mouvement_x, Mouvement_y): #Fonction pour bouger une fleche Position_Objet = DESSIN.coords(Objet_Liste[i]) Case = Verification_Case(Position_Objet[0], Position_Objet[1]) if Blocks_Liste[Case + Direction] == 'VOID': Blocks_Liste[Case] = "VOID" DESSIN.move(Objet_Liste[i], Mouvement_x, Mouvement_y) Position_Objet = DESSIN.coords(Objet_Liste[i]) Case = Verification_Case(Position_Objet[0], Position_Objet[1]) Blocks_Liste[Case] = Objet Objet_Liste[i + Direction] = Objet_Liste[i] #Replace l'objet au bon endroit dans sa liste Objet_Liste[i] = 0 #L'enlève d'où il était avant
J'utilise plusieurs listes (par type) pour stocker mes objets (forme : "0,0,0,0,56,0,42,0...", et une liste générale (Forme : "MUR,MUR,MUR,VOID,FLECHE_CARRE_HAUT,MUR...), qui vont chacune de la gauche vers la droite, et du haut vers le bas, mon jeu fait 25*25 cases (exemple, si une flèche est à la 28ème valeur, il sera à la position (3, 2), chaque case fait 20 pixels.
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 #Import du niveau: Blocks_Liste = ["VOID"] * 625 Fleche_Rond_Haut_Liste = [0] * 625 Fleche_Rond_Bas_Liste = [0] * 625 Fleche_Rond_Gauche_Liste = [0] * 625 Fleche_Rond_Droite_Liste = [0] * 625 Fleche_Carre_Haut_Liste = [0] * 625 Fleche_Carre_Bas_Liste = [0] * 625 Fleche_Carre_Gauche_Liste = [0] * 625 Fleche_Carre_Droite_Liste = [0] * 625 Boite_Liste = [0] * 625 Toile_Liste = [0] * 625 Fichier = open("niveau_test.txt","r") for i in range(25): OBJET = Fichier.readline() for l in range (25): if OBJET[l].count('S') == 1: #S = JOUEUR Smiley = DESSIN.create_image(l * 20 + 10, i * 20 + 10, image = Image_Smiley) Blocks_Liste[i*25 + l] = "SMILEY" DESSIN.tag_lower(Smiley) if OBJET[l].count('X') == 1: #X = MUR Mur = DESSIN.create_image(l * 20 + 10, i * 20 + 10, image = Image_Mur) Blocks_Liste[i*25 + l] = "MUR" if OBJET[l].count('O') == 1: #O = FLECHE ROND HAUT Fleche_Rond_Haut = DESSIN.create_image(l * 20 + 10, i * 20 + 10, image = Image_Fleche_Rond_Haut) Fleche_Rond_Haut_Liste[i*25 + l] = Fleche_Rond_Haut Blocks_Liste[i*25 + l] = "FLECHE_ROND_HAUT" DESSIN.tag_lower(Fleche_Rond_Haut) if OBJET[l].count('L') == 1: #L = FLECHE ROND BAS Fleche_Rond_Bas = DESSIN.create_image(l * 20 + 10, i * 20 + 10, image = Image_Fleche_Rond_Bas) Fleche_Rond_Bas_Liste[i*25 + l] = Fleche_Rond_Bas Blocks_Liste[i*25 + l] = "FLECHE_ROND_BAS" DESSIN.tag_lower(Fleche_Rond_Bas) if OBJET[l].count('K') == 1: #K = FLECHE ROND GAUCHE Fleche_Rond_Gauche = DESSIN.create_image(l * 20 + 10, i * 20 + 10, image = Image_Fleche_Rond_Gauche) Fleche_Rond_Gauche_Liste[i*25 + l] = Fleche_Rond_Gauche Blocks_Liste[i*25 + l] = "FLECHE_ROND_GAUCHE" DESSIN.tag_lower(Fleche_Rond_Gauche) if OBJET[l].count('M') == 1: #M = FLECHE ROND DROITE Fleche_Rond_Droite = DESSIN.create_image(l * 20 + 10, i * 20 + 10, image = Image_Fleche_Rond_Droite) Fleche_Rond_Droite_Liste[i*25 + l] = Fleche_Rond_Droite Blocks_Liste[i*25 + l] = "FLECHE_ROND_DROITE" DESSIN.tag_lower(Fleche_Rond_Droite) if OBJET[l].count('Y') == 1: #Y = FLECHE CARREE HAUT Fleche_Carre_Haut = DESSIN.create_image(l * 20 + 10, i * 20 + 10, image = Image_Fleche_Carre_Haut) Fleche_Carre_Haut_Liste[i*25 + l] = Fleche_Carre_Haut Blocks_Liste[i*25 + l] = "FLECHE_CARRE_HAUT" DESSIN.tag_lower(Fleche_Carre_Haut) if OBJET[l].count('H') == 1: #H = FLECHE CARREE BAS Fleche_Carre_Bas = DESSIN.create_image(l * 20 + 10, i * 20 + 10, image = Image_Fleche_Carre_Bas) Fleche_Carre_Bas_Liste[i*25 + l] = Fleche_Carre_Bas Blocks_Liste[i*25 + l] = "FLECHE_CARRE_BAS" DESSIN.tag_lower(Fleche_Carre_Bas) if OBJET[l].count('G') == 1: #G = FLECHE CARREE GAUCHE Fleche_Carre_Gauche = DESSIN.create_image(l * 20 + 10, i * 20 + 10, image = Image_Fleche_Carre_Gauche) Fleche_Carre_Gauche_Liste[i*25 + l] = Fleche_Carre_Gauche Blocks_Liste[i*25 + l] = "FLECHE_CARRE_GAUCHE" DESSIN.tag_lower(Fleche_Carre_Gauche) if OBJET[l].count('J') == 1: #J = FLECHE CARREE DROITE Fleche_Carre_Droite = DESSIN.create_image(l * 20 + 10, i * 20 + 10, image = Image_Fleche_Carre_Droite) Fleche_Carre_Droite_Liste[i*25 + l] = Fleche_Carre_Droite Blocks_Liste[i*25 + l] = "FLECHE_CARRE_DROITE" DESSIN.tag_lower(Fleche_Carre_Droite) if OBJET[l].count('B') == 1: #B = Boite Boite = DESSIN.create_image(l * 20 + 10, i * 20 + 10, image = Image_Boite) Boite_Liste[i*25 + l] = Boite Blocks_Liste[i*25 + l] = "BOITE" DESSIN.tag_lower(Boite) if OBJET[l].count('T') == 1: #T = Toile Toile = DESSIN.create_image(l * 20 + 10, i * 20 + 10, image = Image_Toile) Toile_Liste[i*25 + l] = Toile Blocks_Liste[i*25 + l] = "TOILE" DESSIN.tag_lower(Toile) Fichier.close()
Mais là où je ne comprend pas, c'est que seulement les flèches avec des déplacements positifs bugs, j'ai cherché longtemps la cause du problème mais rien.
Évidamment j'ai fais des tests :
* En enlevant :
cela marche (mais j'en ai besoin pour récupérer la position de chaque objet).
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 Objet_Liste[i + Direction] = Objet_Liste[i] #Replace l'objet au bon endroit dans sa liste Objet_Liste[i] = 0 #L'enlève d'où il était avant
* En mettant un "-" devant les valeurs, étrangement ça marche plutôt bien, les flèches se déplacent à la bonne vitesse (même si tout est deréglé au niveau des positions).
* Avec un print j'ai pu voir que les flèches se déplacent bien case par case (mais en oubliant le timer ?)
Je m'en remets à vous, je ne comprend absolument pas ce bug, surtout qu'il n'y a un problème que pour les chiffres positifs.
Je peux mettre le reste du code si besoin.
Partager