Programation en pygame

SneaX -  
 bampaf -

Bonjour, je travaille sur un projet pygame, dans mon projet je controle un personnage qui quand il touche un cadeau, le cadeau disparait. J'ai aussi créer une liste avec le rectangle (hitbox) de l'image du cadeau je voudrais que quand le perso touche le cadeau celui-ci disparait de la liste et le jeux se ferme. J'ai coder ce que je veut faire tout en bas mais rien ne se passe.

#Chapitre Pygame
import pygame,sys
from pygame.locals import *
import random

#Initialisation et création de la fenêtre

pygame.init() #Appel de la méthode
fenetre=pygame.display.set_mode((630,480)) #Création de l'objet fenetre
pygame.display.set_caption("PereNoel")

#Chargement des images
fond=pygame.image.load("noel.jpg")
perenoel=pygame.image.load("perenoel.jpg")
cadeau=pygame.image.load("cadeau.jpg")
fond=pygame.transform.scale(fond, (630, 480))
perenoel=pygame.transform.scale(perenoel, (30, 30))
cadeau=pygame.transform.scale(cadeau, (30, 30))

#Création des rectangles
rect_perenoel=perenoel.get_rect()
rect_cadeau=cadeau.get_rect()

#Initialisation des positions
rect_perenoel.x=315
rect_perenoel.y=240
x=random.randint(0,630)
y=random.randint(0,480)

rect_cadeau.x=x
rect_cadeau.y=y

#Affichage des images

def affichage():
    fenetre.blit(fond,(0,0))
    fenetre.blit(perenoel,rect_perenoel)
    fenetre.blit(cadeau,rect_cadeau)
    pygame.display.update()


affichage()



#Boucle infinie: Détection des événements au clavier et action
pygame.key.set_repeat(500,30) # Permet de rester appuyer sur une touche et de continuer a avancer
while True:
    for evenement in pygame.event.get():
        if evenement.type==QUIT:
            pygame.quit()
            sys.exit()

        if evenement.type==KEYDOWN:
            if evenement.key==K_UP:
                rect_perenoel.y=rect_perenoel.y-30
                if rect_perenoel.top<0: #si le bord haut de l'image sort du cadre on remet l'image en bas
                    rect_perenoel.bottom=480
                affichage()

        if evenement.type==KEYDOWN:
            if evenement.key==K_DOWN:
                rect_perenoel.y=rect_perenoel.y+30
                if rect_perenoel.bottom>480: #si le bord bas de l'image sort du cadre on remet l'image en haut
                    rect_perenoel.top=0
                affichage()

        if evenement.type==KEYDOWN:
            if evenement.key==K_RIGHT:
                rect_perenoel.x=rect_perenoel.x+30
                if rect_perenoel.right>630: #si le bord droit de l'image sort du cadre on remet l'image à gauche
                  rect_perenoel.left=0
                affichage()

        if evenement.type==KEYDOWN:
            if evenement.key==K_LEFT:
                rect_perenoel.x=rect_perenoel.x-30
                if rect_perenoel.left<0:  #si le bord gauche de l'image sort du cadre on remet l'image à droite
                    rect_perenoel.right=630
                affichage()


        if rect_perenoel.colliderect(rect_cadeau)==True:
            rect_cadeau.x=rect_cadeau.x+1000

        listecadeau=[rect_cadeau]
        if rect_perenoel.collidelist(listecadeau)==rect_cadeau:
            listecadeau.remove(rect_cadeau)
        if listecadeau==[]:
            evenement.type==QUIT




1 réponse

  1. bampaf
     

    Bonsoir, il faut toujours ne faire qu'un update de la fenêtre, et tant qu'à faire regroupe ce qui peut l'être dans tes conditions, regarde dans ta boucle les modifications faites.

    running = True
    while running:
        for evenement in pygame.event.get():
            if evenement.type == QUIT:
                running = False
                break
    
            if evenement.type == KEYDOWN:
                if evenement.key == K_UP:
                    rect_perenoel.y -= 30
                    # si le bord haut de l'image sort du cadre on remet l'image en bas
                    if rect_perenoel.top < 0:
                        rect_perenoel.bottom = 480
                elif evenement.key == K_DOWN:
                    rect_perenoel.y += 30
                    # si le bord bas de l'image sort du cadre on remet l'image en haut
                    if rect_perenoel.bottom > 480:
                        rect_perenoel.top = 0
    
                if evenement.key == K_RIGHT:
                    rect_perenoel.x += 30
                    # si le bord droit de l'image sort du cadre on remet l'image à gauche
                    if rect_perenoel.right > 630:
                        rect_perenoel.left = 0
                elif evenement.key == K_LEFT:
                    rect_perenoel.x -= 30
                    # si le bord gauche de l'image sort du cadre on remet l'image à droite
                    if rect_perenoel.left < 0:
                        rect_perenoel.right = 630
    
            # POURQUOI DÉPLACER LE CADEAU HORS VISIBILITÉ PLUTÔT QUE DE NE
            # PLUS L'AFFICHER ?
            if rect_perenoel.colliderect(rect_cadeau):
                print('Collision !')
                rect_cadeau.x += 1000
    
            '''
            # POURQUOI CETTE LISTE ? POUR ENSUITE LA VIDER
            listecadeau = [rect_cadeau]
            if rect_perenoel.collidelist(listecadeau) == rect_cadeau:
                listecadeau.remove(rect_cadeau)
            if listecadeau == []:
                evenement.type == QUIT # CELA N'A PAS DE SENS DE DÉFINIR CETTE VARIABLE
            '''
            affichage()

    Tu devrais aussi regarder du côté des sprites pygame qi permet de grouper image et rect, il n'y a pas besoin de maîtriser le modèle objet pour s'en servir.

    Normalement ta collision devrait être détectée.

    0