TP pygame – Rebondir avec Mario

Première prise en main

  1. Comprendre ce code.
  2. Le modifier pour que ça « rebondisse » sur tous les murs.
import pygame
from pygame.locals import *
pygame.init()

fenetre=pygame.display.set_mode((640, 480))
pygame.display.set_caption("Une balle ?")

clock = pygame.time.Clock()

continuer=True

# un rectangle que nous déplacerons ...
hitbox = pygame.Rect(80, 120, 40, 40)
# ... à l'aide de ce vecteur
vecteur = [10, 10]

while continuer :
    # déplcement du rectangle
    hitbox.move_ip(vecteur)

    # collision avec un mur ?
    if hitbox.right > 640:
        vecteur[0] *= -1
    if hitbox.bottom > 480:
        vecteur[1] *= -1

    # le fond
    fenetre.fill((0, 160, 160))

    # dessiner le cercle
    x, y = hitbox.centerx, hitbox.centery
    pygame.draw.circle(fenetre, (255, 255, 255), (x, y), 20, 1)

    #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

        elif event.type==MOUSEBUTTONUP : # clic de souris
            hitbox.centerx, hitbox.centery = event.pos

pygame.quit()

On ramène Mario

mario_left

  1. Placer Mario sur la fenêtre,
  2. créer un rectangle « virtuel » ou « hitbox » de la taille de Mario, et placer Mario dedans,
  3. déplacer ce rectangle au clavier,
  4. faire que en sorte que la balle « rebondisse » sur Mario.

Notes de Léa (merci) :

cm 2020-04-02 ISN notes de Léa 0 TP Mario

Le code proposé en cours :

import pygame
from pygame.locals import *
pygame.init()
 
fenetre=pygame.display.set_mode((640, 480))
pygame.display.set_caption("Une balle ?")
 
clock = pygame.time.Clock()
 
continuer=True
 
# un rectangle que nous déplacerons ...
hitbox = pygame.Rect(80, 120, 40, 40)
# ... à l'aide de ce vecteur
vecteur = [10, 10]

imageG = pygame.image.load("mario_left.png").convert_alpha()
imageD = pygame.transform.flip(imageG, True, False)
joueurRect = imageG.get_rect() # rectangle de même taille que l'image
joueurRect.centerx = 400
joueurRect.centery = 300
position = "gauche"

while continuer :
    # déplcement du rectangle
    hitbox.move_ip(vecteur)
 
    # collision avec un mur ?
    if hitbox.right > 640 or hitbox.left < 0:
        vecteur[0] *= -1
    if hitbox.bottom > 480 or hitbox.top < 0:
        vecteur[1] *= -1

    if joueurRect.right < 0:
        joueurRect.left = 640
    elif joueurRect.left > 640:
        joueurRect.right = 0
    if joueurRect.bottom < 0:
        joueurRect.top = 480
    elif joueurRect.top > 480:
        joueurRect.bottom = 0
    
    if joueurRect.colliderect(hitbox):
        vecteur[0] *= -1
        vecteur[1] *= -1
 
    # le fond
    fenetre.fill((0, 160, 160))

    if position == "gauche":
        fenetre.blit(imageG, joueurRect)
    else :
        fenetre.blit(imageD, joueurRect)
 
    # dessiner le cercle
    x, y = hitbox.centerx, hitbox.centery
    pygame.draw.circle(fenetre, (255, 255, 255), (x, y), 20, 1)
 
    #mettre à jour l'affichage
    pygame.display.flip()    
 
    #25 images par seconde
    clock.tick(25)
 
    #gestion des événements non clavier
    for event in pygame.event.get():
 
        if event.type==QUIT: #la croix en haut à gauche
            continuer=False
 
        elif event.type==MOUSEBUTTONUP : # clic de souris
            hitbox.centerx, hitbox.centery = event.pos

    # touches pressées dans une liste
    tkey = pygame.key.get_pressed()
    
    if tkey[K_UP]:
        joueurRect.move_ip(0, -5)
    if tkey[K_DOWN]:
        joueurRect.move_ip(0, 5)
    if tkey[K_LEFT]:
        joueurRect.move_ip(-5, 0)
        position = "gauche"
    if tkey[K_RIGHT]:
        joueurRect.move_ip(5, 0)
        position = "droite"
    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.