Space Invaders, problème de collision

Fermé
AlpacinoNogeek Messages postés 12 Date d'inscription lundi 16 avril 2018 Statut Membre Dernière intervention 2 mars 2020 - Modifié le 18 avril 2018 à 16:56
AlpacinoNogeek Messages postés 12 Date d'inscription lundi 16 avril 2018 Statut Membre Dernière intervention 2 mars 2020 - 22 avril 2018 à 19:16
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 :

 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:

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.

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.
0
AlpacinoNogeek Messages postés 12 Date d'inscription lundi 16 avril 2018 Statut Membre Dernière intervention 2 mars 2020
22 avril 2018 à 19:16
Merci et désolé si je parais répétitif,
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é :)
0