Programation en pygame

Fermé
SneaX - 29 déc. 2022 à 16:07
 bampaf - 29 déc. 2022 à 18:38

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

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