Gestion de la collision

Collision de deux balles

Voici un programme où une balle rebondit d’une façon aléatoire sur les bords de l’écran.


from tkinter import *

def animation():
    global VX, VY, BalleX, BalleY
    futurX, futurY = BalleX + VX, BalleY + VY
    if futurX > 290 or futurX < 10 :
        VX = - VX
        futurX = BalleX + VX
    if futurY > 190 or futurY < 10 :
        VY = - VY
        futurY = BalleY + VY
    BalleX, BalleY = futurX, futurY

    Fond.coords(Balle, BalleX - 10, BalleY - 10, BalleX + 10, BalleY + 10)

    fenetre.after(40,animation)

fenetre=Tk()
fenetre.geometry("300x200")

Fond=Canvas(fenetre,width=300,height=200,bg="white")
Fond.grid()

VX, VY = 2, 2
BalleX, BalleY = 50, 100

Balle = Fond.create_oval(40, 90, 60, 110, fill = 'red')

animation()

fenetre.mainloop()
  1. Ajouter une deuxième balle qui rebondit. L’animation s’arrête dès que les deux balles entrent en collision.
  2. Modifier ce programme pour qu’il gère la collision entre les deux balles et que l’animation continue.

Résolution de l'exercice "Collision de deux balles".


from tkinter import *

def animation():
    global V1X, V1Y, Balle1X, Balle1Y, V2X, V2Y, Balle2X, Balle2Y
    futurX, futurY = Balle1X + V1X, Balle1Y + V1Y
    if futurX > 280 or futurX < 0 :
        V1X = - V1X
        futurX = Balle1X + V1X
    if futurY > 180 or futurY < 0 :
        V1Y = - V1Y
        futurY = Balle1Y + V1Y
    Balle1X, Balle1Y = futurX, futurY
    Fond.coords(Balle1, Balle1X - 10, Balle1Y -10, Balle1X + 10, Balle1Y + 10)

    futurX, futurY = Balle2X + V2X, Balle2Y + V2Y
    if futurX > 290 or futurX < 10 :
        V2X = - V2X
        futurX = Balle2X + V2X
    if futurY > 190 or futurY < 10 :
        V2Y = - V2Y
        futurY = Balle2Y + V2Y
    Balle2X, Balle2Y = futurX, futurY
    Fond.coords(Balle2, Balle2X - 10, Balle2Y - 10, Balle2X + 10, Balle2Y + 10)

    dist = (Balle1X-Balle2X)**2 + (Balle1Y-Balle2Y)**2
    if dist > 400 :
        fenetre.after(40,animation)
    else :
        Fond.create_text(150,100,text="PAF",font=('Arial',60))

fenetre=Tk()
fenetre.geometry("300x200")
fenetre.title("Programme à deux balles")

Fond=Canvas(fenetre,width=300,height=200,bg="white")
Fond.grid()

V1X, V1Y = 2, 2
V2X, V2Y = 1, -2
Balle1X, Balle1Y = 50, 100
Balle2X, Balle2Y = 150, 100

Balle1 = Fond.create_oval(40, 90, 60, 110, fill = 'red')
Balle2 = Fond.create_oval(140, 90, 160, 110, fill = 'blue')

animation()

fenetre.mainloop()

Résolution de l'exercice "Collision de deux balles".


from tkinter import *

def animation():
    global V1X, V1Y, Balle1X, Balle1Y, V2X, V2Y, Balle2X, Balle2Y
    futurX, futurY = Balle1X + V1X, Balle1Y + V1Y
    if futurX > 280 or futurX < 0 :
        V1X = - V1X
        futurX = Balle1X + V1X
    if futurY > 180 or futurY < 0 :
        V1Y = - V1Y
        futurY = Balle1Y + V1Y
    Balle1X, Balle1Y = futurX, futurY
    Fond.coords(Balle1, Balle1X - 10, Balle1Y -10, Balle1X + 10, Balle1Y + 10)

    futurX, futurY = Balle2X + V2X, Balle2Y + V2Y
    if futurX > 290 or futurX < 10 :
        V2X = - V2X
        futurX = Balle2X + V2X
    if futurY > 190 or futurY < 10 :
        V2Y = - V2Y
        futurY = Balle2Y + V2Y
    Balle2X, Balle2Y = futurX, futurY
    Fond.coords(Balle2, Balle2X - 10, Balle2Y - 10, Balle2X + 10, Balle2Y + 10)

    dist = (Balle1X-Balle2X)**2 + (Balle1Y-Balle2Y)**2
    if dist <= 400 :
        V1X = - V1X
        V1Y = - V1Y
        V2X = - V2X
        V2Y = - V2Y
    fenetre.after(40,animation)

fenetre=Tk()
fenetre.geometry("300x200")
fenetre.title("Programme à deux balles")

Fond=Canvas(fenetre,width=300,height=200,bg="white")
Fond.grid()

V1X, V1Y = 5, 5
V2X, V2Y = 4, -4
Balle1X, Balle1Y = 50, 100
Balle2X, Balle2Y = 150, 100

Balle1 = Fond.create_oval(40, 90, 60, 110, fill = 'red')
Balle2 = Fond.create_oval(140, 90, 160, 110, fill = 'blue')

animation()

fenetre.mainloop()

Collision d'une balle et d'un rectangle

Voici un programme qui crée une balle de rayon 10 et un rectangle de hauteur 10 et de largeur 50 qui rebondissent d’une façon aléatoire aux bords de l’écran. Modifier ce programme pour qu’il gère la collision entre la balle et le rectangle.

Résolution de l'exercice "Collision d'une balle et d'un rectangle".


from tkinter import *
import random
fenetre=Tk()

def animation():
    global VX, VY, X, Y, x, y, vx, vy
    # rectangle rebondit aux bords de la fenêtre
    futurx, futury = x + vx, y + vy
    if futurx > 250 or futurx < 5 :
        vx = - vx
        futurx = x + vx
    if futury > 295 or futury < 5 :
        vy = - vy
        futury = y + vy
    x, y = futurx, futury
    Fond.coords(Bouclier,x, y, x+50, y+10)
        
    futurX, futurY = X + VX, Y + VY
    if futurX > 290 or futurX < 10 :
        VX = - VX
        futurX = X + VX
    if futurY > 290 or futurY < 10 :
        VY = - VY
        futurY = Y + VY
          
    if  x-10 <= futurX <= x + 50 and y -10 < futurY < y + 10:
        VY = - VY
        VX = - VX
        futurY = Y + VY
        futurX = X + VX
        
    X, Y = futurX, futurY
    Fond.coords(Balle1, X - 10, Y -10, X + 10, Y + 10)

    fenetre.after(40,animation)
   
Fond=Canvas(fenetre,width=300,height=300,bg="white")
Fond.grid()

VX = random.randint(5,15)
VY = random.randint(5,10)
X, Y = 50, 100
Balle1 = Fond.create_oval(40, 90, 60, 110, fill = 'red')

x, y = 60, 60
vx = random.randint(-5,5)
vy = random.randint(-5,5)
Bouclier = Fond.create_rectangle(50,50,10,60,fill='green')

animation()


fenetre.mainloop()

Collision de trois balles

Voici un programme qui crée trois balles qui rebondissent. Modifier ce programme pour qu’il gère la collision entre les trois balles.


from tkinter import *
import random
def animation() :
    for i in range(3) :
        newX = X[i] + VX[i]
        if newX > 500-r[i] or newX < r[i] :
            VX[i] = - VX[i]
            newX = X[i] + VX[i]
        newY = Y[i] + VY[i]
        if newY > 500-r[i] or newY < r[i] :
            VY[i] = - VY[i]
            newY = Y[i] + VY[i]
        X[i], Y[i] = newX, newY
        Fond.coords(balle[i],X[i]-r[i],Y[i]-r[i],X[i]+r[i],Y[i]+r[i])
    fenetre.after(50,animation)
fenetre=Tk()
fenetre.geometry("500x500")
Fond=Canvas(fenetre,bg='white',width=500,height=500)
Fond.place(x=0,y=0)
X, Y, VX, VY, r, balle = [], [], [], [], [], []
coul=['red','green','blue','orange']
for i in range(3):
    X.append(random.randint(50,450))
    Y.append(random.randint(50,450))
    r.append(random.randint(10,30))
    VX.append(random.randint(-5,5))
    VY.append(random.randint(-5,5))
    balle.append(Fond.create_oval(X[i]-r[i],Y[i]-r[i],X[i]+r[i],Y[i]+r[i],fill=random.choice(coul)))
animation()
fenetre.mainloop()

Résolution de l'exercice "Collision de trois balles".


from tkinter import *

def animation():
    global V1X, V1Y, Balle1X, Balle1Y, V2X, V2Y, Balle2X, Balle2Y, \
           V3X, V3Y, Balle3X, Balle3Y
    futurX, futurY = Balle1X + V1X, Balle1Y + V1Y
    if futurX > 280 or futurX < 0 :
        V1X = - V1X
        futurX = Balle1X + V1X
    if futurY > 180 or futurY < 0 :
        V1Y = - V1Y
        futurY = Balle1Y + V1Y
    Balle1X, Balle1Y = futurX, futurY
    Fond.coords(Balle1, Balle1X - 10, Balle1Y -10, Balle1X + 10, Balle1Y + 10)

    futurX, futurY = Balle2X + V2X, Balle2Y + V2Y
    if futurX > 290 or futurX < 10 :
        V2X = - V2X
        futurX = Balle2X + V2X
    if futurY > 190 or futurY < 10 :
        V2Y = - V2Y
        futurY = Balle2Y + V2Y
    Balle2X, Balle2Y = futurX, futurY
    Fond.coords(Balle2, Balle2X - 10, Balle2Y - 10, Balle2X + 10, Balle2Y + 10)

    futurX, futurY = Balle3X + V3X, Balle3Y + V3Y
    if futurX > 290 or futurX < 10 :
        V3X = - V3X
        futurX = Balle3X + V3X
    if futurY > 190 or futurY < 10 :
        V3Y = - V3Y
        futurY = Balle3Y + V3Y
    Balle3X, Balle3Y = futurX, futurY
    Fond.coords(Balle3, Balle3X - 10, Balle3Y - 10, Balle3X + 10, Balle3Y + 10)
    
    dist1 = (Balle1X-Balle2X)**2 + (Balle1Y-Balle2Y)**2
    dist2 = (Balle1X-Balle3X)**2 + (Balle1Y-Balle3Y)**2
    dist3 = (Balle3X-Balle2X)**2 + (Balle3Y-Balle2Y)**2
    if dist1 <= 400 :
        V1X = - V1X
        V1Y = - V1Y
        V2X = - V2X
        V2Y = - V2Y
    if dist2 <= 400 :
        V1X = - V1X
        V1Y = - V1Y
        V3X = - V3X
        V3Y = - V3Y
    if dist3 <= 400 :
        V3X = - V3X
        V3Y = - V3Y
        V2X = - V2X
        V2Y = - V2Y
    fenetre.after(40,animation)

fenetre=Tk()
fenetre.geometry("300x200")
fenetre.title("Programme à deux balles")

Fond=Canvas(fenetre,width=300,height=200,bg="white")
Fond.grid()

V1X, V1Y = 2, 2
V2X, V2Y = 1, -2
V3X, V3Y = 2, -3
Balle1X, Balle1Y = 50, 100
Balle2X, Balle2Y = 150, 100
Balle3X, Balle3Y = 190, 100

Balle1 = Fond.create_oval(40, 90, 60, 110, fill = 'red')
Balle2 = Fond.create_oval(140, 90, 160, 110, fill = 'blue')
Balle3 = Fond.create_oval(200, 90, 260, 110, fill = 'green')

animation()

fenetre.mainloop()