Space Invaders, problème de collision
AlpacinoNogeek
Messages postés
16
Statut
Membre
-
AlpacinoNogeek Messages postés 16 Statut Membre -
AlpacinoNogeek Messages postés 16 Statut Membre -
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
- Disk space fan - Télécharger - Divers Utilitaires
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é :)