Space Invaders, problème de collision
AlpacinoNogeek
Messages postés
12
Date d'inscription
Statut
Membre
Dernière intervention
-
AlpacinoNogeek Messages postés 12 Date d'inscription Statut Membre Dernière intervention -
AlpacinoNogeek Messages postés 12 Date d'inscription Statut Membre Dernière intervention -
Bonjour à tous,
J'ai un petit problème. Enfaîte pour mon projet ISN je crée un Space Invaders. Comme on m'a toujours aidé ici, je demande votre humble aide.
Voici le code :
Le problème est qu'il ne détruit pas l'abri alors qu'il devrait. (regardez la fonction destruction_abri)
J'ai un petit problème. Enfaîte pour mon projet ISN je crée un Space Invaders. Comme on m'a toujours aidé ici, je demande votre humble aide.
Voici le code :
from tkinter import * from random import * from tkinter.messagebox import* import sys from random import shuffle fenetre=Tk() fenetre.title('Licorne Invaders') fenetre.geometry("640x480") #creation de la fenetre de jeu Fond=Canvas(fenetre,width=800,height=600,bg='black') fichier6=PhotoImage(file="images/image_de _début.gif") Fond.create_image(330,230,image=fichier6) Fond.place(x=0,y=0) #creation du canvas tirs = [] def creer_tir(event): xtir = xplateforme1+30 tir = Fond.create_oval(xtir-5, 440, xtir+5, 450, fill='red', outline ='blue') tirs.append(tir) def deplacer_tirs(): for tir in tirs: xtir, ytir, x2tir, y2tir = Fond.coords(tir) if y2tir > 0: Fond.move(tir, 0, -1) else: Fond.delete(tir) tirs.remove(tir) fenetre.after(3, deplacer_tirs) def destruction_abri(): global CoordonneesBriques,ListeAbris,xtir,ytir,feu,Xobus,Yobus,feuEnnemi,CoordEnnemis,ObusEnnemi,projectile i=0 t=0 while i<len(CoordonneesBriques): x=CoordonneesBriques[i][t] y=CoordonneesBriques[i][t+1] # Si le joueur tire sur l'une des briques # composant les abris celle-ci est détruite if xtir==x and ytir==y : Fond.delete(ListeAbris[i]) Fond.delete(tirs[0]) tirs=0 del CoordonneesBriques[i] del ListeAbris[i] t=0 i+=1 i=0 t=0 def Creation_Abris(): global ListeAbris,CoordonneesBriques ListeAbris=[] CoordonneesBriques=[] i=0 x=40 y=340 while i<3: limX=x+120 limY=y+60 departx=x while y<limY: while x<limX: ListeAbris.append(Fond.create_rectangle(x,y,x+20,y+20,fill='red')) CoordonneesBriques.append([x,y]) x+=20 x=departx y+=20 i+=1 x+=220 y-=60 def creation_plateforme(): global plateforme,xplateforme1,yplateforme1 plateforme=[] xplateforme1=307 yplateforme1=450 #definition de x et y def steam2(): global bou2, fichier, bou4,bou9,plateforme,xplateforme1,yplateforme1 bou4.destroy() bou2.destroy() bou9.destroy() fichier=PhotoImage(file="images/SPACE.gif") Fond.create_image(307,155,image=fichier) plateforme.append(Fond.create_rectangle(xplateforme1,yplateforme1,xplateforme1+59,yplateforme1+17,fill='green')) ListeAbris=[] CoordonneesBriques=[] i=0 x=40 y=340 while i<3: limX=x+120 limY=y+60 departx=x while y<limY: while x<limX: ListeAbris.append(Fond.create_rectangle(x,y,x+20,y+20,fill='grey')) CoordonneesBriques.append([x,y]) x+=20 x=departx y+=20 i+=1 x+=220 y-=60 fenetre.bind('<Key-space>', creer_tir) fenetre.after(3, deplacer_tirs) #steam2 est creee a partir d'un autre ecran de jeux qui n'a pas les meme bouttons, donc pour ne pas beuger, on crée une deuxieme fonction steam def steam(): global bou2, fichier, bou4, bou3 bou2.destroy() bou3.destroy() fichier=PhotoImage(file="images/SPACE.gif") Fond.create_image(307,155,image=fichier) plateforme.append(Fond.create_rectangle(xplateforme1,yplateforme1,xplateforme1+59,yplateforme1+17,fill='green')) ListeAbris=[] CoordonneesBriques=[] i=0 x=40 y=340 while i<3: limX=x+120 limY=y+60 departx=x while y<limY: while x<limX: ListeAbris.append(Fond.create_rectangle(x,y,x+20,y+20,fill='grey')) CoordonneesBriques.append([x,y]) x+=20 x=departx y+=20 i+=1 x+=220 y-=60 fenetre.bind('<Key-space>', creer_tir) fenetre.after(3, deplacer_tirs) #creation de la fonction steam, fenetre de jeux principal def liste(): global fichier3, bou3, bou2, bou4,bou7 bou1.destroy() bou3.destroy() bou7.destroy() fichier3=PhotoImage(file="images/instru.gif") Fond.create_image(320,240,image=fichier3) bou4=Button(fenetre,text="Lancer le jeu !", command = start2) bou4.pack() #fonction liste pour les commandes def credit(): global bou7, bou3, bou1, fichier5,bou9 bou7.destroy() bou1.destroy() bou3.destroy() fichier5=PhotoImage(file="images/crédit.png") Fond.create_image(320,240,image=fichier5) bou9=Button(fenetre, text="Lancer le jeu !", command =start) bou9.pack() #fonction credits, pour nous, et une question de design (pour avoir 3 bouttons sur la premiere fenetre) def start2(): global fichier2, bou2, bou1,bou3,bou7,fichier6,bou4 bou3.destroy() bou1.destroy() bou7.destroy() bou4.destroy() fichier2=PhotoImage(file="images/fond.png") Fond.create_image(325,240,image=fichier2) bou2=Button(fenetre,text="Je suis pret !", command = steam) bou2.pack(side=BOTTOM) #meme chose que pour la fonction steam2, on crée une deuxieme fonction strart def start(): global fichier2, bou2, bou1,bou3,bou7,bou9 bou1.destroy() bou3.destroy() bou7.destroy() bou9.destroy() fichier2=PhotoImage(file="images/fond.png") Fond.create_image(325,240,image=fichier2) bou2=Button(fenetre,text="Je suis pret !", command = steam) bou2.pack(side=BOTTOM) #fonction start pour mettre le joueur dans une certaine ambiance def start3(): global fichier2, bou2, bou1,bou3,bou7,bou9 bou1.destroy() bou3.destroy() bou7.destroy() fichier2=PhotoImage(file="images/fond.png") Fond.create_image(325,240,image=fichier2) bou2=Button(fenetre,text="Je suis pret !", command = steam) bou2.pack(side=BOTTOM) bou7=Button(fenetre, text="Crédits",command=credit) bou7.pack(side=TOP) bou3=Button(fenetre, text="Comment jouer ?", command =liste) bou3.pack(side=BOTTOM) bou1=Button(fenetre, text="Lancer le jeu !", command =start3) bou1.place(x=277,y=220) #premiers bouttons du menu de base def move_plateforme(dx): global xplateforme1,yplateforme1,drapeau,plateforme xplateforme1=xplateforme1+dx if xplateforme1<=35: xplateforme1=35 Fond.coords(plateforme[0],xplateforme1,yplateforme1,xplateforme1+60,yplateforme1+20) elif xplateforme1>=550: xplateforme1=550 Fond.coords(plateforme[0],xplateforme1,yplateforme1,xplateforme1+60,yplateforme1+20) else: Fond.coords(plateforme[0],xplateforme1,yplateforme1,xplateforme1+60,yplateforme1+20) def right(event): move_plateforme(10) fenetre.bind("<Key-Right>",right) creation_plateforme() def left(event): move_plateforme(-10) fenetre.bind("<Key-Left>",left) def up(event) : move_1plateforme(-10) fenetre.mainloop() try: fenetre.destroy() except TclError: pass
Le problème est qu'il ne détruit pas l'abri alors qu'il devrait. (regardez la fonction destruction_abri)
A voir également:
- Space Invaders, problème de collision
- Space monger - Télécharger - Optimisation
- Space sniffer - Télécharger - Divers Utilitaires
- Space observer - Télécharger - Gestion de fichiers
- Darkino space - Accueil - Services en ligne
- Clean space 7 - Télécharger - Web & Internet
1 réponse
Bonjour.
Bon, je te répond même si j'ai l'impression de parler dans le vide...
Ton code est illisible et incompréhensible, comment veux-tu que l'on devine ce que ton code est censé faire ? On ne peut même pas voir où elle est appelée cette fameuse fonction destruction_abri.
Si tu veux de l'aide, réduis ton code au plus simple, et si tu as toujours un problème poste un code que l'on puisse tester chez nous.
Allez je suis gentil, je vais te montrer comment s'effectue un test de collision entre 2 éléments, c'est quand même pas difficle d'écrire 50 lignes de codes pour tester.
Lance ce test plusieurs fois jusqu'à obtenir des échecs et réussites de collisions, car j'ai volontairement laissé cet état de fait pour faire travailler tes méninges ^^
Essaie donc de comprendre pourquoi ces échecs et réussites, et surtout trouve un moyen de résoudre ce problème (la méthode est très simple).
Et je te le répète une nouvelle fois, il y a une méthode de canvas qui se nomme find_overlapping qui permet de se passer de faire ce genre de choses.
Bon, je te répond même si j'ai l'impression de parler dans le vide...
Ton code est illisible et incompréhensible, comment veux-tu que l'on devine ce que ton code est censé faire ? On ne peut même pas voir où elle est appelée cette fameuse fonction destruction_abri.
Si tu veux de l'aide, réduis ton code au plus simple, et si tu as toujours un problème poste un code que l'on puisse tester chez nous.
Allez je suis gentil, je vais te montrer comment s'effectue un test de collision entre 2 éléments, c'est quand même pas difficle d'écrire 50 lignes de codes pour tester.
import tkinter as tk import random items = [] def creer_items(): can.delete(tk.ALL) items.clear() lg = random.randint(20, 100) ld = random.randint(20, 100) item_gauche = can.create_rectangle( 0, 300 - int(lg/2), 50, 300+lg, fill="red", width=0 ) items.append(item_gauche) item_droit = can.create_rectangle( 550, 300 - int(ld/2), 600, 300+ld, fill="blue", width=0 ) items.append(item_droit) def deplacer_items(): can.move(items[0], 1, 0) can.move(items[1], -1, 0) c = can.coords(items[1]) if c[2] < 300: can.create_text(300, 300, text="échec collision !", fill="orange", font=("", 24)) bout['state'] = tk.NORMAL return if not test_collision(): can.after(10, deplacer_items) else: can.create_text(300, 300, text="réussite collision !", fill="green", font=("", 24)) bout['state'] = tk.NORMAL def test_collision(): gx, gy, gx2, gy2 = can.coords(items[0]) dx, dy, dx2, dy2 = can.coords(items[1]) for x, y in ((dx, dy), (dx, dy2), (dx2, dy), (dx2, dy2)): if gx <= x <= gx2 and gy <= y <= gy2: return True return False def test(): bout['state'] = tk.DISABLED creer_items() deplacer_items() root = tk.Tk() can = tk.Canvas(root, width=600, height=600, bg="white") can.pack() f = tk.Frame(root) f.pack() bout = tk.Button(f, text="test", command=test) bout.pack() root.mainloop()
Lance ce test plusieurs fois jusqu'à obtenir des échecs et réussites de collisions, car j'ai volontairement laissé cet état de fait pour faire travailler tes méninges ^^
Essaie donc de comprendre pourquoi ces échecs et réussites, et surtout trouve un moyen de résoudre ce problème (la méthode est très simple).
Et je te le répète une nouvelle fois, il y a une méthode de canvas qui se nomme find_overlapping qui permet de se passer de faire ce genre de choses.
Ensuite mon code possède plusieurs fonction plus ou moins similaire car on peut atteindre des fenêtres de différentes façon, donc les même boutons ne sont pas forcément créés.
Pour ton programme je ne comprend pas vraiment à quoi il sert, Il sert à vérifier un test ? OK, mais dans mon cas je sais pas vraiment comment l'appliquer.
Merci et désolé :)