Utiliser les coins dans un « casse-briques »

On profite de cette séance en présentiel ISN avec deux sbires du projet « casse-briques » de terminale pour coder ça.

2020-06-14 16-23-49

Bastien et Nico H. de première NSI apprécieront !

Quelques correctifs (même s’il reste des bugs) et le réglage de la taille de la balle depuis !

import pygame
from pygame.locals import *
pygame.init()
from math import sqrt, atan
from random import randint

def distance(x1, y1, x2, y2):
    return sqrt((x2 - x1) ** 2 + (y2 - y1) ** 2)

 
fenetre=pygame.display.set_mode((800, 600))
pygame.display.set_caption("Une balle ?")
 
clock = pygame.time.Clock()
 
continuer = True
collision_detectee = False

r = 60

# un rectangle que nous déplacerons ...
hitbox = pygame.Rect(randint(r+1, 800-r-1), 1, 2 * r, 2 * r) # pour la balle

planche = pygame.Rect(300, 540, 200, 100)
# ... à l'aide de ce vecteur
vecteur = [5, 8]
 
while continuer :
    # déplacement du rectangle
    hitbox.move_ip(vecteur)
 
    # collision avec un mur ?
    if hitbox.right > 800:
        hitbox.right = 799
        vecteur[0] *= -1
    if hitbox.left <0:
        hitbox.left = 0
        vecteur[0] *= -1    
    if hitbox.bottom > 600:
        hitbox = pygame.Rect(randint(r+1, 800-r-1), 1, 2 * r, 2 * r)

    elif hitbox.top < 0:
        hitbox.top = 0
        vecteur[1] *= -1

    #collision balle planche
    
    coin_gauche = pygame.Rect(planche.left, 540, r // 2, r // 2)
    sous_le_coin_gauche = pygame.Rect(planche.left, 540 + r // 2, r // 2, 70)
    coin_droit = pygame.Rect(planche.right - r //2 , 540, r // 2, r // 2)
    sous_le_coin_droit = pygame.Rect(planche.right - r // 2, 540 + r // 2 , r // 2, 70)
    if hitbox.colliderect(sous_le_coin_gauche):
        vecteur[0] *= -1
        collision_detectee = True
        hitbox.right = planche.left
    elif hitbox.colliderect(coin_gauche) and vecteur[0] > 0:
        if distance(hitbox.centerx, hitbox.centery, planche.left, 540) < r :
            if not collision_detectee:
                norme = sqrt(vecteur[0] ** 2 + vecteur[1] ** 2)
                delta_x = abs(coin_gauche.left - hitbox.centerx)
                delta_y = abs(540 - hitbox.centery)
                norme_2 = sqrt(delta_x ** 2 + delta_y ** 2)
                vecteur[0] = - int(delta_y * norme / norme_2) - 1
                vecteur[1] = - int(delta_x * norme / norme_2) - 1
                collision_detectee = True
                #hitbox.bottom = planche.top
                #hitbox.right = planche.left
    elif hitbox.colliderect(sous_le_coin_droit):
        vecteur[0] *= -1
        collision_detectee = True
        hitbox.left = planche.right
    elif hitbox.colliderect(coin_droit) and vecteur[0] < 0:
        if distance(hitbox.centerx, hitbox.centery, planche.right, 540) < r :
            if not collision_detectee:
                norme = sqrt(vecteur[0] ** 2 + vecteur[1] ** 2)
                delta_x = abs(hitbox.centerx - coin_droit.right)
                delta_y = abs(540 - hitbox.centery)
                norme_2 = sqrt(delta_x ** 2 + delta_y ** 2)
                vecteur[0] = int(delta_y * norme / norme_2) + 1
                vecteur[1] = - int(delta_x * norme / norme_2) - 1
                collision_detectee = True
                #hitbox.bottom = planche.top
                #hitbox.left = planche.right
    elif planche.colliderect(hitbox):
        if not collision_detectee:
            vecteur[1] *= -1
            collision_detectee = True
            hitbox.bottom = planche.top
    if not planche.colliderect(hitbox):
        collision_detectee = False
    # le fond
    fenetre.fill((0, 160, 160))
 
    # dessiner le cercle et la planche
    x, y = hitbox.centerx, hitbox.centery
    pygame.draw.circle(fenetre, (255, 255, 255), (x, y), r, 4)
    pygame.draw.rect(fenetre,(255, 0, 255), planche, 0)
    pygame.draw.rect(fenetre,(255, 255, 0), coin_gauche, 2)
    pygame.draw.rect(fenetre,(0, 255, 255), sous_le_coin_gauche, 2)
    pygame.draw.rect(fenetre,(255, 255, 0), coin_droit, 2)
    pygame.draw.rect(fenetre,(0, 255, 255), sous_le_coin_droit, 2)
    
    #mettre à jour l'affichage
    pygame.display.flip()    
 
    #30 images par seconde
    clock.tick(30)
 
    #gestion des événements
    for event in pygame.event.get():
 
        if event.type==QUIT: #la croix en haut à gauche
            continuer=False
    # touches pressées dans une liste
    tkey = pygame.key.get_pressed()
     
    if tkey[K_UP]:
        r += 5
        if r > 100 : r = 100
        hitbox = pygame.Rect(hitbox.centerx -r, hitbox.centery -r, 2*r, 2*r)
    if tkey[K_DOWN]:
        r -= 5
        if r < 5 : r = 5
        hitbox = pygame.Rect(hitbox.centerx -r, hitbox.centery -r, 2*r, 2*r)
    if tkey[K_LEFT]:
        planche.move_ip(-5, 0)
    if tkey[K_RIGHT]:
        planche.move_ip(5, 0)
    if tkey[K_ESCAPE]:
        continuer = False
 
 
pygame.quit()

N'hésitez-pas à poser une question, ou faire avancer le schmilblick

Entrez vos coordonnées ci-dessous ou cliquez sur une icône pour vous connecter:

Logo WordPress.com

Vous commentez à l’aide de votre compte WordPress.com. Déconnexion /  Changer )

Photo Google

Vous commentez à l’aide de votre compte Google. Déconnexion /  Changer )

Image Twitter

Vous commentez à l’aide de votre compte Twitter. Déconnexion /  Changer )

Photo Facebook

Vous commentez à l’aide de votre compte Facebook. Déconnexion /  Changer )

Connexion à %s

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur la façon dont les données de vos commentaires sont traitées.