Hello, je suis entrain de coder un Flappy Bird en python et j'ai réussi a le faire descendre a l'infini. Mais le problème est que le temps que je génère deux tubes, mon oiseau ne descend pas, donc ca rend mal (en gros il descend de 4 pixels par 4pixels mais lentement, donc c'est nul). Ce qu'il faut comprendre, c'est que sans generer les tubes, mon oiseau descend bien, assez rapidement, mais quand je veux creer un tube, le temps de creer celui-ci, mon oiseau ne descend pas.
Voila mon code:
La boule for avec pipesDown et pipesUp, c'est pour déplacer mes tubes (qui sont stockés dans un tableau)
Ou est-ce possible de faire deux action simultanément ?
Parce que tu effectues les instructions les unes après les autres.
Regarde du côté de la fonction setInterval.
Le 08 mai 2022 à 20:51:57 :
Parce que tu effectues les instructions les unes après les autres.
Regarde du côté de la fonction setInterval.
Oui je sais que c'est a cause de ca, merci pour ta réponse, et ca fait quoi setInterval ?
Le 08 mai 2022 à 20:58:57 :
Le 08 mai 2022 à 20:54:50 :
Le 08 mai 2022 à 20:51:57 :
Parce que tu effectues les instructions les unes après les autres.
Regarde du côté de la fonction setInterval.
Oui je sais que c'est a cause de ca, merci pour ta réponse, et ca fait quoi setInterval ?
Et setInterval n'existe pas en python si ?
Je pensais que tu étais en JavaScript. Regarde les Threads ou les Pools.
Le 08 mai 2022 à 21:13:59 :
Je pensais que tu étais en JavaScript. Regarde les Threads ou les Pools.
J'ai essayé mais j'y comprends rien, et la doc et horrible
Le 08 mai 2022 à 21:14:30 :
Le 08 mai 2022 à 21:13:59 :
Je pensais que tu étais en JavaScript. Regarde les Threads ou les Pools.J'ai essayé mais j'y comprends rien, et la doc et horrible
Abandonne dans ce cas ![]()
Le 09 mai 2022 à 05:44:35 :
Le 08 mai 2022 à 21:14:30 :
Le 08 mai 2022 à 21:13:59 :
Je pensais que tu étais en JavaScript. Regarde les Threads ou les Pools.J'ai essayé mais j'y comprends rien, et la doc et horrible
Abandonne dans ce cas
Je vais pas abandonner, mais que je fais ça:
play = True
while play:
t1 = threading.Thread(target=bird_down).start()
t2 = threading.Thread(target=pipes_generator).start()
t3 = threading.Thread(target=pipes_move).start()
if bird.ycor() < -275 or bird.ycor() > 275:
game.lose()
break
J'ai ces erreurs, pourtant j'ai regardé sur pleins de sites et ils font pareil:
Exception in thread Thread-1 (bird_down)Exception in thread :
Traceback (most recent call last):
Thread-2 (pipes_generator) File "C:\Users\mikal\AppData\Local\Programs\Python\Python310\lib\threading.py", line 1009, in _bootstrap_inner
:
Traceback (most recent call last):
File "C:\Users\mikal\AppData\Local\Programs\Python\Python310\lib\threading.py", line 1009, in _bootstrap_inner
self.run()
File "C:\Users\mikal\AppData\Local\Programs\Python\Python310\lib\threading.py", line 946, in run
self.run()
File "C:\Users\mikal\AppData\Local\Programs\Python\Python310\lib\threading.py", line 946, in run
self._target(*self._args, **self._kwargs)
File "C:\Users\mikal\PycharmProjects\flappy bird\main.py", line 33, in bird_down
self._target(*self._args, **self._kwargs)
bird.default_down() File "C:\Users\mikal\PycharmProjects\flappy bird\main.py", line 38, in pipes_generator
File "C:\Users\mikal\PycharmProjects\flappy bird\bird.py", line 26, in default_down
down = PipeDown(ypos) self.goto(self.xcor(), self.ycor() - self.speed)
File "C:\Users\mikal\PycharmProjects\flappy bird\pipeDown.py", line 6, in __init__
File "C:\Users\mikal\AppData\Local\Programs\Python\Python310\lib\turtle.py", line 1777, in goto
super().__init__()
File "C:\Users\mikal\AppData\Local\Programs\Python\Python310\lib\turtle.py", line 3815, in __init__
self._goto(Vec2D(x, y))
File "C:\Users\mikal\AppData\Local\Programs\Python\Python310\lib\turtle.py", line 3160, in _goto
RawTurtle.__init__(self, Turtle._screen,
screen._pointlist(self.currentLineItem), File "C:\Users\mikal\AppData\Local\Programs\Python\Python310\lib\turtle.py", line 2545, in __init__
File "C:\Users\mikal\AppData\Local\Programs\Python\Python310\lib\turtle.py", line 754, in _pointlist
cl = self.cv.coords(item)
File "<string>", line 1, in coords
self.drawingLineItem = screen._createline()
File "C:\Users\mikal\AppData\Local\Programs\Python\Python310\lib\turtle.py", line 526, in _createline
File "C:\Users\mikal\AppData\Local\Programs\Python\Python310\lib\tkinter\__init__.py", line 2795, in coords
return self.cv.create_line(0, 0, 0, 0, fill="", width=2,
File "<string>", line 1, in create_line
self.tk.call((self._w, 'coords') + args))]
RuntimeError File "C:\Users\mikal\AppData\Local\Programs\Python\Python310\lib\tkinter\__init__.py", line 2823, in create_line
: main thread is not in main loop
return self._create('line', args, kw)
File "C:\Users\mikal\AppData\Local\Programs\Python\Python310\lib\tkinter\__init__.py", line 2805, in _create
return self.tk.getint(self.tk.call(
RuntimeError: main thread is not in main loop
Traceback (most recent call last):
File "C:\Users\mikal\PycharmProjects\flappy bird\main.py", line 62, in <module>
if bird.ycor() < -275 or bird.ycor() > 275:
KeyboardInterrupt
Process finished with exit code -1073741510 (0xC000013A: interrupted by Ctrl+C)
Evidement mes fonctions sont declarées
Je pense que tu n'as pas du tout besoin de plusieurs threads pour générer ton image (c'est même contre-productif ici). Le principe de Turtle (et des librairies graphiques comme Pygame) c'est de calculer l'ensemble des positions de chaque objet et de les rendre (de les afficher) à chaque tour de boucle.
Tu peux générer tout simplement tes tuyaux en créant des objets Turtle et en leur donnant une forme et une couleur avec la méthode shape https://docs.python.org/fr/3.10/library/turtle.html#turtle.shape
Ensuite comme tu auras au moins 2 tortues pipe (un tuyau en haut et un en bas) + une tortue oiseau, tu pourras bouger les tortues pipe de la droite vers la gauche et ta tortue oiseau de haut en bas (et de bas en haut que tu appuies sur une touche).
Ensuite comme tu disposes des coordonnées de chaque objet, à chaque tour de boucle tu peux regarder si la distance absolue entre l'un des deux tuyaux et ton oiseau est inférieure à un certain seuil, si oui collision, on sort de la boucle et on recommence la partie.
Le 09 mai 2022 à 17:45:41 :
Je pense que tu n'as pas du tout besoin de plusieurs threads pour générer ton image (c'est même contre-productif ici). Le principe de Turtle (et des librairies graphiques comme Pygame) c'est de calculer l'ensemble des positions de chaque objet et de les rendre (de les afficher) à chaque tour de boucle.Tu peux générer tout simplement tes tuyaux en créant des objets Turtle et en leur donnant une forme et une couleur avec la méthode shape https://docs.python.org/fr/3.10/library/turtle.html#turtle.shape
Ensuite comme tu auras au moins 2 tortues pipe (un tuyau en haut et un en bas) + une tortue oiseau, tu pourras bouger les tortues pipe de la droite vers la gauche et ta tortue oiseau de haut en bas (et de bas en haut que tu appuies sur une touche).
Ensuite comme tu disposes des coordonnées de chaque objet, à chaque tour de boucle tu peux regarder si la distance absolue entre l'un des deux tuyaux et ton oiseau est inférieure à un certain seuil, si oui collision, on sort de la boucle et on recommence la partie.
Oui c'est justement ce que j'ai fais, mais le problème c'est que le temps que je génère un pipe, mon oiseau ne tombe pas, puisque je fais chaque chose l'une après l'autre
Normalement si tu utilises la méthode shape pour dessiner ton rectangle ça devrait être assez rapide.
Ensuite il faut que tu utilises la méthode update de ton objet screen pour mettre à jour ton écran après avoir tracé tes objets.