Salut à tous,
Alors je suis en train de faire un petit Snake avec pygame et j'ai un drôle de problème. Tout d'abord voici mon code ( il est légèrement long donc je mettrais les parties concernés quand j'en parlerais. Je donne les images juste en bas au cas où quelqu'un voudrait tester le code ( ne pas oublier de les mettre dans un répertoire 'img' ou de modifier le code).
Ensuite voilà mon problème, j'étais en train de gérer les sprites pour que la tête ressorte de l'autre coté de l'écran si elle touche un bord, j'ai lancer mon sript et j'ai remarqué plusieurs freeze de quelques seconde. Parfois cliquer sur la fenêtre relancer le script, parfois pas. C'est donc pas une histoire de focus de la fenêtre je pense. Je me suis donc dit " Regardons dans le gestionnaire des tâches". Et à chaque freeze, mon script passer de 5 à 25% d'utilisation de processeurs. Ca élimine donc le focus de fenêtre et me laisse supposer que y a une histoire de boucle qui n'a rien à faire là ou quelques chose s'en rapprochant. J'ai donc, tout bêtement fait ceci dans mon code :
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
83
84
85
86
87
88
89
90
91
92
93
94
95 import pygame,sys,time,os from pygame.locals import * #Global Variable EventKey=None CurrentSnakeHeadX=400 CurrentSnakeHeadY=200 CurrentSnake1Number=0 CurrentSnakeHeadOrientation=1 # 1:top, 2:right, 3:bottom, 4:left #Initialize The Window window = pygame.display.set_mode((900, 550)) pygame.display.set_caption('Snake') #Load Sprite white=(255,255,255) Snake1 = pygame.image.load("img/Snake1.png").convert() SnakeQueue = pygame.image.load("img/SnakeQueue.png").convert() SnakeHead = pygame.image.load("img/SnakeHead.png").convert() Black= pygame.image.load("img/BlackCube.png").convert() #Setup the colorkeys Snake1.set_colorkey(white) SnakeQueue.set_colorkey(white) SnakeHead.set_colorkey(white) #This Function Load Basic Background def background () : for ScreenHeight in range(18): for ScreenWeight in range(11): window.blit(Black,(50*ScreenHeight,50*ScreenWeight)) def snake(): global CurrentSnakeHeadX, CurrentSnakeHeadY,CurrentSnake1Number if EventKey==None : window.blit(SnakeHead,(CurrentSnakeHeadX,CurrentSnakeHeadY)) window.blit(SnakeQueue,(400,250)) elif EventKey==1 : for repeat in range(5) : if CurrentSnakeHeadY!=0: CurrentSnakeHeadY=CurrentSnakeHeadY-20 background() window.blit(SnakeHead,(CurrentSnakeHeadX,CurrentSnakeHeadY)) window.blit(SnakeQueue,(CurrentSnakeHeadX,CurrentSnakeHeadY+50)) refresh() time.sleep(0.4) else : CurrentSnakeHeadY=490 for repeat in range(5) : CurrentSnakeHeadY-=10 background() window.blit(SnakeHead,(CurrentSnakeHeadX,CurrentSnakeHeadY)) window.blit(SnakeQueue,(CurrentSnakeHeadX,CurrentSnakeHeadY+50)) refresh() time.sleep(0.4) def refresh (): pygame.display.flip() def start (): background() snake() refresh() start() while 1: for event in pygame.event.get(): if event.type == pygame.KEYDOWN: if event.key == pygame.K_UP: print(EventKey) EventKey=0 snake() refresh() EventKey=None pygame.event.clear() if event.key == pygame.K_RIGHT: EventKey=2 lancelot() refresh() EventKey=None pygame.event.clear() if event.key == pygame.K_LEFT: EventKey=3 snake() refresh() EventKey=None pygame.event.clear() else : print(EventKey) EventKey=1 snake() pygame.event.clear() if event.type == pygame.QUIT: pygame.quit()
En gros j'ai fait en sorte qu'il y a un print a sur la fenêtre de l'IDLE en dessous de ma fenêtre pygame. Et étrangement, pas de a jusqu'a ce que ça freeze, et à ce moment les ben il s'arrêter pas, la boucle faisait :
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 while 1: print('a') for event in pygame.event.get(): if event.type == pygame.KEYDOWN: if event.key == pygame.K_UP: print(EventKey) EventKey=0 snake() refresh() EventKey=None pygame.event.clear() if event.key == pygame.K_RIGHT: EventKey=2 lancelot() refresh() EventKey=None pygame.event.clear() if event.key == pygame.K_LEFT: EventKey=3 snake() refresh() EventKey=None pygame.event.clear() else : print(EventKey) EventKey=1 snake() pygame.event.clear() if event.type == pygame.QUIT: pygame.quit()
Et c'est tout. Pas de relancement de l'animation là. Au fait, je précise que j'ai, pour également vérifier l'état de la variable EventKey, mis ceci
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 while1: print('a')
dans mon code, à chaque passage jusqu'au freeze à chaque passage de la boucle.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 else : print(EventKey)
Je précise que il y a des time.sleep dans ma fonction snake, et que les passage se faisait donc toutes les 5*0.4secondes, donc 2 seconde. Pour le moment j'avais pas mis quoi que ce soit pour déplacer le serpent excepté l'animation où il bouge automatiquement donc.
La fonction en question :
Et je comprend pas vraiment ces freezes, malgré quelques recherches et plusieurs relectures de mon code.
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 def snake(): global CurrentSnakeHeadX, CurrentSnakeHeadY,CurrentSnake1Number if EventKey==None : window.blit(SnakeHead,(CurrentSnakeHeadX,CurrentSnakeHeadY)) window.blit(SnakeQueue,(400,250)) elif EventKey==1 : for repeat in range(5) : if CurrentSnakeHeadY!=0: CurrentSnakeHeadY=CurrentSnakeHeadY-20 background() window.blit(SnakeHead,(CurrentSnakeHeadX,CurrentSnakeHeadY)) window.blit(SnakeQueue,(CurrentSnakeHeadX,CurrentSnakeHeadY+50)) refresh() time.sleep(0.4) else : CurrentSnakeHeadY=490 for repeat in range(5) : CurrentSnakeHeadY-=10 background() window.blit(SnakeHead,(CurrentSnakeHeadX,CurrentSnakeHeadY)) window.blit(SnakeQueue,(CurrentSnakeHeadX,CurrentSnakeHeadY+50)) refresh() time.sleep(0.4)
J'aurais donc bien besoin d'un coup de main
Deux trois précisions pour vous faire gagner du temps : refresh()== pygame.display.flip (j'ai juste créer la fonction refresh pour un souci de lisibilité et de gain de temps)
Faites pas attention au nom de fonction, j'essaie de pas passer 4h à en choisir des super explicite, je prend ce qui viens.
background() est juste égal à 18 blocs noir sur 11 blocs noir.
Les images sont les suivantes :
Je crois avoir tout dit, désolé pour la longueur du message j'ai essayé d'apporter le maximum de précision. Je suis sûr que c'est une erreur toute bête mais je trouve vraiment pas.
Partager