Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Problème Collision URGENT

2 réponses
Avatar
DiiKenZ
Bonjour, je suis très pressé car j'ai bientôt mon projet à rendre pour le bac. Et donc le prblème est que quoi qu'il arrive, quand mon oiseau passe le 1er obstacle le jeu s'arrête, je ne sais pas du coup comment gérer ma collision. J'ai besoin d'aide, merci.

Le code :

import random
import pygame
from pygame.locals import *

posx= 100 #
posy = 0; # # VARIABLES GENERALES
vitesse = 0; #
gravite = 0.5; #
saut=0 #


def nuage(x,y):
pygame.draw.circle(fenetre,(255,255,255),(x,y),30)
pygame.draw.circle(fenetre,(255,255,255),(x-20,y),20)
pygame.draw.circle(fenetre,(255,255,255),(x+20,y),20)
pygame.draw.circle(fenetre,(255,255,255),(x,y-15),20)
pygame.draw.circle(fenetre,(255,255,255),(x,y+15),20)

def nuages():
nuage(60,40)
nuage(180,100)
nuage(320,60)
nuage(450,120)
nuage(570,40)
nuage(100,240)
nuage(240,270)
nuage(400,220)
nuage(550,250)
nuage(60,380)
nuage(220,390)
nuage(380,360)
nuage(550,400)

liste_obstacle=[]

pygame.init() #lancer pygame

try:
fenetre=pygame.display.set_mode((640,480)) #descripteur de la fenetre
pygame.display.set_caption("Flappy Bird") #titre dans la barre sup

fond = pygame.Surface((640,480)).convert() #cree des pixels dans la surface
fond.fill((114, 177, 228)) #colorie les pixels

#chargement des différentes images -> descripteur
image_rect=pygame.image.load("rectangle.jpg").convert()

Clock = pygame.time.Clock()
rectangle1=image_rect.get_rect() #On crée un rectangle à partir de l'image
rectangle2=image_rect.get_rect() #On crée un rectangle à partir de l'image Clock = pygame.time.Clock()
rectangle1.left=640#abscisse du rectangle du haut
rectangle2.left=640#abscisse du rectangle du haut

timer=0#variable
timer2=0
limite=100#limite du timer


oiseau1=pygame.image.load("oiseau1.png").convert_alpha() # charge l'une des images de l'oiseau
oiseau1 = pygame.transform.scale(oiseau1,(100,100)) # transforme l'image pour avoir une image de 100 x 100 pixels
oiseau2=pygame.image.load("oiseau2.png").convert_alpha() # charge l'une des images de l'oiseau
oiseau2 = pygame.transform.scale(oiseau2,(100,100)) # transforme l'image pour avoir une image de 100 x 100 pixels
oiseau3=pygame.image.load("oiseau3.png").convert_alpha() # charge l'une des images de l'oiseau
oiseau3 = pygame.transform.scale(oiseau3,(100,100)) # transforme l'image pour avoir une image de 100 x 100 pixels
oiseau4=pygame.image.load("oiseau4.png").convert_alpha() # charge l'une des images de l'oiseau
oiseau4 = pygame.transform.scale(oiseau4,(100,100)) # transforme l'image pour avoir une image de 100 x 100 pixels
oiseau = [oiseau1,oiseau2,oiseau3,oiseau4] # la liste oiseau qui contient toutes les images de ce dernier

oiseauanimation =1

continuer =-1
z=60
while continuer==-1:
#pygame.mixer.music.load("son2.wav") # charge un son
#pygame.mixer.music.play(-1,0.0) # joue la musiaue
fenetre.fill((0,0,0))
acc=pygame.image.load("acc.jpg") # image d'accueil
acc = pygame.transform.scale(acc,(640,480)) # l'image fait la taille de la fenetre
fenetre.blit(acc,(0,0)) # colle l'image sur la fenetre
police = pygame.font.Font(None ,30) # la police d'écriture, le type de police et la taille des caractères
texte = police.render("Pour jouer, appuyez sur c comme commencer", True, (0,0,0)) # le texte avec la couleur
fenetre.blit(texte, [80, 230]) # position du texte
for event in pygame.event.get():
if event.type == QUIT:
continuer=0 # on quitte le jeu
if event.type == KEYUP:
if event.key == K_c: # si on appuie sur "c"
continuer=1 # on commence le jeu
for event in pygame.event.get():
if event.type == QUIT:
continuer=0
pygame.display.flip() #
Clock.tick(20) # l'image est rafrachit 20 fois par secondes


while continuer : #boucle principale
for event in pygame.event.get():
if event.type == QUIT: # si on clique sur la croix
continuer=0 # on quitte le jeu
elif event.type == KEYDOWN: # si on appuie sur
if event.key == K_ESCAPE: # la barre espace
continuer=0 # on quitte le jeu
if event.type == pygame.KEYDOWN: # si on appuie sur
if event.key == pygame.K_UP: # la touche fleche du haut
saut = -10 # saut prend la valeur -10 = (vol)

if event.type == pygame.KEYUP: # si on lache
if event.key == pygame.K_UP: # la touche fleche du haut
saut = 12 # saut prend la valeur 12 = (gravite)

Clock.tick(60)
posy += saut # la position varie en fonction de la variable saut (saut + gravite)
fenetre.blit(fond, (0,0))#on blitte le fond
nuages()
timer=timer+1#incrementation
timer2=timer2+2
z=z+0.2

fenetre.blit(oiseau[oiseauanimation-1],(posx,posy)) # affiche la première des 4 images de l'oiseau : ce dernier a comme position posx pour
rect_bird=oiseau[oiseauanimation-1].get_rect() # l'abscisse et posy pour l'ordonée

if (oiseauanimation == 4): # si on arrive a la derniere image
oiseauanimation=1 # on remet la premiere image (boucle)

else:
oiseauanimation+=1; # a chaque fois, l'image change

if timer2>timer:
Clock.tick(z)

if timer>=limite:#si le temps limite est atteint
timer=0#timer recommence
limite=150+random.randint(0,150)#limite du timer aléatoire
milieu=150+random.randint(0,100)#milieu de l'espace entre les 2 rectangles
rectangle1.bottom=milieu-72#definit le bas du rectangle du haut
rectangle2.top=milieu+71 #ordonne du rectangle du haut+espace entre les 2 rect
new_obstacles=[rectangle1,rectangle2]#liste contenant les obstacles
liste_obstacle.append(new_obstacles)#ajoute un nouvel obstacle

for obstacle in liste_obstacle:
fenetre.blit(image_rect,obstacle[0])#pose image dans rectangle
fenetre.blit(image_rect,obstacle[1])#pose image dans rectangle
obstacle[0] = obstacle[0].move(-1,0)#decremente l'abscisse de 1
obstacle[1] = obstacle[1].move(-1,0)#decremente l'abscisse de 1
#si oiseau dans un obstacle, on arrete la boucle
if rect_bird.colliderect(obstacle[0]) or rect_bird.colliderect(obstacle[1]):
continuer=0

pygame.display.flip() #rafraichit l'écran

finally:
pygame.quit()

2 réponses

Avatar
Laurent Pointal
DiiKenZ wrote:

Bonjour, je suis très pressé car j'ai bientôt mon projet à rendre


pour le
bac. Et donc le prblème est que quoi qu'il arrive, quand mon


oiseau passe
le 1er obstacle le jeu s'arrête, je ne sais pas du coup comment


gérer ma
collision. J'ai besoin d'aide, merci.



C'est logique, lorsque tu détectes une collision tu mets ton
continuer à 0, donc tu sorts de la boucle while continuer et ton jeu
s'arrête (que veux-tu faire lorsqu'il y a une collision ???).

Sinon, d'une façon plus générale: réduit ton code à ce qui pose
problème et ne pose que celui-là (typiquement, j'ai dû me faire des
copies d'écran avec n'importe quoi pour avoir des fichiers images,
rien que pour tester…).

Évites le 'URGENT' en majuscules, les gens qui passent par ici
répondent de leur bonne volonté et sur leur temps, ton urgence n'est
pas la leur.



Des trucs:
Utilise des valeurs de 0 à 3 pour oiseauanimation (correspondant aux
index), et un modulo 4 pour gérer le rebouclage:
oiseauanimation = (oiseauanimation + 1) % 4

Dans nuages(), une boucle sur une liste de tuples serait plus
propre:
for pos in [(60,40), (180,100),…(550,400)]:
nuage(pos[0], pos[1])

Place le code de chargement des ressources dans une fonction
séparée, et le code principal dans une fonction séparée aussi (jeu()
ou main()…). Tes globales devraient pouvoir devenir des locales dans
la fonction principale.

Pour le chargement des fichiers "oiseau", une boucle de 4 itérations
sera plus propre.

Sinon, pour du code en lycée, bravo.

A+

PS. Si tu lis l'anglais (il doit y avoir aussi une traduction fr qui
traîne quelque part):
http://www.catb.org/esr/faqs/smart-questions.html
Avatar
Damien Wyart
PS. Si tu lis l'anglais (il doit y avoir aussi une traduction fr qui
traîne quelque part):
http://www.catb.org/esr/faqs/smart-questions.html



J'en ai trouvé une ici : http://www.gnurou.org/writing/smartquestionsfr

--
DW